2011-05-17 61 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)。

相關問題