Microsoft.Data.SqlClient では、Microsoft.Data.SqlClient.EventSource イベント ソースを通じてデータ アクセスのトレース機能を利用できます。 Oracle、OLE DB、ODBC 用の .NET Framework プロバイダーや DataSet など、その他の ADO.NET コンポーネントには、それぞれ独自のトレース機能があります。
データ アクセス API 呼び出しのトレースは、次の問題を診断する際に役立ちます。
クライアント プログラムとデータベース間のスキーマの不一致
データベースの使用不可またはネットワーク ライブラリの問題
誤った SQL がアプリケーションによりハードコーディングまたは生成された
プログラミング ロジックが不適切
複数の ADO.NET コンポーネント間、または ADO.NET と独自のコンポーネント間の相互作用に起因する問題。
トレースを拡張することにより異なるトレース技術をサポートできます。このため、開発者はアプリケーション スタックのあらゆるレベルで問題をトレースできます。 トレースは ADO.NET 専用の機能ではありませんが、Microsoft プロバイダーは一般化されたトレースおよびインストルメンテーション API を活用しています。
Microsoft.Data.SqlClient トレースを収集する方法について詳しくは、「SqlClient で EventSource トレースを有効にする」を参照してください。
拡張イベント ログの診断情報へのアクセス
Microsoft.Data.SqlClient の接続 ID を使用すると、クライアント側のイベントと、接続リング バッファーや拡張イベント ログに記録された接続エラーなどのサーバー診断情報を関連付けることができます。 拡張イベント ログを読み取る方法については、「 イベント セッション データの表示」を参照してください。
Microsoft.Data.SqlClient は、接続処理のログイン前の情報交換時にクライアント接続 ID を送信します。 接続に失敗した場合は、接続リング バッファーの ClientConnectionID フィールドを探して、接続エラーに関する診断情報を取得します。 クライアント接続 ID は、エラーが発生した場合にのみリング バッファーに記録されます プレログイン交換の前に接続に失敗した場合、サーバーは ID を受け取りません。 クライアント接続 ID は 16 バイトの GUID です。 拡張イベント セッションのイベントに client_connection_id アクションを追加する場合は、拡張イベント ターゲット出力でクライアント接続 ID を見つけることもできます。
クライアント接続 ID をプログラムで取得するには、 ClientConnectionIdを使用します。
SqlConnection では、接続が正常に確立されると接続 ID を取得できます。 接続の試行が失敗した場合、ID は ClientConnectionIdを介して入手できる可能性があります。
Microsoft.Data.SqlClient は、イベント ソースが有効で、サーバーがトレース ヘッダーをサポートしている場合に、バッチ ステートメントとリモート プロシージャ コール (RPC) 要求のスレッド固有のアクティビティ ID も送信します。 拡張イベント セッションでアクティビティ ID をキャプチャするには、TRACK_CAUSALITY オプションを有効にします。 アクティブな接続でパフォーマンスの問題が発生する場合は、クライアント トレースでアクティビティ ID を見つけて、拡張イベント出力でも特定します。 アクティビティ ID には、16 バイトの GUID と 4 バイトのシーケンス番号が含まれています。 シーケンス番号は、スレッド内の要求の相対順序を示します。 従来のデータ アクセス トレース用の構成ワードでは、Microsoft.Data.SqlClient のイベント ソースを構成できません。
次に示すのは、リング バッファーに格納され、RPC とバッチ操作でクライアントから送信されるアクティビティ ID を記録する拡張イベントのセッションを開始するために Transact-SQL を使用するサンプルです。
create event session MySession on server
add event connectivity_ring_buffer_recorded,
add event sql_statement_starting (action (client_connection_id)),
add event sql_statement_completed (action (client_connection_id)),
add event rpc_starting (action (client_connection_id)),
add event rpc_completed (action (client_connection_id))
add target ring_buffer with (track_causality=on)