Java PreparedStatement.executeBatch()之后的getGeneratedKeys()

Java PreparedStatement.executeBatch()之后的getGeneratedKeys(),java,sql-server,jdbc,prepared-statement,Java,Sql Server,Jdbc,Prepared Statement,我想使用PreparedStatement插入几行: ps = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED_KEYS); for(Element e:listOfElements){ ps.setString(1,this.col_val_1); ps.setString(2,this.col_val_2); ps.setInt(3,this.col_val_3); ps.addB

我想使用
PreparedStatement
插入几行:

ps = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED_KEYS);

for(Element e:listOfElements){
    ps.setString(1,this.col_val_1);
    ps.setString(2,this.col_val_2);
    ps.setInt(3,this.col_val_3);

    ps.addBatch();
}

ps.executeBatch();
ResultSet rs = ps.getGeneratedKeys();
此时,当我希望为每个
INSERT
生成PK时,我得到了以下
SQLServerException

com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.
我希望得到一个结果集,每个插入执行一行,这样我就可以生成每个PK


我是不是预期错了?我做错什么了吗?可以使用批处理执行以不同的方式完成吗?

对批处理执行的
getGeneratedKeys()
支持是根据JDBC规范定义的实现。SQL Server驱动程序很可能不支持批处理执行


我试图在微软网站上寻找一个明确的声明,但没有找到。MSDN上的这篇旧(2007年)论坛帖子确实指出它不受支持:

是否有机会执行
INSERT
s事务?如果您询问
INSERT
s是否成功执行,可以。当我想要检索它的密钥时出现问题。我的意思是,在获取生成的密钥之前,可能需要对批处理执行
commit()
。我已尝试强制执行
con.commit()在获取钥匙之前,问题仍然存在:(这就是实际情况:我可以通过在
int[]
变量中获取
executeBatch()
的结果来查看每个
INSERT
的结果,但我也想获取插入的键以记录它们。感谢您的澄清,我没有发现任何明确的语句说它不受支持(我有我的怀疑,但我不确定)。微软的SQL Server JDBC驱动程序团队已经确定这是一个错误。