web-dev-qa-db-ja.com

executeQuery()ではデータ操作ステートメントを発行できません

私が使う com.mysql.jdbc.Driver

挿入してIDを取得する必要があります。私のクエリ:

INSERT INTO Sessions(id_user) VALUES(1);
SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;

エラー-

ExecuteQuery()ではデータ操作ステートメントを発行できません

どのようにIDを挿入して取得しますか?

18
Mediator
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet generatedKeys = null;

    try {
        connection = m_Connection;
        preparedStatement = (PreparedStatement) connection.prepareStatement(qString, Statement.RETURN_GENERATED_KEYS);

        // ...

        int affectedRows = preparedStatement.executeUpdate();
        if (affectedRows == 0) {
            throw new SQLException("Creating user failed, no rows affected.");
        }

        generatedKeys = preparedStatement.getGeneratedKeys();
        int id = -1;
        if (generatedKeys.next()) {
            id = generatedKeys.getInt(1);
            id = -1;
        } else {
            throw new SQLException("Creating user failed, no generated key obtained.");
        }
    } finally {

    }
4
Mediator

INSERTステートメントを実行するには、executeUpdate()メソッドを使用する必要がありますが、SELECTステートメントを実行するには、executeQuery()メソッドを使用する必要があります。これは、JDBC仕様によってその使用法に課せられた要件によるものです。

Java API documentation for Statement.executeQuery() から:

指定されたSQLステートメントを実行し、単一のResultSetオブジェクトを返します。

パラメーター:

sql-データベースに送信されるSQLステートメント、通常は静的SQL SELECTステートメント

Java Statement.executeUpdate() のAPIドキュメント):

INSERT、UPDATE、またはDELETEステートメント、またはSQL DDLステートメントなど、何も返さないSQLステートメントである可能性がある、指定されたSQLステートメントを実行します。

パラメーター:

sql-SQLデータ操作言語(DML)ステートメント(INSERT、UPDATE、DELETEなど)。またはDDLステートメントなど、何も返さないSQLステートメント

コード(ここに掲載されている疑似コード)は次のように表示されます。

statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation
statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation

そしてもちろん、 MySQLドキュメントは、明らかに必要なAUTO_INCREMENTカラム に対して同じアクティビティを実行する方法を示しています。

同じトランザクションで両方を一緒に実行する必要がある場合は、次のようにステートメントをセミコロンで区切って1つの文字列でステートメントを送信します。

statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;");

次に、execute()メソッドを使用する必要があります。これは、単一のexecute()でステートメントを一緒にバッチ処理するためのデータベースおよびJDBCドライバーによって提供されるサポートに依存することに注意してください。これはSybaseとMSSQLサーバーでサポートされていますが、MySQLではサポートされていないと思います。

20
Vineet Reynolds

executeQuery()を使用している可能性がありますが、データを操作するには、executeQuery()ではなく、executeUpdate()が実際に必要です。

7
Viraj Nalawade

非選択SQLステートメントの場合は、ExecuteNonQuery();を使用します

最後に挿入されたIDを取得するには、次のSQLステートメントを実行できます。

SELECT LAST_INSERT_ID() AS last_id

おそらくJavaそのselect文のラッパーがありますが。

リンク:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
http://wiki.bibalex.org/JavaDoc/org/bibalex/daf/handlers/dbhandler/DBConnection.html

1
Johan