2009-09-05 34 views
20

我在想,如果沒有連接到SQLServer,SQLDataReader不應該工作。DataReader如何工作?

我試驗過這種情況。我執行ExecuteReader,然後停止SQLServer服務並嘗試遍歷DataReader。我所期望的是一個例外,但它一個接一個地給出了結果。理想情況下,DataReader應該從連接到數據庫服務器的流中一次讀取一行,如果我們斷開數據庫服務器,應該拋出異常。

我不知道,這是什麼,我在這裏失蹤。

+3

好實驗! – smwikipedia 2012-09-27 16:09:09

回答

25

我強烈懷疑讀者一次讀取一批結果。這比一次一行更有效率(考慮單行只有幾個字節的情況......當它可以在單個數據包中檢索大量行時,您不希望每行有一個網絡數據包)。它還可能允許數據庫儘早釋放其內部資源 - 如果數據讀取器已經讀取了所有結果(只有少數幾個結果),它可以有效地忘記查詢。

我想,如果你嘗試用一個查詢返回大量結果相同類型的東西,你會得到預期的異常。

+5

正確(http://msdn.microsoft.com/zh-cn/library/ms187602.aspx),結果會盡快發送到客戶端,這會使您打開的連接的入站網絡緩衝區飽和服務器。如果您沒有檢索到比緩衝區容納的數據更多的數據,您將能夠檢索結果中的所有行。 – 2009-09-05 18:36:16

+0

很好的解釋! – smwikipedia 2012-09-27 16:08:02

+0

什麼是網絡緩衝區?大衆解釋。 – Mou 2013-08-03 19:30:07

4

底層連接類型可能會影響一次提供多少數據。對於使用共享內存連接器的少量數據,很可能所有數據一起發送。

共享存儲器是默認的協議時,客戶端和服務器是在同一臺機器上。

3

它讀取它們,因爲它有時間在後臺。當你到SQL Server並關閉連接時,所有數據都在後臺傳輸過來。當你執行閱讀器時會發生什麼,它會調用SQL Server,並告訴它開始發送結果。一旦查詢完成執行(解析正確,查詢有效),但在它完成運行之前,它將返回。在這一點上,你可以開始調用讀取方法。但是,它仍會在後臺讀取和緩衝數據,以便在再次調用讀取時,下一行已準備就緒,正在緩衝區中等待,並且不必訪問數據庫。

6

數據讀取器讀取在時間的記錄,但它從底層數據庫驅動程序讀取它。數據庫驅動程序以塊的形式從數據庫中讀取數據,通常使用8千字節的緩衝區。

如果你的結果記錄很小並且你沒有很多,它們將全部放在緩衝區中,數據庫驅動程序將能夠將它們全部提供給數據閱讀器,而無需向數據庫詢問更多數據。

如果取結果,該結果比緩衝區大,你只能夠讀取它的第一部分,之前的數據庫驅動程序需要查詢數據庫,更多的數據。如果數據庫不再可訪問,那麼您將會遇到異常。