Datenablaufverfolgung in ADO.NET

ADO.NET bietet integrierte Datenablaufverfolgungsfunktionen, die von den .NET-Datenanbietern für SQL Server, Oracle, OLE DB und ODBC sowie die ADO.NET DataSetund die SQL Server Netzwerkprotokolle unterstützt werden.

Die Ablaufverfolgung von Aufrufen der Datenzugriffs-API kann bei der Diagnose der folgenden Probleme helfen:

  • Fehlende Schemaübereinstimmung zwischen Clientprogramm und Datenbank.

  • Nicht verfügbare Datenbank oder Probleme mit der Netzwerkbibliothek.

  • Fehlerhafte SQL-Anweisungen (sowohl hart codiert als auch von einer Anwendung generiert).

  • Fehlerhafte Programmierlogik.

  • Probleme, die sich aus der Interaktion mehrerer ADO.NET-Komponenten oder aus der Interaktion zwischen ADO.NET und Ihren eigenen Komponenten ergeben.

Zur Unterstützung verschiedener Ablaufverfolgungstechnologien ist die Ablaufverfolgung erweiterbar, sodass Entwickler eine Ablaufverfolgung für Probleme auf jeder Ebene des Anwendungsstapels ausführen können. Obwohl die Ablaufverfolgung nicht auf ADO.NET beschränkt ist, nutzen Microsoft-Anbieter die Vorteile generalisierter Ablaufverfolgungs- und Instrumentierungs-APIs.

Weitere Informationen zum Festlegen und Konfigurieren der verwalteten Ablaufverfolgung in ADO.NET finden Sie unter Ablaufverfolgung des Datenzugriffs.

Zugreifen auf Diagnoseinformationen im Protokoll der erweiterten Ereignisse

Im .NET Framework Datenanbieter für SQL Server wurde die Datenzugriffsablaufverfolgung (Datenzugriffsablaufverfolgung) aktualisiert, um das Korrelieren von Clientereignissen mit Diagnoseinformationen wie Verbindungsfehlern aus dem Verbindungsringpuffer des Servers und den Anwendungsleistungsinformationen im Protokoll für erweiterte Ereignisse zu vereinfachen. Informationen dazu, wie Sie das Protokoll für erweiterte Ereignisse lesen, finden Sie unter View Event Session Data.

Für Verbindungsvorgänge sendet ADO.NET eine Clientverbindungs-ID. Bei einem Verbindungsfehler haben Sie die Möglichkeit, auf den Konnektivitätsringpuffer zuzugreifen (Konnektivitätsproblembehebung in SQL Server 2008 mit dem Konnektivitätsringpuffer) und über das Feld ClientConnectionID Diagnoseinformationen zum jeweiligen Verbindungsfehler abzurufen. Clientverbindungs-IDs werden nur im Ringpuffer protokolliert, wenn ein Fehler auftritt. (Wenn vor dem Senden des prelogin-Pakets keine Verbindung hergestellt werden kann, wird keine Clientverbindungs-ID generiert.) Die Clientverbindungs-ID ist eine 16-Byte-GUID. Sie finden die Clientverbindungs-ID auch in der Zielausgabe für erweiterte Ereignisse, wenn die client_connection_id-Aktion den Ereignissen in einer Sitzung für erweiterte Ereignisse hinzugefügt wurde. Sie können die Ablaufverfolgung für den Datenzugriff aktivieren, den Verbindungsbefehl erneut ausführen und das ClientConnectionID-Feld in der Datenzugriffs-Ablaufverfolgung beobachten, wenn Sie weitere Diagnoseinformationen zum Clienttreiber benötigen.

Sie können die Clientverbindungs-ID programmgesteuert abrufen, indem Sie die SqlConnection.ClientConnectionID-Eigenschaft verwenden.

Ist ClientConnectionID für ein SqlConnection -Objekt verfügbar, das erfolgreich eine Verbindung herstellt. Wenn ein Verbindungsfehler auftritt, ist ClientConnectionID u. U. über SqlException.ToString verfügbar.

ADO.NET sendet zudem eine threadspezifische Aktivitäts-ID. Die Aktivitäts-ID wird in den Sitzungen für erweiterte Ereignisse aufgezeichnet, wenn die Sitzungen bei aktivierter TRACK_CAUSALITY-Option gestartet werden. Bei Leistungsproblemen mit einer aktiven Verbindung können Sie die Aktivitäts-ID aus der Datenzugriffs-Ablaufverfolgung des Clients abrufen (ActivityID-Feld) und dann die Aktivitäts-ID in der Ausgabe für die erweiterten Ereignisse suchen. Die Aktivitäts-ID in den erweiterten Ereignissen ist eine 16-Byte-GUID (nicht identisch mit der GUID für die Clientverbindungs-ID), an die eine 4-Byte-Sequenznummer angefügt wurde. Die Sequenznummer steht für die Reihenfolge einer Anforderung innerhalb eines Threads und gibt die relative Reihenfolge des Batches und der RPC-Anweisungen für den Thread an. ActivityID wird derzeit optional für SQL-Batchanweisungen und RPC-Anforderungen gesendet, wenn die Ablaufverfolgung für den Datenzugriff aktiviert ist und das 18. Bit im Konfigurationswort der Datenzugriffs-Ablaufverfolgung ON lautet.

Das folgende Beispiel verwendet Transact-SQL, um eine Sitzung für erweiterte Ereignisse zu starten, die in einem Ringpuffer gespeichert wird und die von einem Client gesendete Aktivitäts-ID für RPC- und Batchvorgänge aufzeichnet.

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)

Siehe auch