Невозможно выполнить операции манипуляции данными с помощью 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