在我的代码的上述部分中会发生此异常:
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
。
答案 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);