DataReader如何工作?

时间:2009-09-05 18:03:21

标签: c# .net asp.net ado.net

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

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

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

4 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

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