【发布时间】:2023-12-31 03:48:01
【问题描述】:
我在想如果没有与 SQLServer 的连接,SQLDataReader 不应该工作。
我试验了这种情况。我执行 ExecuteReader 然后停止 SQLServer 服务并尝试遍历 DataReader。我所期望的是一个例外,但它一个接一个地给出了结果。理想情况下,DataReader 应该从连接到数据库服务器的流中一次读取一行,如果我们断开数据库服务器,应该抛出异常?
我不知道,我在这里缺少什么。
【问题讨论】:
我在想如果没有与 SQLServer 的连接,SQLDataReader 不应该工作。
我试验了这种情况。我执行 ExecuteReader 然后停止 SQLServer 服务并尝试遍历 DataReader。我所期望的是一个例外,但它一个接一个地给出了结果。理想情况下,DataReader 应该从连接到数据库服务器的流中一次读取一行,如果我们断开数据库服务器,应该抛出异常?
我不知道,我在这里缺少什么。
【问题讨论】:
我强烈怀疑读者一次会读取一批结果。这比一次一行效率高得多(想想单行只有几个字节的情况......你不希望每行都有一个网络数据包,因为它可以在一个数据包中检索很多行)。它还可能允许数据库提前释放其内部资源 - 如果数据读取器已读取所有结果(当只有少数结果时),它可以有效地忘记查询。
我怀疑如果您尝试使用返回大量结果的查询进行相同类型的操作,您会得到预期的异常。
【讨论】:
数据读取器一次读取一条记录,但它从底层数据库驱动程序读取它。数据库驱动程序以块的形式从数据库中读取数据,通常使用 8 KB 的缓冲区。
如果您的结果记录很小并且您没有得到很多,它们将全部放入缓冲区中,并且数据库驱动程序将能够将它们全部提供给数据读取器,而无需向数据库询问更多数据.
如果您获取的结果大于缓冲区,您将只能读取它的第一部分,然后数据库驱动程序需要向数据库请求更多数据。届时,如果数据库不再可访问,您将收到异常。
【讨论】:
底层连接类型可能会影响一次提供多少数据。对于使用共享内存连接器的少量数据,很有可能将所有数据一起发送。
当客户端和服务器在同一台机器上时,共享内存是默认协议。
【讨论】:
它在后台有时间读取它们。当您转到 SQL Server 并关闭连接时,所有数据都已在后台传输。当您执行阅读器时会发生什么,它会调用 SQL Server,并告诉它开始发送结果。一旦查询完成执行(正确解析,查询有效),但在完成运行之前,它会返回。此时,您可以开始调用 read 方法。但是,它仍然在后台读取和缓冲数据,这样当你再次调用 read 时,下一行就准备好了,在缓冲区中等待,而不必去数据库。
【讨论】: