2009-06-02 152 views
2

如果在使用該連接的SqlDataReader上調用Close()之前調用SqlConnection對象上的Close(),會發生什麼情況?如果在SqlDataReader之前關閉SqlConnection,會發生什麼情況?

其實,我真正想知道的是,關閉它們的順序是否重要。調用SqlConnection.Close()是否完全關閉連接,或者如果您沒有使用該連接在SqlDataReader上調用Close(),它會保持打開狀態嗎?

對多個問題抱歉,但我不認爲我真的瞭解連接關閉如何工作。

回答

12

它會關閉連接(將其返回到池),並且SqlDataReader會拋出一個異常(System.InvalidOperationException)以防以後使用它。

+1

非常快的響應+1 – ichiban 2009-06-02 19:07:53

+0

因此,如果您之後只想關閉SqlConnection,那麼是否有任何理由打擾關閉SqlDataReader?這聽起來像只關閉SqlConnection是安全的。是這樣嗎? – Ender 2009-06-02 19:11:47

+2

@Ender,正確的做法是關閉它。關閉連接並不好。可能吧,無論如何,你應該使用`using`語句。 – 2009-06-02 19:13:34

8

而不是擔心如何關閉它們的順序,爲什麼不把它們包裝在使用語句中。

// the following code has parts left out for brevity... 
using(var conn = new SqlConnection(...)) 
using(var cmd = new SqlCommand(...)) 
{ 
    conn.Open(); 

    using(var reader = cmd.ExecuteReader()) 
    { 
     // do whatever with the reader here... 
    } 
} 

using語句確保您的對象已關閉,並且如果相應地嵌套它們,則按正確的順序。有關更多信息,請參閱http://msdn.microsoft.com/en-us/library/yh598w02.aspx

3

當您關閉/處理對象SqlConnection時,實際的數據庫連接將關閉(返回到池),因此數據庫資源是安全的。

但是,您也應該關閉/處理SqlDataReader,否則它將保留對SqlConnection對象的引用,並將它們保留在內存中。如果您不這樣做,最終終結器將丟棄SqlDataReader對象,然後還可以收集對象,但是您無法控制何時發生這種情況。

SqlDataReader在關閉連接後可以部分使用,但沒有什麼是您真正可以依賴的。它的緩衝區中仍然有一些數據,所以有些操作可能會起作用,但是任何需要數據庫更多數據的操作都會導致異常。

相關問題