【问题标题】:SQL exception, Generated keys not requestedSQL 异常,未请求生成的密钥
【发布时间】:2014-08-26 14:34:52
【问题描述】:

这个异常发生在我的代码中提到的部分:

    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

String query = "Insert into ...";
try {
        con = DriverManager.getConnection(...);
        ps = con.prepareStatement(query, java.sql.Statement.RETURN_GENERATED_KEYS);
        ps.executeUpdate(query);
        rs = ps.getGeneratedKeys();  // Exception is here
    }

    while (resultset.next()) {
        id = String.valueOf(resultset.getInt(1));
    }

例外:

未请求生成的密钥。您需要将 Statement.RETURN_GENERATED_KEYS 指定给 Statement.executeUpdate() 或 Connection.prepareStatement()

我的目的是插入一条新记录并将第一个字段(id)(即auto_increment)保存到变量id

【问题讨论】:

  • @a_horse_with_no_name 我用mysql
  • @a_horse_with_no_name 查看更新。
  • 第二个示例不包含prepareStatement() 调用的java.sql.Statement.RETURN_GENERATED_KEYS 参数
  • @a_horse_with_no_name 见更新2
  • @a_horse_with_no_name 不,我的查询是 Insert 语句,而不是 UPDATE

标签: java mysql sql jdbc sqlexception


【解决方案1】:

您使用了错误的execute 方法。而不是采用String 的那个,您应该使用一个不带参数的。正如 Chris Joslin 所提到的,对于INSERT,最好使用executeUpdate

从技术上讲,正确的 JDBC 驱动程序在调用 execute(String) 或其同级之一时应立即抛出 SQLException PreparedStatement,但有些驱动程序会忽略此规则。

【讨论】:

    【解决方案2】:

    尝试 ps.executeUpdate() 而不是 ps.execute()。

    【讨论】:

      【解决方案3】:

      不应该是:

      String query = "Insert into Books(Name,ISBN,Status,Date)" +
          "values( '" + name + "','" + isbn + "','" + status+ "','" + date + "' ) ";
      try {
          con = DriverManager.getConnection(...);
          ps = con.prepareStatement(query,java.sql.Statement.RETURN_GENERATED_KEYS);
          ps.executeUpdate();
          rs = ps.getGeneratedKeys();   // Exception is here
      }
      


      看起来在您的第一个示例中,您正确地进行了准备,但随后再次使用查询字符串调用 executeUpdate,而不仅仅是 ps.executeUpdate()。

          ps = con.prepareStatement(query, java.sql.Statement.RETURN_GENERATED_KEYS);
          ps.executeUpdate(query);
      

      【讨论】:

        猜你喜欢
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 2015-11-20
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多