2009-09-05 29 views
20

Estaba pensando que el SQLDataReader no debería funcionar si no hay conexión con el SQLServer.¿Cómo funciona DataReader?

He experimentado este escenario. Ejecuto el ExecuteReader, luego detengo el servicio SQLServer e intento iterar a través del DataReader. Lo que esperaba era una excepción, pero dio los resultados uno tras otro. Idealmente, el DataReader debería leer una fila a la vez desde la ruta que se conecta al servidor de base de datos y que debería lanzar una excepción si desconectamos el servidor de base de datos.

No sé, ¿Qué es lo que me falta aquí?

+3

¡Buen experimento! – smwikipedia

Respuesta

25

Sospecho que el lector lee un lote de resultados a la vez. Eso es mucho más eficiente que una fila a la vez (piense en la situación en la que una sola fila contiene solo unos pocos bytes ... no desea un paquete de red por fila cuando podría haber recuperado muchas filas en un solo paquete)) También permite potencialmente que la base de datos libere sus recursos internos temprano; si el lector de datos ha leído todos los resultados (cuando son pocos), puede olvidarse efectivamente de la consulta.

Sospecho que si prueba el mismo tipo de cosas con una consulta que devuelve muchos resultados, obtendrá la excepción esperada.

+5

Corregir (http://msdn.microsoft.com/en-us/library/ms187602.aspx), los resultados se envían al cliente lo más rápido posible, lo que saturará el búfer de red entrante para la conexión que ha abierto el servidor. Si no recupera más datos que los almacenados en ese búfer, podrá recuperar todas las filas en el resultado. –

+0

¡Buena explicación! – smwikipedia

+0

¿qué es el buffer de red? por favor explique. – Mou

4

El tipo de conexión subyacente puede afectar la cantidad de datos que se suministran a la vez. Para una pequeña cantidad de datos usando el conector de memoria compartida, es muy posible que todos los datos se envíen juntos.

La memoria compartida es el protocolo predeterminado cuando el cliente y el servidor están en la misma máquina.

3

Las lee porque tiene tiempo en segundo plano. En el momento en que ingresó al Servidor SQL y cerró la conexión, todos los datos se transfirieron en segundo plano. Lo que sucede cuando ejecuta el lector, es que llama a SQL Server y le dice que comience a enviar resultados. Tan pronto como la consulta termine de ejecutarse (se analiza correctamente, la consulta es válida), pero antes de que se termine de ejecutarse, regresa. En ese punto, puede comenzar a llamar al método de lectura. Sin embargo, todavía lee y almacena en búfer los datos en segundo plano, de modo que cuando vuelva a llamar, vuelva a leer, la siguiente fila está lista, esperando en el búfer, y no tiene que ir a la base de datos.

6

El lector de datos lee un registro a la vez, pero lo lee desde el controlador de base de datos subyacente. El controlador de la base de datos lee los datos de la base de datos en bloques, generalmente utilizando un búfer de 8 kilobytes.

Si los registros de resultados son pequeños y no obtiene muchos, todos encajarán en el búfer, y el controlador de la base de datos podrá alimentarlos al lector de datos sin tener que pedir más a la base de datos datos.

Si obtiene un resultado que es más grande que el búfer, solo podrá leer la primera parte del mismo, antes de que el controlador de la base de datos necesite solicitar más datos a la base de datos. En ese momento obtendrá una excepción si la base de datos ya no es accesible.

Cuestiones relacionadas