2011-05-17 2 views
15

Quando chiamo questo codice:Come funziona il recupero dei dati da SQL Server a SqlDataReader?

using (var connection = new SqlConnection(connectionString)) 
{ 
    var command = new SqlCommand("SELECT * FROM Table", connection); 
    connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
     while(reader.Read()) 
     { 
      // Do something here 
     } 
    } 
} 

cosa succede internamente? Come funziona a livello di rete? Effettuerà un nuovo round trip nel database per ogni chiamata a Read o è stata eseguita la lettura di batch internamente?

sto chiedendo perché ho appena letto che ODP.NET fornisce FetchSize proprietà sia in OracleCommand e OracleDataReader che capisco come definizione di quanti record devono essere precaricati da sola andata e ritorno per il database. Mi chiedo se SQL Server funzioni in modo simile e se esiste un comportamento simile che può essere configurato da qualche parte. Non ho trovato alcuna configurazione di questo tipo in SqlCommand, SqlDataReader o CommandBehavior.

risposta

9

i dati vengono trasmessi dal server sql al client nei pacchetti della dimensione nella proprietà SqlConnection.PacketSize. Se il client non è in grado di leggere i risultati abbastanza velocemente, il buffer sulla scheda di rete viene riempito, il protocollo lo rileva e smette di ricevere, il che a sua volta rende pieno il buffer della scheda di rete di SQL Server e interrompe l'invio di tutti i dati. se vuoi scendere al livello di protocl, controlla TDS protcol.

+0

Ho fatto [** questo test **] (http://i.imgur.com/K6IogT2.png), ma se ho impostato il pacchetto al valore più piccolo (negativo?) - mi mostrerebbe 1,7, 7,7,7, invece di 1,2,3,4,5,6? –

2

Credo che i dettagli esatti delle comunicazioni di rete dipendono da un sacco di cose al di fuori del tuo esempio di codice, in parte a causa della SQL Server Connection Pooling, ma penso che tu stai cercando il SqlConnection.PacketSize proprietà (MSDN).