DataReader如何工作?

我认为如果没有与SQLServer的连接,SQLDataReader应该不起作用。

我试验了这个场景。 我执行ExecuteReader然后停止SQLServer服务并尝试迭代DataReader。 我所期待的是一个例外,但它一个接一个地给出了结果。 理想情况下,DataReader应该从连接到数据库服务器的流一次读取一行,如果我们断开数据库服务器,应该抛出exception?

我不知道,我在这里失踪的是什么。

我强烈怀疑读者一次读取一批结果。 这比一次一行更有效(想想单行只有几个字节的情况……当一行可以检索到单个数据包中的大量行时,你不希望每行有一个网络数据包)。 它还可能允许数据库尽早释放其内部资源 – 如果数据读取器已读取所有结果(当只有少数时),它可以有效地忘记查询。

我怀疑如果你用一个返回大量结果的查询尝试相同类型的东西,你会得到预期的exception。

数据读取器一次读取一条记录,但它从底层数据库驱动程序读取它。 数据库驱动程序通常使用8千字节的缓冲区以块为单位从数据库中读取数据。

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

如果获取的结果大于缓冲区,则只能在数据库驱动程序需要向数据库请求更多数据之前读取其第一部分。 那时,如果数据库不再可访问,您将收到exception。

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

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

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