2009-06-26 102 views
4

主要編輯: 我誤讀了文章!該評論是關於該類的finalize方法,而不是finally塊:)。道歉。爲什麼不關閉數據庫連接在最後的塊

我只是讀到你不應該在finally塊中關閉或處理數據庫連接,但文章沒有解釋爲什麼。我似乎無法找到明確的解釋,爲什麼你不想這樣做。

Here is the article

+1

您可以鏈接回原來的文章 – 2009-06-26 15:25:02

+0

我想你應該把文章的鏈接,如果是在線 – 2009-06-26 15:25:22

回答

13

如果你環顧四周,關閉finally塊的連接是這樣做的推薦方式之一。您正在查看的文章可能建議在使用該連接的代碼周圍使用「使用」語句。

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = connection.CreateCommand(); 

    command.CommandText = "select * from someTable"; 

    // Execute the query here...put it in a datatable/dataset 
} 

'using'語句將確保Connection對象在需要時立即處理,而不是等待垃圾收集器處理它。

4

我不同意你不應該在finally塊中關閉或處理數據庫連接。

讓一個未處理的(甚至是處理該事件)異常保留打開的連接,如果它有很多活動,可以非常快速地關閉數據庫。

關閉數據庫連接是爲什麼要使用finally語句恕我直言的事實例子。當然,使用聲明是我的首選方法,也許是原作者的意圖。

編輯到主編輯: 現在有道理。你不想離開你的數據庫連接直到垃圾收集器。

3

沒有原來的文章,我不能爲作者說話。然而,根據你如何實現實例化和打開與你的try/catch/finally塊有關的連接,你可能需要在調用close之前做一些額外的檢查。例如,確保連接不爲空並且尚未關閉。

編輯:文章說,不要在你的Finalize方法中處理連接對象,而不要在finally塊中關閉它。事實上,在上面的段落中,它表示在使用它之後應始終關閉連接,以便將其返回到連接池。

「小心建議您在完成使用後始終關閉連接,以便將連接返回到池中。可以使用Connection對象的Close或Dispose方法來完成此操作。沒有顯式關閉的連接可能不會被添加或返回到池中,例如,超出範圍但未顯式關閉的連接只會在達到最大池大小時纔會返回到連接池,並且連接仍然有效

注意不要在類的Finalize方法中的Connection,DataReader或任何其他託管對象上調用Close或Dispose。在終結器中,只能釋放類所擁有的非託管資源。 如果你的類不擁有任何非託管資源,不要在類定義中包含Finalize方法。有關詳細信息,「

http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx?ppud=4

2

谷歌搜索一點點變成了持有的oppositeopinion相當幾頁。使用‘最後’塊似乎是一個很好的方式,以確保連接始終關閉雖然正如其他人所說,我會有興趣看到原來的文章,說這不是一個好主意。

2

從我可以看到在文章中它建議反對調用處置或關閉在終結器一個類,而不是在最後一塊阻止,這是完全不同的事情。

0

Close方法將連接對象置於可重新打開的狀態。 Dispose方法將其置於不能重新打開的狀態(如果當前打開,則首先關閉它)。

如果你實例化一個連接,打開它,使用它,然後把它扔掉(正常的使用模式),然後using塊是最好和最簡單的方法來做到這一點。

很明顯,如果你正在做一些更復雜的事情,需要調用多個OpenClose,那麼處置它會拋出一個扳手。