0

質問はそれを十分に要約していると思います。これが現時点での私のコードですが、必要な結果が得られません。そのバッチで作成された各行の生成された自動インクリメント ID を含む int 配列を返したいです。

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 ドライバーのこのメソッドが次のように実装されているため、常に 1 つの値のみを返します。

    ResultSet getGeneratedKeys() が SQLException {
            if (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();

この例の後の 2 つの段落で、仕様には次のように記載されています。

getGeneratedKeys が executeBatch メソッドの呼び出し後に生成された値を返すかどうかは、実装によって定義されます。

したがって、ドライバーをテストして、それがサポートされているかどうかを確認できると思います。

于 2012-10-29T13:40:35.317 に答える