2009-09-05 10 views
20

Stavo pensando che SQLDataReader non dovrebbe funzionare se non ci sono connessioni a SQLServer.Come funziona DataReader?

Ho sperimentato questo scenario. Eseguo ExecuteReader, quindi interrompendo il servizio SQLServer e tentando di 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 so, cosa mi manca qui.

+3

Buon esperimento! – smwikipedia

risposta

25

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 si tenta lo stesso tipo di cosa con una query che restituisce molti risultati, si otterrà l'eccezione prevista.

+5

corretto (http://msdn.microsoft.com/en-us/library/ms187602.aspx), i risultati vengono inviati al client il più velocemente possibile, il che saturerà il buffer di rete in entrata per la connessione aperta. il server. Se non si recuperano più dati di quelli consentiti dal buffer, sarà possibile recuperare tutte le righe nel risultato. –

+0

Buona spiegazione! – smwikipedia

+0

Cos'è il buffer di rete? spiegami. – Mou

4

Il tipo di connessione sottostante può influire sulla quantità di dati fornita alla volta. Per una piccola quantità di dati che utilizzano il connettore di memoria condivisa è possibile che tutti i dati vengano inviati insieme.

La memoria condivisa è il protocollo predefinito quando client e server si trovano sullo stesso computer.

3

Li legge come è il tempo in background. 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.

6

Il lettore di dati legge un record alla volta, ma lo legge dal driver di 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.

Problemi correlati