当我调用此代码时:
using (var connection = new SqlConnection(connectionString))
{
var command = new SqlCommand("SELECT * FROM Table", connection);
connection.Open();
using (var reader = command.ExecuteReader())
{
while(reader.Read())
{
// Do something here
}
}
}
内部会发生什么?这在网络层面如何运作?是否会为每次Read
调用重新启动数据库,或者内部是否有批量读取?
我问的是因为我刚刚读到ODP.NET在FetchSize
和OracleCommand
中都提供了OracleDataReader
属性,我理解为定义了应该通过单轮预加载多少条记录去数据库。我想知道SQL Server是否以类似的方式工作,并且是否存在可以在某处配置的类似行为。我在SqlCommand
,SqlDataReader
或CommandBehavior
中找不到任何此类配置。
答案 0 :(得分:11)
数据在SqlConnection.PacketSize属性中以大小的数据包从sql server流式传输到客户端。如果你的客户端无法快速读取结果,网卡上的缓冲区就会被填满,协议会检测到并停止接收,从而使sql server的网卡发送缓冲区已满,并停止发送任何和所有数据。如果您想要进入protocl级别,请查看TDS protcol。
答案 1 :(得分:2)
我认为网络通信的确切细节取决于代码示例之外的很多内容,部分原因是SQL Server Connection Pooling,但我认为您正在寻找{{1} property(MSDN)。