Antworten:
Auf der anderen Seite ist es:
Auf Kosten von:
Es hängt also wirklich davon ab, was Sie tun, aber ich bevorzuge einen DataReader, bis ich etwas brauche, das nur von einem Dataset unterstützt wird. SqlDataReader ist perfekt für den allgemeinen Datenzugriffsfall der Bindung an ein schreibgeschütztes Raster.
Weitere Informationen finden Sie in der offiziellen Microsoft-Dokumentation .
while (reader.Read())Schleife zurückzugeben.
Die Antwort darauf kann ziemlich weit gefasst sein.
Im Wesentlichen besteht der Hauptunterschied für mich, der normalerweise meine Entscheidung für die Verwendung beeinflusst, darin, dass Sie mit einem SQLDataReader Daten aus der Datenbank "streamen". Mit einem SQLDataAdapter extrahieren Sie die Daten aus der Datenbank in ein Objekt, das selbst weiter abgefragt werden kann, und führen CRUD-Operationen für aus.
Natürlich ist SQLDataReader mit einem Datenstrom VIEL schneller, aber Sie können jeweils nur einen Datensatz verarbeiten. Mit einem SQLDataAdapter haben Sie eine vollständige Sammlung der übereinstimmenden Zeilen zu Ihrer Abfrage aus der Datenbank, um mit Ihrem Code zu arbeiten / ihn zu durchlaufen.
WARNUNG: Wenn Sie einen SQLDataReader verwenden, stellen Sie IMMER, IMMER, IMMER sicher, dass Sie den richtigen Code zum Schließen der Verbindung schreiben, da Sie die Verbindung mit dem SQLDataReader offen halten. Andernfalls oder bei ordnungsgemäßer Fehlerbehandlung zum Schließen der Verbindung im Falle eines Fehlers bei der Verarbeitung der Ergebnisse wird Ihre Anwendung mit Verbindungslecks verkrüppelt .
Verzeihen Sie meine VB, aber dies ist die Mindestmenge an Code, die Sie bei Verwendung eines SqlDataReader haben sollten:
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
äquivalentes 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 einer DataTable verwendet, sodass Sie nach dem Schließen Ihrer Verbindung Zugriff auf die Daten haben (getrennter Zugriff).
Der SqlDataReader ist ein nur schneller Vorlauf und verbundener Cursor, der im Allgemeinen schneller ist als das Füllen eines DataSet / einer DataTable.
Darüber hinaus verarbeiten Sie mit einem SqlDataReader Ihre Daten Datensatz für Datensatz und speichern keine Daten im Speicher. Offensichtlich haben Sie mit einer DataTable oder einem DataSet einen Speicherzuweisungsaufwand.
Wenn Sie Ihre Daten nicht im Speicher behalten müssen, wählen Sie zum Rendern nur SqlDataReader. Wenn Sie nicht mit Ihren Daten umgehen möchten, wählen Sie den DataAdapter, um entweder ein DataSet oder eine DataTable zu füllen.
Verwenden Sie einen SqlDataAdapter, wenn Sie ein speicherinternes DataSet / DataTable aus der Datenbank füllen möchten. Sie haben dann die Flexibilität, die Verbindung zu schließen / zu trennen und die Datentabelle / das Set im Speicher weiterzugeben. Sie können die Daten dann bearbeiten und mithilfe des Datenadapters in Verbindung mit InsertCommand / UpdateCommand wieder in der Datenbank speichern.
Verwenden Sie einen SqlDataReader, wenn Sie einen schnellen Datenzugriff mit geringem Speicherbedarf wünschen, ohne dass Flexibilität erforderlich ist, um z. B. die Daten an Ihre Geschäftslogik weiterzuleiten. Dies ist optimaler für das schnelle Abrufen großer Datenmengen mit geringem Arbeitsspeicher, da nicht alle Daten auf einmal in den Speicher geladen werden. Beim SqlDataAdapter-Ansatz wird DataSet / DataTable also mit allen Daten gefüllt Es gibt viele Zeilen und Spalten, für deren Speicherung viel Speicher erforderlich ist.
Die Füllfunktion verwendet intern einen DataReader. Wenn Sie der Meinung sind, "Welches ist effizienter?", Ist die Verwendung eines DataReader in einer engen Schleife, die eine Sammlung Datensatz für Datensatz auffüllt, wahrscheinlich dieselbe Belastung für das System wie die Verwendung von DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)