2009-09-27 47 views
6

我使用ADO.Net + C#+ VSTS 2008 + ADO.Net連接到SQL Server 2008 Enterprise。我使用的是與此處提到的幾乎相同的模式/示例 - 使用ADO.Net DataReader通過一個條目(行)檢索數據一個條目(行)。ADO.Net DataReader超時問題

http://msdn.microsoft.com/en-us/library/haa3afyz.aspx

我的問題是,如果我在此示例中設置的SqlCommand超時, 1.我認爲超時適用於我們能有多少時間最大值用於檢索一個specifc行,而不是總整個數據輸入循環的超時時間?

BTW:環路我的意思是,

while (reader.Read()) 
{ 
    Console.WriteLine("{0}\t{1}", reader.GetInt32(0), 
     reader.GetString(1)); 
} 

2. 和超時只在乎它需要多少時間從數據庫中獲取的數據輸入,以及超時無關用多少時間,我們處理(例如,如果我們將超時設置爲20秒,並且如果從數據庫檢索一個數據條目需要1秒,並且我的應用程序邏輯需要30秒來操縱數據條目,則超時將永遠不會發生)。

正確理解?

回答

10

您可以設置的命令超時適用於您給ADO.NET執行其任務所用的時間。

如果您調用cmdQuery.ExecuteNonQuery(),它不返回任何內容,而是執行SQL語句,則需要執行該語句。

如果您致電cmdQuery.ExecuteReader()返回數據讀取器,那麼ADO.NET需要時間來構建數據讀取器,以便您可以使用它。

如果您致電cmdQuery.ExecuteScalar(),它會返回單個標量值,那麼執行查詢並獲取單個結果所需的時間。

如果您使用dataAdapter.Fill()填充數據表或數據集,那麼ADO.NET檢索數據並填充數據表或數據集所需的時間就是這樣。

因此總體而言:超時適用於ADO.NET可以執行的部分工作 - 執行語句,填充數據集,返回標量值。

當然它適用於需要來遍歷這些結果的時間(在數據讀取器的情況下)。這是沒有意義可言......

馬克

+0

感謝Marc,1.你的意思是DataReader的場景,當我收到DataReader實例時,超時不會有任何影響? 2.如果是,我的困惑是,在DataReader之前我讀了一些文檔,ADO.Net以流式方式檢索數據,即在創建DataReader時並不是從SQL Server檢索所有數據。如果這是真的,那麼ADO.Net客戶端和SQL Server服務器端之間應該有更多的傳輸?但是正如你所說的那樣,超時在DataReader創建後不會再受到影響,所以沒有超時控制用於進一步的數據流傳輸? – George2 2009-09-28 04:15:50

+0

我對我的上述評論的關注是,來客戶將持有DataReader很長一段時間,我認爲在流模式下(因爲ADO.Net無法預測客戶端是想讀取更多數據還是隻是打破閱讀器循環),所以連接將始終保持活動狀態。我想對這種行爲有一個超時控制,迫使這種長時間的閱讀器關閉/釋放ADO.Net的連接。任何似乎SqlCommand(用於創建DataReader)超時不是我在找什麼?謝謝。 – George2 2009-09-28 04:19:39

+1

您是絕對正確的:如果您長時間保持DataReader打開狀態,則底層連接將在同一時間保持打開狀態。有沒有超時阻止你這樣做 - 這是你的責任,以確保你不會這麼長時間 – 2009-09-28 04:50:27

2

是的你是對的。 CommandTimeout表示數據庫執行命令所需的時間(任何命令)

+0

什麼讓我困惑,對於DataReader的SqlCommand的,我們可以通過一個檢索數據輸入一個,但對於其他類型的SqlCommand,我們在同一時間檢索數據。因此,對於DataReader,超時僅適用於一個數據輸入,而不適用於整個數據輸入檢索循環?感謝您能否確認。 :-) – George2 2009-09-27 17:44:57