0

我认为这个问题总结得很好,这是我目前的代码,但它没有给我所需的结果。我想返回一个 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,其余的都是零。我在哪里错过了什么?

4

3 回答 3

1

尝试像这样更改准备语句:

CREATE_APPOINTMENT = database.prepareStatement("INSERT INTO " + TABLE_APPOINTMENTS + " VALUES (?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
于 2012-10-29T13:47:32.020 回答
1

实际上这是不可能的。stmt.getGeneratedKeys()将始终只返回一个值,因为 sqlite-jdbc 驱动程序中的此方法是这样实现的:

    结果集 getGeneratedKeys() 抛出 SQLException {
            如果(getGeneratedKeys == null)
                getGeneratedKeys = conn.prepareStatement("select last_insert_rowid();");
            返回 getGeneratedKeys.executeQuery();
        }

您的数组用零值初始化,然后将最后生成的 id 分配给数组的第一个元素。

于 2012-10-29T19:05:54.953 回答
0

好吧,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();

在这个例子之后的两段,规范说:

调用 executeBatch 方法后 getGeneratedKeys 是否返回生成的值是实现定义的。

所以,我想你可以测试你的驱动程序,看看它是否支持它。

于 2012-10-29T13:40:35.317 回答