試圖找出是否最好使用ExecuteScalar
或ExecuteNonQuery
如果我想返回新插入行的標識列。我已閱讀this question,我理解這些差異存在,但找了一些代碼時,我寫了幾個星期前(同時從該網站大量舉債),我發現,在我插入我用ExecuteScalar
,就像這樣:返回標識值時ExecuteScalar vs ExecuteNonQuery
public static int SaveTest(Test newTest)
{
var conn = DbConnect.Connection();
const string sqlString = "INSERT INTO dbo.Tests (Tester , Premise) " +
" VALUES (@tester , @premise) " +
"SET @newId = SCOPE_IDENTITY(); ";
using (conn)
{
using (var cmd = new SqlCommand(sqlString, conn))
{
cmd.Parameters.AddWithValue("@tester", newTest.tester);
cmd.Parameters.AddWithValue("@premise", newTest.premise);
cmd.Parameters.Add("@newId", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.CommandType = CommandType.Text;
conn.Open();
cmd.ExecuteScalar();
return (int) cmd.Parameters["@newId"].Value;
}
}
}
能正常工作,我需要什麼,所以我不知道
- 我是否應該使用
ExecuteNonQuery
在這裏,因爲它是「更合適的」做插入? - 由於我使用的是輸出參數,檢索標識值的方式是否相同?
- 是否有任何與單向或雙向相關的性能命中?
- 總體來說有更好的方法來做到這一點嗎?
我正在使用Visual Studio 2010,.NET 4.0和SQL Server 2008r2,以防有什麼區別。
(1)爲什麼'ExecuteNonQuery'「更合適」? (2)您是否考慮過使用存儲過程?如果不是,爲什麼不呢?它肯定會幫助你清理所有你放入你的應用程序的臨時SQL - 當你必須改變它時,這意味着你必須重新編譯和重新部署應用程序。 –
嗯...... ExecuteNonQuery通常用於執行不期望返回結果的SQL。 ExecuteScalar返回一個值,所以你不需要通過參數。你可以改變你的SQL的最後部分爲'SELECT SCOPE_IDENTITY();'然後使用'return(int)cmd.ExecuteScalar();' – Sam
我使用'ExecuteScalar'因爲我使用'SELECT SCOPE_IDENTITY'沒有輸出參數,因此檢索「ExecuteScalar」的單個值。 http://stackoverflow.com/a/9319609/284240 –