使用するのが最適かどうか、または新しく挿入された行のID列を返したいかどうかをExecuteScalar
判断しようとしています。私はこの質問ExecuteNonQuery
を読み、そこでの違いを理解していますが、数週間前に書いたコードを見ると(このサイトから多額の借用をしているときに)、挿入物で次のように使用していることがわかりました。ExecuteScalar
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
挿入を行うのに「より適切」であるため、ここ で使用する必要があるかどうか。- 出力パラメーターを使用しているので、ID値の取得はどちらの方法でも同じでしょうか?
- いずれかの方法に関連するパフォーマンスの影響はありますか?
- 一般的に、これを全体的に行うためのより良い方法はありますか?
違いが生じる場合に備えて、Visual Studio 2010、.NET 4.0、およびSQLServer2008r2を使用しています。