新しく挿入された行のID列を返す場合は、ExecuteScalar
またはExecuteNonQuery
を使用するのが最善かどうかを確認しようとしています。私はthis questionを読んでいると私はそこの違いを理解しますが、(重く、このサイトからの借入ながら)私は数週間前に書いたいくつかのコードを見ているとき、私は私の挿入で、私はExecuteScalar
を使用していたことがわかったので、のような:ID値を返すときにExecuteScalarと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のすべてをきれいにするのに役立ちます。あなたがそれを変更しなければならない場合は、アプリケーションを再コンパイルして再デプロイする必要があります。 –
Hmmm ... ExecuteNonQueryは通常、結果を返すことを期待しないSQLを実行するためのものです。 ExecuteScalarはパラメータを渡す必要がないように値を返します。 – Sam
私は出力パラメータなしで 'SELECT SCOPE_IDENTITY'を使うので' ExecuteScalar'を使います。したがって、あなたはSQLの最後の部分を 'SELECT SCOPE_IDENTITY();'に変更して 'return(int)cmd.ExecuteScalar();' 'ExecuteScalar'の目的である単一の値を取得します。 http://stackoverflow.com/a/9319609/284240 –