如何从SQL Server获取数据到SqlDataReader?

时间:2011-05-17 15:43:24

标签: .net sql-server oracle ado.net odp.net

当我调用此代码时:

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在FetchSizeOracleCommand中都提供了OracleDataReader属性,我理解为定义了应该通过单轮预加载多少条记录去数据库。我想知道SQL Server是否以类似的方式工作,并且是否存在可以在某处配置的类似行为。我在SqlCommandSqlDataReaderCommandBehavior中找不到任何此类配置。

2 个答案:

答案 0 :(得分:11)

数据在SqlConnection.PacketSize属性中以大小的数据包从sql server流式传输到客户端。如果你的客户端无法快速读取结果,网卡上的缓冲区就会被填满,协议会检测到并停止接收,从而使sql server的网卡发送缓冲区已满,并停止发送任何和所有数据。如果您想要进入protocl级别,请查看TDS protcol

答案 1 :(得分:2)

我认为网络通信的确切细节取决于代码示例之外的很多内容,部分原因是SQL Server Connection Pooling,但我认为您正在寻找{{1} property(MSDN)。