2012-10-29 41 views
0

我認爲這個問題總結得不錯,這是我的代碼,但它沒有給我所需的結果。我想返回一個int數組,其中包含爲該批次中創建的每一行生成的自動遞增ID。如何知道使用JDBC爲批量更新創建的自動增量值?

CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)"); 

    public static int[] createAppointment(Appointment... appointments) { 
    int[] ids = new int[appointments.length]; 
    int count = 0; 
    try { 
     for (Appointment a : appointments) { 
      CREATE_APPOINTMENT.setDate(2, a.date); 
      CREATE_APPOINTMENT.setTime(3, a.time); 
      CREATE_APPOINTMENT.setInt(4, a.duration); 
      CREATE_APPOINTMENT.setString(5, a.clientName); 
      CREATE_APPOINTMENT.addBatch(); 
     } 
     CREATE_APPOINTMENT.executeBatch(); 

     ResultSet resultSet = CREATE_APPOINTMENT.getGeneratedKeys(); 
     if (resultSet != null) 
      while (resultSet.next()) { 
       ids[count++] = resultSet.getInt(1); 
      } 

    } catch (SQLException ex) { 
     System.err.println(ex); 
    } 
    return ids; 
} 

我試圖創建根據數據庫8個約會和他們的ID是成功創建,但我返回數組只包含最後一個ID,其餘均爲零。我在哪裏錯過了什麼?

回答

1

其實這是不可能的。 stmt.getGeneratedKeys()將總是返回只有一個值,因爲這種方法在源碼-JDBC驅動被實現:

 

    ResultSet getGeneratedKeys() throws SQLException { 
      if (getGeneratedKeys == null) 
       getGeneratedKeys = conn.prepareStatement("select last_insert_rowid();"); 
      return getGeneratedKeys.executeQuery(); 
     } 

你的陣列與零個值進行初始化,然後將最後生成的ID被分配到數組的第一個元素。

0

好了,JDBC Specification 13.6節:檢索自動生成的值提供了有關如何做到這一點的信息:

String keyColumn[] = {"ORDER_ID"}; 
... 
Statement stmt = conn.createStatement(); 
int rows = stmt.executeUpdate("INSERT INTO ORDERS " + 
"(ISBN, CUSTOMERID) " + 
"VALUES (966431502, ’BILLG’)", 
keyColumn); 
ResultSet rs = stmt.getGeneratedKeys(); 

兩段這個例子後的規範說:

它的定義與實現至於getGeneratedKeys是否會在調用executeBatch方法後返回生成的值。

所以,我想你可以測試你的驅動程序,看看它是否支持它。

+0

如果沒有,您可以隨時執行查詢'SELECT last_insert_rowid()'。 –

+0

@CL不會返回最後一次插入的行ID嗎?我認爲這個問題是關於批量插入的。另外,即使在單一插入場景中,我認爲它只在隔離級別保證你只能看到你自己的最後一個插入時才起作用。 –

+0

是的,使用批處理時,您需要JDBC驅動程序中的支持。 –

1

嘗試改變準備這樣的語句:

CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); 
+0

可悲的是沒有改變任何東西。 – rtheunissen

+0

是的,請參閱下面的解釋。 – vnd