【问题标题】:How does DataReader (DbCommand) handle DB communication?DataReader (DbCommand) 如何处理 DB 通信?
【发布时间】:2016-07-02 04:31:51
【问题描述】:

在我试图理解的软件中,DataReader 类是通过 ExecuteReader() 从 IDbCommand 类型(继承)接收的。

我对 C# 和数据库通信还很陌生,所以:DataReader 如何处理与数据库的通信?

  • 在执行时是否接收到来自查询的全部响应 ExecuteReader(),然后在本地用 reader.Read() 单步执行响应?
  • 或者每个 reader.Read() 调用是否通过网络从数据库中获取下一项?
  • 或者,我没有想到的其他东西?

【问题讨论】:

标签: c# datareader dbconnection


【解决方案1】:

从技术上讲,“视情况而定”,因为DbDataReader 是一个抽象类,可以以任何你认为合适的方式实现——包括缓冲整个结果。

不过,实际上,界面是针对零碎阅读的,实现也是如此。如果我们以SqlDataReader 为例,对.ExecuteReader() 的初始调用将开始处理命令并导致服务器提供结果,然后对.Read() 的每次调用将通过网络获取一行。但是,并非每次调用.Read() 都必然涉及网络流量,因为多个行可能捆绑在一个数据包中,因此可以从缓冲区满足读取。

这同样适用于列,甚至——它们可能跨越网络数据包甚至包含流,因此所有 .GetX() 方法都可能涉及额外的网络往返(这就是为什么它们在 . NET 4.5 及更高版本)。

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多