2016-07-21 2 views
0

ログアウト例外とデバッグのために、私のado.netベースのアプリケーションからサーバに送信されたSQL文を知りたいと思います。 MS SQL接続プロバイダを扱う汎用DALを使用します。どのSQL文がado.netアプリケーション(MS SQLプロバイダ)からサーバに送信されました

SO検索しながら、私はこのクエリを見つけた:

SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query] 
FROM sys.dm_exec_query_stats AS deqs 
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest 
ORDER BY deqs.last_execution_time DESC 

参照:彼らはSSMS(SQL内から実行している場合は、このSQLコードは、クエリをキャッチすることができSO

SQL Server Query Trace

や他の多くをサーバーManagement Studio)

ただし、MS SQL Serverに接続されたAdo.netアプリケーションから送信されたクエリはキャッチできませんatabaseサーバー。

私の質問:彼らはこのコードを使用してAdo.netベースのアプリケーションから送信された場合、私は、クエリをキャッチすることはできませんなぜ

?あなたのDALは抽象のIDbConnectionとのIDbCommandインターフェイスを使用している場合

は(私はSQL profillerで得るもののような)私のアプリケーションから送信された実際のSQLステートメントをキャッチするために、他の方法(SQLコード/ C#コード)

+1

クエリに関係なく実行する方法のキャッシュされたクエリを見つけます。したがって、DMVクエリが実行される前に、クエリがキャッシュされていないか、または削除されている可能性があります。この目的のためにDMVを使用するのではなく、拡張イベントまたはSQLトレース(プロファイラ)を使用するトレースを検討してください。 –

+0

SQLプロファイラはオンラインでの対話が必要です。ロギング用のコードが必要です –

+0

Profiler File - > Export - > Script Trace Definitionメニューから無人サーバー側トレースをプロファイラからスクリプトできます。スクリプトを修正して、希望のファイル名パターン、ファイルサイズ、ロールオーバーなどを指定します。 –

答えて

1

は、あります

public class MyDbConnection : IDbConnection { 
     private IDbConnection src; 
     public MyDbConnection(IDbConnection src) { 
      this.src = src; 
     } 
     public IDbCommand CreateCommand() { 
      return new MyDbCommand(src.CreateCommand()); 
     } 
     //TODO create pass-through implementations of the rest of IDbConnection methods... 
    } 

    public class MyDbCommand : IDbCommand { 
     private IDbCommand src; 
     public MyDbCommand(IDbCommand src) { 
      this.src = src; 
     } 

     public int ExecuteNonQuery() { 
      log.Info(src.CommandText); 
      return src.ExecuteNonQuery(); 
     } 

     public IDataReader ExecuteReader() { 
      log.Info(src.CommandText); 
      return src.ExecuteReader(); 
     } 

     public IDataReader ExecuteReader(CommandBehavior behavior) { 
      log.Info(src.CommandText); 
      return src.ExecuteReader(behavior); 
     } 

     public object ExecuteScalar() { 
      log.Info(src.CommandText); 
      return src.ExecuteScalar(); 
     } 

     //TODO create pass-through implementations of the rest of IDbCommand methods and properties... 
    } 
:あなたはあなたのIDbConnectionをインスタンス化するための共通の工場を持っている、あなたは本当の基礎となるオブジェクトを呼び出す前のExecuteReaderをログに記録するのIDbCommand、のExecuteNonQuery、とは、ExecuteScalarの独自の実装を返すようにCreateCommandをオーバーライドするのIDbConnectionの独自の実装を作成することができます

今、あなたがどこにいたとしてもあなたのIDbConnectionを試して、代わりに新しいMyDbConnection(theRealDbConnection)を返してください...

+0

src.CommandTextは、パラメータがある場合にサーバーに送信される完全なSQLではありません。 MyDbCommandはsqlを{sp_executesql文、Parameter_types、Parameter_values}として送信し、ログはパラメータなしで情報の3分の1のみを記録します。私は完全なsp_executesqlをキャッチしたい。私はそれを作成し、私の現在のDALにログインすることができますが、私は実際にsqlのクエリは、SQLプロファイラツールによってキャプチャされたとしてado.netによって送信された知りたい。この実装では、サーバーに送信される完全なSQlクエリは生成されません。 –

0

ああ、申し訳ありませんが、私は質問を誤解しました。私の以前の答えは、あなたのアプリがSQLクライアントに送信していたものをキャプチャする方法を示したが、SQLクライアントがサーバーに送信していたものではなかった。

SQLクライアントからサーバーに送信されたSQL文をキャプチャするには、sp_trace_createおよび関連するトレース関数を使用して、トレース情報をアプリケーションに返すようにSQL Serverを構成する必要があります。

このTechNetの記事は、あなたに役立つかもしれない:SQL Trace

関連する問題