2013-02-07 115 views
1

我有一個表,其中有一列被定義爲自動生成密鑰。當執行下面的代碼時,我期望生成一個新的密鑰,但事實並非如此。插入一行,但ps.getGeneratedKeys()的ResultSet爲空。爲什麼getGeneratedKeys()在INSERT之後不返回任何結果?

我正在使用DB2:SQLLIB_ADCL_V97FP1。

 conn = getConnection(); 
     conn.setAutoCommit(false); 
     String query = 
      "INSERT INTO MyTable " + 
      " (messe_nr, land5, variable_nr, bezeichnung_en, bezeichnung_de) " + 
      "VALUES (?,?,?,?,?)"; 

     PreparedStatement ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
     ps.setInt(1, fair.getFairId()); 
     ps.setString(2, variable.getCountryCode()); 
     ps.setInt(3, variable.getSort()); 
     ps.setString(4, variable.getLabel_en()); 
     ps.setString(5, variable.getLabel_de()); 

     log.debug(query); 
     int count = ps.executeUpdate(); 
     if(count == 1) { 
      ResultSet rs = ps.getGeneratedKeys(); 
      if(rs.next()) { 
       variable.setId(rs.getBigDecimal(1).intValue()); 
      } else { 
       log.error("Could not get autogen key after variable insert"); 
       throw new AVMSException(1500); 
      } 
      rs.close(); 
     } 
     log.debug("inserted " + count); 

     ps.close(); 
     conn.commit(); 

UPDATE

我剛纔部署的項目,以測試服務器,並不會出現問題。我的開發系統上有些東西壞了 - 但是什麼?我確實在一兩天後安裝了Java更新 - 1.7.0_13 - 會導致這樣的問題: - /?

+0

你能分享'CREATE'語句'MyTable' – Bulat

+1

@Bulat - 我沒有直接訪問** ** CREATE 。我與確認「VARIABLE_ID」是自動生成密鑰的管理員進行了覈對。 – paul

+0

您可以檢查實際生成的值嗎?另外我認爲你可以將字段的名稱傳遞給getGeneratedKeys()並檢查在這種情況下會發生什麼。 – Bulat

回答

2

試試這個,這是爲我工作:

prepStmt = con.prepareStatement(sql, new String[]{"YOUR_ID_FIELD"}); 

//Setting Bind-Variables 

prepStmt.executeUpdate(); 

     rs = prepStmt.getGeneratedKeys(); 
     while (rs.next() == true) 
     { 
      tAdresse.getAdressid().setValue(rs.getInt(1)); 
      System.out.println("Key: " + tAdresse.getAdressid().getIntValue()); 
     } 
+0

謝謝!希望我早點注意到你的帖子。剛剛找到相同的解決方案,它也適用於我。 – paul

相關問題