¿Cómo funciona DataReader?

Estaba pensando que SQLDataReader no debería funcionar si no hay conexión con SQLServer.

Experimenté este escenario. Ejecuto el ExecuteReader, luego detengo el servicio SQLServer e bash 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í?

Sospecho fuertemente 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.

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 solicitar más datos a la base de 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.

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.

Los 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.