DataReader(DbCommand)如何处理数据库通信?

时间:2016-03-16 10:38:41

标签: c# datareader dbconnection

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

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

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

1 个答案:

答案 0 :(得分:3)

从技术上讲,“它取决于”,因为DbDataReader是一个抽象类,可以以你认为合适的方式实现 - 包括缓冲整个结果。

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

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