Dot-Net

從 SQL Server 獲取數據到 SqlDataReader 的工作原理是什麼?

  • May 17, 2011

當我呼叫此程式碼時:

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.NETFetchSize在兩者中都提供了屬性,OracleCommand並且OracleDataReader我將其理解為對單次往返數據庫應預載入多少記錄的定義。我想知道 SQL Server 是否以類似的方式工作,以及是否可以在某處配置一些類似的行為。我沒有在SqlCommand,SqlDataReader或中找到任何這樣的配置CommandBehavior

數據以 SqlConnection.PacketSize 屬性中大小的數據包從 sql server 流式傳輸到客戶端。如果您的客戶端無法足夠快地讀取結果,則網卡上的緩衝區被填滿,協議會檢測到這一點並停止接收,這反過來會使 sql server 的網卡發送緩衝區滿,並停止發送任何和所有數據。如果您想深入到 protocl 級別,請查看TDS protcol 。

引用自:https://stackoverflow.com/questions/6033451