2011-05-17 11 views
15

Cuando llamo a este código:¿Cómo funciona la recuperación de datos de 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 
     } 
    } 
} 

lo que sucede internamente? ¿Cómo funciona esto a nivel de red? ¿Realizará un nuevo viaje de ida y vuelta a la base de datos para cada llamada al Read o hay alguna lectura por lotes implementada internamente?

Lo digo porque acabo de leer que ofrece ODP.NET FetchSize característica en tanto OracleCommand y OracleDataReader que entiendo como la definición de la cantidad de registros debe ser precargado por viaje sola vuelta a la base de datos. Me pregunto si SQL Server funciona de manera similar y si existe algún comportamiento similar que se pueda configurar en algún lugar. No encontré ninguna configuración de este tipo en SqlCommand, SqlDataReader o CommandBehavior.

Respuesta

9

los datos se transmiten desde el servidor sql al cliente en los paquetes del tamaño en la propiedad SqlConnection.PacketSize. Si su cliente no puede leer los resultados lo suficientemente rápido como para llenar el búfer de la tarjeta de red, el protocolo lo detecta y deja de recibir, lo que a su vez hace que el búfer de envío de la tarjeta de red del servidor sql se cancele y deja de enviar todos los datos. si quiere bajar al nivel de protocolo, consulte TDS protcol.

+0

Hice [** esta prueba **] (http://i.imgur.com/K6IogT2.png), pero si configuro packetsize en el valor más pequeño (¿negativo?) - ¿me mostraría 1,7? 7,7,7, en lugar de 1,2,3,4,5,6? –

2

Creo que los detalles exactos de las comunicaciones de red dependen de muchas cosas fuera de su código de ejemplo, en parte debido a la SQL Server Connection Pooling, pero creo que está buscando el SqlConnection.PacketSize propiedad (MSDN).

Cuestiones relacionadas