SqlDataAdapter vs SqlDataReader

Quali sono le differenze tra l’utilizzo di SqlDataAdapter vs SqlDataReader per ottenere i dati da un DB?

Sto esaminando in particolare i loro pro e contro così come le loro prestazioni di velocità e memoria.

Grazie

SqlDataReader:

  • Tiene la connessione aperta finché non hai finito (non dimenticarti di chiuderla!).
  • Solitamente può essere ripetuto solo una volta
  • Non è così utile per l’aggiornamento al database

D’altra parte, questo:

  • Ha solo un record in memoria alla volta piuttosto che un intero set di risultati (questo può essere enorme)
  • È più veloce che puoi ottenere per quella iterazione
  • Ti consente di iniziare a elaborare i risultati prima (una volta disponibile il primo record)

SqlDataAdapter / DataSet

  • Ti consente di chiudere la connessione non appena ha completato il caricamento dei dati e potrebbe persino chiuderla automaticamente
  • Tutti i risultati sono disponibili in memoria
  • È ansible scorrere su di esso tutte le volte che è necessario, o anche cercare un record specifico per indice
  • Ha alcune facoltà incorporate per l’aggiornamento al database

Al costo di:

  • Uso della memoria molto più alto
  • Attendi che tutti i dati vengano caricati prima di usarne uno

Quindi in realtà dipende da cosa stai facendo, ma preferisco un DataReader fino a quando non ho bisogno di qualcosa che è supportato solo da un set di dati. SqlDataReader è perfetto per il caso di accesso ai dati comune di associazione a una griglia di sola lettura.

La risposta a ciò può essere abbastanza ampia.

Essenzialmente, la principale differenza per me che di solito influenza le mie decisioni su quale usare è che con un SQLDataReader, si “fanno streaming” di dati dal database. Con un SQLDataAdapter, si stanno estraendo i dati dal database in un object che può essere ulteriormente interrogato, oltre a eseguire operazioni CRUD.

Ovviamente con un stream di dati SQLDataReader è MOLTO più veloce, ma è ansible elaborare solo un record alla volta. Con un SQLDataAdapter, si ha una raccolta completa delle righe corrispondenti alla query dal database per lavorare con / passare il codice.

ATTENZIONE: Se si utilizza un SQLDataReader, SEMPRE, SEMPRE, SEMPRE assicurarsi di scrivere codice corretto per chiudere la connessione poiché si sta mantenendo la connessione aperta con SQLDataReader. In caso contrario , o la corretta gestione degli errori per chiudere la connessione in caso di 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 avanzamento e collegamento rapido che tende ad essere generalmente più veloce rispetto al riempimento di un DataSet / DataTable.

Inoltre, con SqlDataReader, i dati vengono gestiti un record alla volta e non vengono memorizzati dati. Ovviamente con un DataTable o un DataSet, si dispone di un overhead di allocazione della memoria.

Se non hai bisogno di conservare i tuoi dati in memoria, quindi per il rendering solo roba, vai per SqlDataReader. Se vuoi gestire i tuoi dati in maniera disconnessa, scegli il DataAdapter per riempire un DataSet o DataTable.

Utilizzare un object SqlDataAdapter quando si desidera popolare un DataSet / DataTable in memoria dal database. Hai quindi la flessibilità di chiudere / eliminare la connessione, passare il datatable / set in memoria. È quindi ansible manipolare i dati e persistere nel DB utilizzando l’adattatore dati, in combinazione con InsertCommand / UpdateCommand.

Utilizzare un SqlDataReader quando si desidera un accesso rapido ai dati di impronte a memoria ridotta senza la necessità di flessibilità, ad esempio il passaggio dei dati alla logica aziendale. Questo è più ottimale per il recupero rapido e con poca memoria dei grandi volumi di dati poiché non carica tutti i dati in memoria tutti in una volta sola – con l’approccio SqlDataAdapter, il DataSet / DataTable sarà riempito con tutti i dati, quindi se ci sono un sacco di righe e colonne, che richiederanno molta memoria da tenere.