4

シナリオ

ADO.NET SqlCommand を使用してストアド プロシージャを実行しています。

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_Trk_GetSuspiciusVisitor";
cmd.Parameters.Add(new SqlParameter("channel","gb"));
cmd.Parameters.Add(new SqlParameter("data", DateTime.Today.AddDays(-1)));
cmd.Connection = conn;

実行されたSQL文をログに記録したいと思います。この場合、文字列をログに記録したいと思います:

sp_Trk_GetSuspiciusVisitor 'gb', '2012-08-12'

質問

SqlCommand仕事をするSqlConnectionクラスのプロパティはありますか?

4

3 に答える 3

4

これを行うための魔法の方法はありませんが、ADO.NET とうまく連携して何が起こっているかをキャプチャできるツールがいくつかあります。たとえば、mini-profilerは ADO.NET をラップすることでこれを行います。これには、通常、「接続の作成」コードを 1 回変更するだけで済みます。その後、操作を内部的にログに記録します。コードはオープン ソースであるため、独自のログ フレームワークに合わせて微調整するのは簡単です。

例として、SEDE に (ログインして) 行き、ランダムなページ (たとえば、ここ)を見ると、ログに記録されたすべての SQL 操作が表示されます (このログを取得するためにコードを変更する必要はありませんでした) 利用できなくなります:

ここに画像の説明を入力

唯一のマイナーな不具合は、明示的な の使用ですSqlParameter。これは、に変更する必要がある場合がありcmd.CreateParameter()ます。または、dapper のようなものを使用して簡単にします。

conn.Execute("sp_Trk_GetSuspiciusVisitor",
    new { channel = "gb", data = DateTime.Today.AddDays(-1) },
    commandType: CommandType.StoredProcedure);

declare上記のステートメントは元のクエリの一部ではないことに注意してください。ツールはこれらを追加して、SSMS などでクエリを簡単に実行できるようにしました。

于 2012-08-13T10:27:54.627 に答える
1

いいえ、残念ながら、すべてのパラメータをループして値を取得し、コマンドテキストと連結する必要があります。

于 2012-08-13T10:18:32.337 に答える
0

または、ストアド プロシージャを編集して、次のものと同等のものを追加して、ログを記録します。

insert into my_sp_log 
values ('sp_trk_getSuspiciousVisitor', @channel, @data, getdate())
于 2012-08-13T10:23:18.197 に答える