2012-11-30 35 views
11

我想用一個PreparedStatementINSERT幾行:的getGeneratedKeys()後了PreparedStatement.executeBatch()

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(); 

在這一點上,我了when期望獲得PK的每個INSERT產生的,我得到這個SQLServerException

com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained. 

我希望得到一個結果有一行執行的每個插入,這樣我就可以得到每個PK產生。

我是否期待錯誤?難道我做錯了什麼?它可以以不同的方式使用批處理執行嗎?

+0

INSERT是否被任何事務處理? –

+0

如果你問是否INSERT成功執行,是的。當我想要檢索其密鑰時會出現問題。 – jmrodrigg

+0

我的意思是在你可以獲得生成的密鑰之前,批處理可能需要commit()。 –

回答

8

對批處理執行的支持getGeneratedKeys()是根據JDBC規範定義的實現。 SQL Server驅動程序很可能不支持批處理執行。

我試圖在Microsoft網站上尋找明確的聲明,但找不到它。 MSDN上這個舊的(2007)論壇帖子確實聲明它不被支持:http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/6cbf5eea-e5b9-4519-8e86-f4b65ce3f8e1

+0

這正是發生的事情:我可以通過在int []變量中得到'executeBatch()'的結果來看到每個INSERT的結果,但是我也想獲取插入的鍵以便記錄他們 – jmrodrigg

+1

感謝澄清,我沒有發現任何明確的聲明說它不被支持(我有我的懷疑,但我不確定) – jmrodrigg

+2

微軟的SQL Server JDBC驅動程序團隊已經確定這是一個[功能請求未來版本](https://github.com/Microsoft/mssql-jdbc/issues/245)。 –