SqlDataAdapter vs SqlDataReader

Was sind die Unterschiede zwischen der Verwendung von SqlDataAdapter vs SqlDataReader zum Abrufen von Daten aus einer DB?

Ich untersuche speziell ihre Vor-und Nachteile sowie ihre Geschwindigkeit und Gedächtnisleistung.

Vielen Dank

   

SqlDataReader:

  • Hält die Verbindung offen, bis Sie fertig sind (vergessen Sie nicht, sie zu schließen!).
  • Kann typischerweise nur einmal wiederholt werden
  • Ist nicht so nützlich für die Aktualisierung zurück in die database

Auf der anderen Seite, es:

  • Es wird jeweils nur ein Datensatz im Speicher gespeichert und nicht ein gesamter Ergebnissatz (dies kann sehr groß sein)
  • Ist ungefähr so ​​schnell, wie Sie für diese eine Iteration bekommen können
  • Ermöglicht die schnellere Verarbeitung von Ergebnissen (sobald der erste Datensatz verfügbar ist)

SqlDataAdapter / DataSet

  • Ermöglicht es Ihnen, die Verbindung zu schließen, sobald sie Daten geladen hat, und sie sogar automatisch für Sie schließen kann
  • Alle Ergebnisse sind im Speicher verfügbar
  • Sie können so oft wie nötig darüber iterieren oder sogar einen bestimmten Datensatz nach Index suchen
  • Verfügt über einige integrierte functionen zur Aktualisierung zurück in die database

Auf Kosten von:

  • Viel höherer Speicherverbrauch
  • Sie warten, bis alle Daten geladen sind, bevor Sie eine davon verwenden

Es hängt also wirklich davon ab, was Sie tun, aber ich bevorzuge einen DataReader, bis ich etwas benötige, das nur von einem Dataset unterstützt wird. SqlDataReader ist ideal für den allgemeinen Datenzugriffsfall der Bindung an ein Read-Only-Grid.

Die Antwort darauf kann ziemlich breit sein.

Im Wesentlichen ist der Hauptunterschied für mich, der normalerweise meine Entscheidungen beeinflusst, dass Sie mit einem SQLDataReader Daten aus der database “streamen”. Mit einem SQLDataAdapter extrahieren Sie die Daten aus der database in ein Objekt, das selbst weiter abgefragt werden kann, sowie CRUD-Operationen ausführen.

Offensichtlich ist SQLDataReader mit einem Datenstrom VIEL schneller, aber Sie können nur einen Datensatz gleichzeitig verarbeiten. Mit einem SQLDataAdapter haben Sie eine vollständige Sammlung der übereinstimmenden Zeilen zu Ihrer Abfrage von der database, um mit Ihrem Code zu arbeiten / ihn zu durchlaufen.

WARNUNG: Wenn Sie einen SQLDataReader verwenden, stellen Sie IMMER IMMER sicher, dass Sie immer den richtigen Code zum Schließen der Verbindung schreiben, da Sie die Verbindung mit dem SQLDataReader geöffnet lassen. Wenn Sie dies nicht tun oder die Fehlerbehandlung zum Schließen der Verbindung im Falle eines Fehlers bei der Verarbeitung der Ergebnisse fehlschlägt, wird Ihre Anwendung mit Verbindungslecks CRIPPLE .

Verzeihen Sie meine VB, aber das ist die minimale Menge an Code, die Sie haben sollten, wenn Sie einen SqlDataReader verwenden:

Using cn As New SqlConnection("..."), _ cmd As New SqlCommand("...", cn) cn.Open() Using rdr As SqlDataReader = cmd.ExecuteReader() While rdr.Read() ''# ... End While End Using End Using 

gleichwertige C #:

 using (var cn = new SqlConnection("...")) using (var cmd = new SqlCommand("...")) { cn.Open(); using(var rdr = cmd.ExecuteReader()) { while(rdr.Read()) { //... } } } 

Ein SqlDataAdapter wird normalerweise zum Füllen eines DataSet oder DataTable verwendet, sodass Sie nach dem Schließen der Verbindung (getrennter Zugriff) auf die Daten zugreifen können.

Der SqlDataReader ist ein Fast-Forward-Only- und Connected-Cursor, der im Allgemeinen schneller ist als ein DataSet / DataTable zu füllen.

Darüber hinaus behandeln Sie mit einem SqlDataReader Ihre Daten jeweils einen Datensatz gleichzeitig und halten keine Daten im Speicher. Offensichtlich haben Sie bei einer DataTable oder einem DataSet einen Speicherzuordnungsaufwand.

Wenn Sie Ihre Daten nicht im Speicher behalten müssen, sollten Sie nur den SqlDataReader anzeigen. Wenn Sie Ihre Daten getrennt verarbeiten möchten, wählen Sie den DataAdapter aus, um entweder ein DataSet oder DataTable zu füllen.

Verwenden Sie einen SqlDataAdapter, wenn Sie ein speicherinternes DataSet / DataTable aus der database auffüllen möchten. Sie haben dann die Flexibilität, die Verbindung zu schließen / zu disponieren, die Datentabelle / den Satz im Speicher zu übergeben. Sie können dann die Daten bearbeiten und in Verbindung mit InsertCommand / UpdateCommand über den Datenadapter in der database speichern.

Verwenden Sie einen SqlDataReader, wenn Sie einen schnellen Datenzugriff mit geringem Speicherbedarf benötigen, ohne dass Sie z. B. die Daten in Ihrer Geschäftslogik weitergeben müssen. Dies ist optimaler für das schnelle Abrufen von großen Datenvolumes mit wenig Arbeitsspeicher, da nicht alle Daten gleichzeitig in den Arbeitsspeicher geladen werden. Mit dem SqlDataAdapter-Ansatz würde das DataSet / DataTable also mit allen Daten gefüllt werden Es gibt viele Zeilen und Spalten, die viel Speicherplatz benötigen.