2010-04-21 13 views
14

Il seguente codice lascia aperta la connessione se c'è un'eccezione?Modo corretto per chiudere la connessione al database in caso di eccezione

Sto utilizzando un database di Microsoft SQL Edition compatto.

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); 
} 

Sicuramente un modo migliore sarebbe dichiarare un oggetto di connessione prima della prova, stabilire una connessione all'interno del blocco try e chiuderlo in un blocco 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(); 
} 

risposta

4
try 
catch 
finally 

è il modo corretto di gestire, perché connessione deve sempre essere chiusa alla fine. ma dovresti controllare non solo quello conn != null, ma anche se lo stato conn non è Closed.

8

Usa Using

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

perché non utilizzare un utilizzo in tutto il collegamento così come il comando?

27

Il modo in cui si gestisce SqlCeCommand nel proprio codice con l'aiuto di un blocco using, è possibile fare lo stesso per SqlCeConnection.

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

Nota: È possibile utilizzare un blocco using per le classi che implementano IDisposable.

EDIT: Questo è lo stesso

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

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

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

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

+0

Non riesco ancora a capirlo. Dalla ref: "Se SqlCeConnection esce dall'ambito, non è chiuso. Devi chiudere esplicitamente la connessione chiamando Close o Dispose." Nel tuo primo esempio non "chiudi esplicitamente la connessione". –

+1

Quando si usa l'istruzione 'using', chiama il metodo' Dispose' sull'oggetto in uso, che a sua volta chiamerà il metodo 'Close', nel caso di' SqlCeConnection'. Utilizzare uno strumento come ILSpy per vedere quale codice viene eseguito quando 'Dispose' viene chiamato su' SqlCeConnection'. Vedere la documentazione [qui] (http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx). – shahkalpesh

0

Si dovrebbe usare using dichiarazione, che gestisce la chiusura di connessione senza problemi http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

Che dire di altri connettori come il connettore Mysql .net e altri. @Mamoo – Adrian

+0

Qualsiasi connettore, come il provider Mysql.net * dovrebbe * (e probabilmente lo fa) implementare IDisposable su oggetti come Connection e Command, quindi "using" può essere e dovrebbe essere anche lì. Lo stesso vale per l'accesso ai file o ogni volta che un oggetto attraversa codice/risorse non gestiti – plyawn

0

dovete provare modo seguente. Perché Connessione Chiudi infine Blocco

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 
} 
Problemi correlati