ADO.NET-Architektur mit Microsoft. Data.SqlClient

ADO.NET ist das Datenzugriffsmodell, das in .NET integriert ist. Microsoft. Data.SqlClient implementiert dieses Modell für SQL Server-kompatible Datenbanken und fügt SQL Server-spezifische Funktionen hinzu.

Die Microsoft.Data.SqlClient-Landingpage bietet eine Funktionsübersicht des Treibers und die Produktionsbasis. Dieser Artikel erklärt, wie der Treiber in ADO.NET passt.

ADO.NET-Abstraktionen und SqlClient-Typen

ADO.NET definiert provider-unabhängige Abstraktionen im NamensraumSystem.Data.Common. Microsoft. Data.SqlClient liefert konkrete Implementierungen.

ADO.NET-Abstraktion SqlClient-Typ Purpose
DbConnection SqlConnection Öffnet eine logische Verbindung zu einer Datenbank.
DbCommand SqlCommand Führt SQL-Text oder eine gespeicherte Prozedur aus.
DbParameter SqlParameter Sendet einen getippten Wert getrennt vom Befehlstext.
DbDataReader SqlDataReader Überträgt Ergebniszeilen fortlaufend vom Server.
DbTransaction SqlTransaction Gruppiert Befehle zu einer atomaren Transaktion.
DbDataAdapter SqlDataAdapter Füllt nicht verbundene DataSet- und DataTable-Objekte auf und aktualisiert sie.
DbBatch SqlBatch Sendet mehrere Befehle als einen Batch auf unterstützte Zielframeworks.

Programmieren Sie gegen die ADO.NET-Abstraktionen, wenn eine Bibliothek mehrere Datenbankanbieter unterstützen muss. Verwenden Sie die SqlClient-Typen, wenn eine Anwendung auf SQL Server abzielt und anbieterspezifische Funktionen benötigt.

Verbundener Datenzugriff

Connected Access hält eine Verbindung verfügbar, während ein Befehl ausgeführt wird und während die Anwendung die Ergebnisse liest.

Eine häufige Anfrage folgt dieser Reihenfolge:

  1. Erstelle ein SqlConnection aus einem Verbindungszeichenfolge.
  2. Öffnen Sie die Verbindung.
  3. Erstelle ein SqlCommand und füge SqlParameter Werte hinzu.
  4. Führen Sie den Befehl aus.
  5. Verarbeiten Sie einen skalaren Wert, die Anzahl der betroffenen Zeilen oder SqlDataReader.
  6. Entsorgen Sie den Leser, den Befehl und die Verbindung.

Nutzen Sie Connected Access für die meisten Web-APIs, Dienste, Arbeiter und Kommandozeilenanwendungen. SqlDataReader streamt Zeilen und verbraucht in der Regel weniger Speicher als das Laden des gesamten Ergebnisses in ein DataSet.

Das Öffnen und Entsorgen eines SqlConnection für jede Arbeitseinheit ist das übliche Muster. Connection Pooling verwendet die zugrundeliegende physische Verbindung wieder. Halten Sie keine globale Verbindung während der gesamten Lebensdauer einer Anwendung offen.

Getrennter Datenzugriff

SqlDataAdapterüberträgt Daten zwischen SQL Server und einem Speicher DataSet oder DataTable. Die Anwendung kann die Verbindung schließen, während sie die Daten im Speicher liest oder ändert, und sich dann wieder verbinden, um Updates zu senden.

Nutzen Sie den getrennten Zugang, wenn Sie Folgendes benötigen:

  • Datenbindung an DataSet oder DataTable.
  • In-Memory-Beziehungen und Einschränkungen.
  • Offline-Bearbeitungen, die später abgestimmt werden.
  • Kompatibilität mit einer bestehenden Anwendung, die auf DataAdapters basiert.

Für neue anforderungsbasierte Dienste beginnen Sie mit SqlCommand und SqlDataReader, es sei denn, Sie benötigen das nicht verbundene Objektmodell.

SQL Server-spezifische Funktionen

Microsoft. Data.SqlClient fügt APIs und Verbindungsverhalten hinzu, die nicht Teil des anbieterunabhängigen ADO.NET-Vertrags sind:

  • Microsoft Entra-Authentifizierung und Rückrufe für Zugriffstoken.
  • TDS 8.0 strenge Verschlüsselung und SQL Server-Zertifikatsoptionen.
  • Immer verschlüsselte und sichere Enklaven.
  • SqlBulkCopy zum Laden von Daten mit hohem Durchsatz.
  • Parameter mit Tabellenwert.
  • SQL Server-Datentypen, einschließlich JSON- und Vektortypen.
  • Konfigurierbare Logik für Wiederholung.
  • SQL Server-Diagnosen, Statistiken und Zähler.
  • Verfügbarkeitsgruppen und Failover-Verbindungsoptionen.

Die Nutzung dieser Funktionen verknüpft diesen Code mit Microsoft. Data.SqlClient. Behalten Sie anbieterspezifischen Code hinter einer Datenzugriffsgrenze, wenn der Rest der Anwendung anbieterunabhängig bleiben muss.

Objektlebensdauer und Nebenläufigkeit

Geben Sie Verbindungen, Befehlsobjekte, Reader, Transaktionen und BulkCopy-Objekte umgehend frei. Verwenden von await using mit asynchronem Code, wenn ein Typ IAsyncDisposable implementiert.

SqlConnection, SqlCommand, , SqlDataReaderund SqlTransaction unterstützen keine gleichzeitige Nutzung durch mehrere Threads. Geben Sie jeder gleichzeitigen Operation eine eigene Verbindung und verlassen Sie sich auf Verbindungspooling. Multiple Active Result Sets (MARS) erlaubt mehr als ein aktives Ergebnisset auf einer Verbindung, macht SqlClient-Objekte jedoch nicht threadsicher.

Pakete und Namensräume

Installiere das Microsoft.Data.SqlClient NuGet-Paket und importiere den Microsoft.Data.SqlClient Namespace. Der Treiber wird unabhängig von .NET ausgeliefert, daher unterscheiden sich Feature, Release- und Supportpläne von der .NET-Laufzeit.

System.Data.SqlClient ist der ältere Anbieter. Nutze Microsoft. Data.SqlClient für neue Entwicklungen. Befolgen Sie für eine bestehende Anwendung die Schritte unter „Von System.Data.SqlClient zu Microsoft.Data.SqlClient migrieren“.