【问题标题】:Can not issue data manipulation statements with executeQuery() [duplicate]无法使用 executeQuery() 发出数据操作语句 [重复]
【发布时间】: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?

【问题讨论】:

    标签: java mysql sql database jdbc


    【解决方案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.html
    http://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()

        【讨论】:

        • 解决了我的问题,非常感谢!!!!
        猜你喜欢
        • 2013-12-07
        • 2013-10-05
        • 2010-12-26
        • 2015-01-01
        • 2020-07-22
        • 1970-01-01
        相关资源
        最近更新 更多