簡體   English   中英

如何知道使用JDBC為批量更新創建了哪些自動增量值?

[英]How can I know what auto-increment values were created for a batch update using JDBC?

我認為這個問題總結得很好,這是我目前的代碼,但它沒有給我所需的結果。 我想返回一個int數組,其中包含為該批處理中創建的每一行生成的自動增量ID。

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,其余為零。 我在哪里錯過了什么?

嘗試更改這樣的准備語句:

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

實際上這是不可能的。 stmt.getGeneratedKeys()將始終只返回一個值,因為sqlite-jdbc驅動程序中的此方法實現如下:

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

您的數組初始化為零值,然后將最后生成的ID分配給數組的第一個元素。

那么, JDBC規范部分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方法后返回生成的值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM