无法使用 executeQuery() 发出数据操作语句 [重复]
Posted
技术标签:
【中文标题】无法使用 executeQuery() 发出数据操作语句 [重复]【英文标题】:Can not issue data manipulation statements with executeQuery() [duplicate] 【发布时间】:2011-09-21 05:30:06 【问题描述】:我用com.mysql.jdbc.Driver
我需要插入并获取 ID。 我的查询:
INSERT INTO Sessions(id_user) VALUES(1);
SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;
错误 -
无法发出数据操作 带有 executeQuery() 的语句
如何插入和获取id?
【问题讨论】:
【参考方案1】:对于非选择 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.htmlhttp://wiki.bibalex.org/JavaDoc/org/bibalex/daf/handlers/dbhandler/DBConnection.html
【讨论】:
【参考方案2】:您需要使用 executeUpdate() 方法来执行 INSERT 语句,而您需要使用 executeQuery() 方法来执行 SELECT 语句。这是由于 JDBC 规范对其使用提出的要求:
来自Statement.executeQuery() 的 Java API 文档:
执行给定的 SQL 语句,返回单个 ResultSet 对象。
参数:
sql - 要发送到数据库的 SQL 语句,通常是 静态 SQL SELECT 语句
以及来自Statement.executeUpdate() 的 Java API 文档:
执行给定的 SQL 语句,可能是 INSERT、UPDATE 或 DELETE 语句或不返回任何内容的 SQL 语句,例如 SQL DDL 语句。
参数:
sql - SQL 数据操作语言 (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 documentation demonstrates how to perform the same activity for AUTO_INCREMENT columns,这显然是您需要的。
如果您需要在同一个事务中同时执行这两个语句,请在一个字符串中提交语句,并用分号分隔它们,如下所示:
statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;");
那么你需要使用 execute() 方法。请注意,这取决于数据库和 JDBC 驱动程序对在单个 execute() 中批处理语句提供的支持。这在 Sybase 和 MSSQL Server 中受支持,但我认为它在 MySQL 中不受支持。
【讨论】:
在 MySQL 中,您可以通过在开始时执行execute("start transaction")
来执行事务,当所有操作都完成时 execute("commit")
提交或 execute("rollback")
取消。这将覆盖您可能对连接进行的任何autocommit
设置。 仅适用于支持事务的引擎,例如InnoDB
@Johan,是的,没错。我不确定使用 JDBC 是否可以使用 Connection.setAutoCommit(false);
,因此我省略了这一点。此外,问题显然出在executeQuery
和executeUpdate
的使用上。【参考方案3】:
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】:可能您正在使用 executeQuery(),但要操作数据,您实际上需要 executeUpdate() 而不是 executeQuery()
【讨论】:
解决了我的问题,非常感谢!!!!以上是关于无法使用 executeQuery() 发出数据操作语句 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 executeQuery() 发出数据操作语句 [重复]
java.sql.SQLException:无法使用 executeQuery() 发出数据操作语句。 23
无法使用 executeQuery() 发出数据操作语句 [重复]
SQLException:“无法使用 executeQuery() 发出数据操作语句”[重复]
无法从 Statement.executeQuery() 中获取选定的列
Can not issue data manipulation statements with executeQuery() 异常处理