c# - Come funziona DataReader?




.net asp.net (3)

Stavo pensando che SQLDataReader non dovrebbe funzionare se non ci sono connessioni a SQLServer.

Ho sperimentato questo scenario. Eseguo ExecuteReader, quindi interrompo il servizio SQLServer e provo a scorrere il DataReader. Quello che mi aspettavo era un'eccezione, ma ha dato i risultati uno dopo l'altro. Idealmente il DataReader dovrebbe leggere una riga alla volta dal flusso che viene connesso al server DB e quale dovrebbe generare un'eccezione se disconnettiamo il server DB?

Non lo so, cos'è che mi manca qui.


Ho il forte sospetto che il lettore legga una serie di risultati alla volta. È molto più efficiente di una riga alla volta (pensa alla situazione in cui una singola riga è solo pochi byte ... non vuoi un pacchetto di rete per riga quando potrebbe aver recuperato molte righe in un singolo pacchetto ). Inoltre, consente potenzialmente al database di rilasciare tempestivamente le proprie risorse interne - se il lettore di dati ha letto tutti i risultati (quando ce ne sono solo pochi) può effettivamente dimenticare la query.

Sospetto che se provi lo stesso tipo di cose con una query che restituisce molti risultati, otterrai l'eccezione prevista.


Il lettore di dati legge un record alla volta, ma lo legge dal driver del database sottostante. Il driver del database legge i dati dal database in blocchi, in genere utilizzando un buffer di 8 kilobyte.

Se i record dei risultati sono piccoli e non ne ottieni molti, si inseriranno tutti nel buffer e il driver del database sarà in grado di inviarli tutti al lettore di dati senza dover chiedere al database ulteriori dati.

Se si recupera un risultato più grande del buffer, sarà possibile leggere solo la prima parte, prima che il driver del database richieda ulteriori dati al database. A quel tempo si otterrà un'eccezione se il database non è più accessibile.


Li legge come ha il tempo in sottofondo. Quando sei andato su SQL Server e hai chiuso la connessione, tutti i dati sono stati trasferiti in background. Ciò che accade quando si esegue il lettore è che chiama SQL Server e dice di iniziare a inviare risultati. Non appena la query viene eseguita in esecuzione (viene analizzata correttamente, la query è valida), ma prima che venga completata, restituisce. A quel punto puoi iniziare a chiamare il metodo di lettura. Tuttavia, continua a leggere e bufferizzare i dati in background in modo che quando si richiama nuovamente la lettura, la riga successiva sia pronta, in attesa nel buffer e non debba andare al database.





ado.net