Невозможно выполнить операции манипуляции данными с помощью executeQuery()

Я использую com.mysql.jdbc.Driver

Мне нужно вставить и получить идентификатор. Мой запрос:

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

ошибка -

Невозможно выполнить обработку данных с помощью executeQuery()

Как вставить и получить идентификатор?

Ответы

Ответ 1

    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 {

    }

Ответ 2

Вам нужно будет использовать метод executeUpdate() для выполнения инструкции INSERT, в то время как вам нужно использовать метод executeQuery() для выполнения инструкции SELECT. Это связано с требованиями, предъявляемыми спецификацией JDBC в отношении их использования:

В документации по API Java для Statement.executeQuery():

Выполняет данный оператор SQL, который возвращает один ResultSet объект.

Параметры:

sql - оператор SQL, который должен быть отправлен в базу данных, обычно статический оператор SELECT

и из документации API Java для Statement.executeUpdate():

Выполняет данный оператор SQL, который может быть оператором INSERT, UPDATE или DELETE или оператором SQL, который ничего не возвращает, например, SQL DDL.

Параметры:

sql - оператор SQL Data Manipulation Language (DML), такой как INSERT, UPDATE или DELETE; или SQL-оператор, который ничего не возвращает, например, оператор DDL.

Ваш код (псевдокод, размещенный здесь) должен выглядеть следующим образом:

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

И, конечно, в документации MySQL показано, как выполнять ту же операцию для столбцов AUTO_INCREMENT, которая, по-видимому, вам нужна.

Если вам нужно выполнить оба из них вместе в одной и той же транзакции, отправив инструкции в одну строку, разделив их на двоеточие, как показано ниже:

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

то вам нужно будет использовать метод execute(). Обратите внимание, что это зависит от поддержки, предлагаемой базой данных и драйвером JDBC для пакетных операторов вместе в одном execute(). Это поддерживается в Sybase и MSSQL Server, но я не думаю, что он поддерживается в MySQL.

Ответ 3

Возможно, вы используете executeQuery(), но для управления данными, которые вам действительно нужны executeUpdate(), а не executeQuery()

Ответ 4

Для неотображаемых операторов SQL вы используете ExecuteNonQuery();

Чтобы получить последний вставленный id, вы можете сделать этот оператор SQL.

SELECT LAST_INSERT_ID() AS last_id

Хотя, вероятно, для этого оператора select существует Java-оболочка.

Ссылки:
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