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();
}
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". –
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