2012-09-27 107 views
2

我有一個表的標識列,其值希望在INSERT後得到。下面的代碼,不使用參數,是可以正常使用:SCOPE_IDENTITY似乎不適用於參數化查詢

string query = "INSERT INTO aTable ([aColumn]) VALUES (42)"; 
SqlCommand command = new SqlCommand(query, connection); 
command.ExecuteNonQuery(); 

query = "SELECT CAST(SCOPE_IDENTITY() AS bigint)"; 
command = new SqlCommand(query, connection); 
object identity = command.ExecuteScalar(); 

如果我改變了上面的代碼的INSERT部分使用參數化查詢,ExecuteScalar()突然返回System.DBNull值。這是參數化查詢代碼的樣子:

string query = "INSERT INTO aTable ([aColumn]) VALUES (@aColumn)"; 
SqlCommand command = new SqlCommand(query, connection); 
command.Parameters.AddWithValue("@aColumn", 42); 
command.ExecuteNonQuery(); 

我曾嘗試,以便它使用的輸出參數,並調用ExecuteNonQuery()改變SCOPE_IDENTITY代碼,但是我還是在輸出參數爲空值。我也試着針對兩個不同版本的SQL Server(2012和2008,都是Express Edition)運行代碼,結果也一樣。

任何想法,我做錯了什麼?

+6

參數化的查詢可能拉閘調用'sp_executesql'。它在子範圍內運行,當它退出時,SCOPE_IDENTITY()在外部範圍內爲空。 –

+1

除了將它們組合到一個批處理中之外,另一個解決方法是停止在應用程序中嵌入動態SQL,並將此邏輯放入存儲過程中。 –

+0

你也可以嘗試'INSERT INTO aTable(...)OUTPUT Inserted.ID VALUES(.....)'來自動輸出所有插入的新ID值。 –

回答

6

嘗試結合您插入,然後選擇到一個語句

string query = "INSERT INTO aTable ([aColumn]) VALUES (@aColumn);SELECT CAST(SCOPE_IDENTITY() AS bigint)"; 
SqlCommand command = new SqlCommand(query, connection); 
command.Parameters.AddWithValue("@aColumn", 42); 
object identity = command.ExecuteScalar(); 
+0

對於像我這樣的新手來說,這看起來不可思議,但與Martin Smith的評論一起,這實際上是有道理的:-)無論如何,非常感謝! – herzbube

相關問題