Risposte:
D'altra parte, esso:
Al costo di:
Quindi dipende davvero da cosa stai facendo, ma tendo a preferire un DataReader fino a quando non ho bisogno di qualcosa che è supportato solo da un set di dati. SqlDataReader è perfetto per il caso comune di accesso ai dati di associazione a una griglia di sola lettura.
Per ulteriori informazioni, consultare la documentazione ufficiale di Microsoft .
while (reader.Read())loop.
La risposta a questa può essere piuttosto ampia.
In sostanza, la differenza principale per me che di solito influenza le mie decisioni su cui utilizzare è che con un SQLDataReader, si "streaming" dati dal database. Con un SQLDataAdapter, si estraggono i dati dal database in un oggetto che può essere interrogato ulteriormente, oltre a eseguire operazioni CRUD.
Ovviamente con un flusso di dati SQLDataReader è MOLTO più veloce, ma è possibile elaborare solo un record alla volta. Con un SQLDataAdapter, hai una raccolta completa delle righe corrispondenti alla tua query dal database per lavorare / passare attraverso il tuo codice.
ATTENZIONE: se si utilizza SQLDataReader, SEMPRE, SEMPRE, SEMPRE assicurarsi di scrivere il codice corretto per chiudere la connessione poiché si mantiene aperta la connessione con SQLDataReader. In caso contrario , o la corretta gestione degli errori per chiudere la connessione in caso di un errore nell'elaborazione dei risultati, CRIPPLE l'applicazione con perdite di connessione.
Perdonate il mio VB, ma questa è la quantità minima di codice che dovreste avere quando usate un SqlDataReader:
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
C # equivalente:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
Un SqlDataAdapter viene in genere utilizzato per riempire un DataSet o DataTable e quindi si avrà accesso ai dati dopo che la connessione è stata chiusa (accesso disconnesso).
SqlDataReader è un cursore di sola andata veloce e connesso che tende a essere generalmente più veloce della compilazione di un DataSet / DataTable.
Inoltre, con un SqlDataReader, gestisci i tuoi dati un record alla volta e non conservi alcun dato in memoria. Ovviamente con un DataTable o DataSet, hai un overhead di allocazione della memoria.
Se non hai bisogno di conservare i tuoi dati in memoria, quindi solo per il rendering di cose, scegli SqlDataReader. Se si desidera gestire i dati in modo disconnesso, selezionare DataAdapter per compilare un DataSet o DataTable.
Utilizzare un SqlDataAdapter quando si desidera popolare un DataSet / DataTable in memoria dal database. Hai quindi la flessibilità di chiudere / eliminare la connessione, passare il datatable / impostare in memoria. È quindi possibile modificare i dati e reinserirli nel DB utilizzando l'adattatore dati, insieme a InsertCommand / UpdateCommand.
Utilizzare un SqlDataReader quando si desidera un accesso rapido e con ingombro ridotto di memoria senza la necessità di flessibilità, ad esempio per il passaggio dei dati nella logica aziendale. Questo è più ottimale per il recupero rapido e con poca memoria di grandi volumi di dati poiché non carica tutti i dati in memoria tutto in una volta - con l'approccio SqlDataAdapter, il DataSet / DataTable verrebbe riempito con tutti i dati, quindi se ci sono molte righe e colonne che richiedono molta memoria per contenere.
La funzione Fill utilizza internamente un DataReader. Se la tua considerazione è "Quale è più efficiente?", Allora l'utilizzo di un DataReader in un ciclo stretto che popola una raccolta record per record, probabilmente avrà lo stesso carico sul sistema dell'utilizzo di DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)