无法使用 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);,因此我省略了这一点。此外,问题显然出在executeQueryexecuteUpdate 的使用上。【参考方案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() 异常处理