2011-05-17 87 views
15

当我把这个代码:如何将数据从SQL Server提取到SqlDataReader?

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在OracleCommandOracleDataReader中提供了FetchSize属性,我理解为应该通过单次往返数据库预加载多少记录的定义。我想知道SQL Server是否以类似的方式工作,以及是否存在可以在某处配置的类似行为。我在SqlCommandSqlDataReaderCommandBehavior中没有找到任何这样的配置。

回答

9

将数据从SqlConnection.PacketSize属性中的大小的数据包从SQL Server传输到客户端。如果您的客户端无法足够快地读取结果,网卡上的缓冲区会被填满,协议会检测到这一点并停止接收,从而使sql server的网卡发送缓冲区已满并停止发送任何和所有数据。如果你想进入原始水平,那么请查看TDS protcol

+0

我做了[** this test **](http://i.imgur.com/K6IogT2.png),但是如果我将packetsize设置为最小值(负值?) - 它会显示1,7, 7,7,7,而不是1,2,3,4,5,6? – 2014-11-29 20:45:15

2

我相信网络通信的确切细节依赖于代码示例以外的许多事情,部分原因是因为SQL Server Connection Pooling,但我认为您正在寻找SqlConnection.PacketSize属性(MSDN)。

相关问题