SQL异常,未请求生成的密钥

时间:2014-07-05 15:50:54

标签: java mysql sql jdbc sqlexception

在我的代码的上述部分中会发生此异常:

    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

3 个答案:

答案 0 :(得分:3)

您使用了错误的execute方法。而不是采用String的人,你应该使用没有参数的人。正如克里斯·乔斯林所提到的那样,对于INSERT,最好使用executeUpdate

从技术上讲,正确的JDBC驱动程序在SQLException上调用execute(String)或其中一个兄弟节点时应立即抛出PreparedStatement,但某些驱动程序会忽略此规则。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

不应该是:

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
}


在第一个示例中,您可以正确地进行准备,但是再次使用Query String调用executeUpdate而不是仅使用ps.executeUpdate()。

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