C# DataReader是如何工作的?

C# DataReader是如何工作的?,c#,.net,asp.net,ado.net,C#,.net,Asp.net,Ado.net,我在想,如果没有与SQLServer的连接,SQLDataReader就不应该工作 我尝试过这个场景。我执行ExecuteReader,然后停止SQLServer服务,并尝试遍历DataReader。我所期望的是一个例外,但它一个接一个地给出了结果。理想情况下,DataReader应该从连接到DB服务器的流中一次读取一行,如果我们断开DB服务器的连接,哪个流应该引发异常 我不知道,我在这里遗漏了什么。我强烈怀疑读者一次读一批结果。这比一次一行的效率要高得多(想想这样的情况,一行只有几个字节……你

我在想,如果没有与SQLServer的连接,SQLDataReader就不应该工作

我尝试过这个场景。我执行ExecuteReader,然后停止SQLServer服务,并尝试遍历DataReader。我所期望的是一个例外,但它一个接一个地给出了结果。理想情况下,DataReader应该从连接到DB服务器的流中一次读取一行,如果我们断开DB服务器的连接,哪个流应该引发异常


我不知道,我在这里遗漏了什么。

我强烈怀疑读者一次读一批结果。这比一次一行的效率要高得多(想想这样的情况,一行只有几个字节……你不希望每行有一个网络数据包,因为它可以在一个数据包中检索到很多行)。它还可能允许数据库提前释放其内部资源——如果数据读取器已经读取了所有结果(当只有少数结果时),它可以有效地忘记查询


我怀疑,如果您在返回大量结果的查询中尝试相同类型的操作,您会得到预期的异常。

底层连接类型可能会影响一次提供的数据量。对于使用共享内存连接器的少量数据,很可能所有数据一起发送


当客户端和服务器在同一台机器上时,共享内存是默认协议。

它在后台读取它们,因为它在后台有时间。当您转到SQL Server并关闭连接时,所有数据都已在后台传输。当您执行读取器时,它会调用SQL Server,并告诉它开始发送结果。一旦查询完成执行(正确解析,查询有效),但在完成运行之前,它将返回。此时,您可以开始调用read方法。但是,它仍然在后台读取和缓冲数据,这样当您再次调用read时,下一行就准备好了,在缓冲区中等待,而不必转到数据库。

数据读取器一次读取一条记录,但它从底层数据库驱动程序读取它。数据库驱动程序以块的形式从数据库读取数据,通常使用8KB的缓冲区

如果您的结果记录很小,并且您得到的记录不多,那么它们将全部放入缓冲区中,数据库驱动程序将能够将它们全部提供给数据读取器,而无需向数据库请求更多数据

如果获取的结果大于缓冲区,则在数据库驱动程序需要向数据库请求更多数据之前,您只能读取结果的第一部分。此时,如果数据库不再可访问,则会出现异常。

Correct(),结果会尽快发送到客户端,这将使您打开到服务器的连接的入站网络缓冲区饱和。如果检索的数据不超过缓冲区所能容纳的数据量,则可以检索结果中的所有行。