2010-04-21 94 views
14

如果發生異常,以下代碼是否使連接保持打開狀態?在發生異常時關閉數據庫連接的正確方法

我正在使用Microsoft SQL精簡版數據庫。

try 
{ 
    SqlCeConnection conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 

    conn.Close(); 
} 
catch (Exception ex) 
{ 
    ExceptionManager.HandleException(ex); 
} 

當然,更好的方法是在try之前聲明一個連接對象,在try塊中建立一個連接並關閉它在finally塊中?

SqlCeConnection conn = null; 
try 
{ 
    conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 
} 
catch (Exception ex) 
{ 
    ExceptionManager.HandleException(ex); 
} 
finally 
{ 
    if(conn != null) conn.Close(); 
} 

回答

4
try 
catch 
finally 

是來處理這個正確的方式,因爲連接應該總是在年底前關閉。但是您不僅應該檢查conn != null,還應該檢查conn狀態不是Closed

8

使用Using

using(SqlConnection conn = new SqlConnection()) 
{ 
//put all your code here. 
} 
0

爲什麼不利用周圍的連接以及該命令使用?

27

通過using塊的幫助,您在代碼中處理SqlCeCommand的方式,您可以對SqlCeConnection執行相同的操作。

SqlCeConnection conn; 
using (conn = new SqlCeConnection(ConnectionString)) 
{ 
    conn.Open(); 
    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
    // do some stuff 
    } 
} 

注意:您可以使用using塊實現IDisposable類。

編輯:這是一樣的

try 
{ 
    conn = new SqlCeConnection(ConnectionString); 
    conn.Open(); 

    SqlCeCommand cmd = conn.CreateCommand(); 
    cmd.CommandText = "..."; 

    cmd.ExecuteNonQuery(); 
} 
finally 
{ 
    conn.Close(); 
} 

裁判:http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection%28VS.80%29.aspx

+0

我還是不能包住我的頭。從ref:「如果SqlCeConnection超出範圍,它不會關閉,您必須通過調用Close或Dispose來顯式關閉連接。」 在你的第一個例子中,你沒有「明確關閉連接」。 – 2014-10-23 09:59:55

+1

當使用'using'語句時,它會調用正在使用的對象的Dispose方法,如果使用'SqlCeConnection',則會調用'Close'方法。在'SqlCeConnection'上調用'Dispose'時,使用ILSpy等工具來查看執行哪些代碼。請參閱文檔[此處](http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx)。 – shahkalpesh 2014-10-23 17:27:08

0

你應該使用using語句,它處理不麻煩 http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

其他連接器如Mysql .net連接器和其他連接器如何? @Mamoo – Adrian 2013-05-22 07:03:27

+0

任何連接器,如Mysql.net提供程序*都應該*(可能確實)在Connection和Command之類的對象上實現IDisposable,所以「using」可以也應該在那裏。文件訪問或對象跨越非託管代碼/資源時也是如此 – plyawn 2015-03-30 16:34:07

0

你必須嘗試以下方式關閉連接。 因爲連接關閉在最後一塊

try 
{ 
    SqlCeConnection conn = new SqlCeConnection(ConnectionString); 

    conn.Open(); 

    using (SqlCeCommand cmd = 
     new SqlCeCommand("SELECT stuff FROM SomeTable", conn)) 
    { 
     // do some stuff 
    } 
} 
catch (Exception ex) 
{ 

} 
finally 
{ 
\\close connection here 
} 
相關問題