web-dev-qa-db-ja.com

CommandType.TextとCommandType.StoredProcedure

テキストコマンドを使用するだけでなく、StoredProcedure CommandTypeを明示的に使用することに利点はありますか?言い換えれば、

cmd = new SqlCommand("EXEC StoredProc(@p1, @p2)");
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@p1", 1);
cmd.Parameters.Add("@p2", 2);

より悪い

cmd = new SqlCommand("StoredProc");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@p1", 1);
cmd.Parameters.Add("@p2", 2);

編集:悪いコピー貼り付けジョブを修正しました(再び)。また、質問の要点はデータアクセスクラスです。パラメータごとに余分な行を追加するのではなく、ストアドプロシージャ名とパラメータを1行で渡すことができればと思います。

14
Lurker Indeed

1つの違いは、メッセージのポンピングがどのように行われるかです。

私が以前働いていた場所では、一晩中実行されるバッチプロセスがいくつかありました。それらの多くは、単にストアドプロシージャの実行に関係していました。以前はSQLサーバージョブを使用してこれらをスケジュールしていましたが、代わりに.Netプログラムからプロシージャを呼び出すようになりました。これにより、SQL Serverとは関係のないタスクであっても、スケジュールされたタスクallを1か所にまとめることができました。

また、プロシージャを呼び出す.Netプログラムに、より優れたロギング機能を組み込むことができたため、すべての夜間プロセスからのロギングに一貫性がありました。ストアドプロシージャはsqlprintおよびraiserror関数を使用し、.Netプログラムはそれらを受信して​​ログに記録します。私たちが学んだことは、CommandType.StoredProcedurealwaysこれらのメッセージを約50のバッチにバッファリングします。Netコードは、プロシージャが終了するかバッファをフラッシュするまで、ログイベントを表示しません。 、接続で設定したオプションやSQLで行ったことに関係なく。 CommandType.Textこれを修正しました。

副次的な問題として、クエリパラメータで明示的な型を使用します。 .Netにパラメータタイプを推測させようとすると、状況によっては問題が発生する可能性があります。

7
Joel Coehoorn

きれいです。

ストアドプロシージャを呼び出しているのですが、CommandType.StoredProcedureを使用しないのはなぜですか?

3
Jesse Weigert