2013-12-10 130 views
2

我想問一下使用數據庫連接並關閉它們的常用方法。確保連接關閉

這是我的程序,但我在exeption中看到,connection.Close()將不會執行。

我應該使用try-catch爲整個塊嗎?因爲某些原因,我看到大多數人不會。

using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     { 
      using (SqlCommand command = new SqlCommand()) 
      { 
       command.CommandText = "procedure"; 

       command.Connection = connection; 

       command.CommandType = CommandType.StoredProcedure; 

       tmpParameter = DBUtils.createInSQLParam("@ImageID", SqlDbType.SmallInt, htmlImageId); 
       command.Parameters.Add(tmpParameter); 

       command.Connection.Open(); 

       using (SqlDataReader reader = command.ExecuteReader()) 
       { 
        htmlImageDetails = GetHtmlImageDetailsFromReader(reader, true, out newId); 

        reader.Close(); 
       } 

       connection.Close(); 

       return htmlImageDetails; 
      } 
     } 
+0

你看到什麼異常? –

+0

這似乎回答你的問題 - http://stackoverflow.com/a/4717802/978528。 – nickfinity

+0

使用「使用」連接時不需要關閉/閱讀器自動關閉。 .net默認使用連接池,因此如果將其置於池中以供重用(這可以提高大多數情況下的性能),則連接不會關閉。 – Peter

回答

5

你不必做明確的,因爲你的SqlConnection實例將始終置於(然後,連接關閉)感謝using語法糖。

2

我應該用一個try-catch整個塊?因爲某種原因 我看到大多數人不會。

號由於您使用using聲明,即轉化爲try-finally塊,所以即使發生異常,將確保妥善處置的對象。

using Statement (C# Reference)

using語句確保如果 發生異常,而你是調用對象的方法處置甚至調用。 您可以通過將對象放入try塊 然後在finally塊中調用Dispose來實現相同的結果;實際上,這是編譯器如何翻譯 使用語句。

SqlConnection.Dispose確保連接關閉。

爲了確保連接總是關閉,打開using塊的內部的連接 ,.......這樣做可以確保當代碼退出塊的連接 自動關閉。

2

您正在打開與using塊的連接,這意味着編譯器將確保在連接上調用Dispose(),該連接將調用Close()。所以不用擔心,即使在Exception的情況下,您也不需要Close()連接。