2010-04-21 16 views
14

¿El siguiente código deja la conexión abierta si hay una excepción?Forma correcta de cerrar la conexión de la base de datos en caso de excepción

Estoy usando una base de datos de edición compacta 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); 
} 

Sin duda, una forma mejor sería declarar un objeto de conexión antes de la prueba, establecer una conexión dentro del bloque try y cerrarla en un bloque 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(); 
} 

Respuesta

4
try 
catch 
finally 

es la forma correcta de manejar esto, debido a la conexión siempre debe estar cerrada al final. pero debe verificar no solo que conn != null, sino también si el estado conn no es Closed.

8

Uso Using

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

por qué no utilizar un uso alrededor de la conexión, así como el comando?

27

La forma en que está manejando SqlCeCommand en su código con la ayuda de un bloque using, podría hacer lo mismo con el SqlCeConnection.

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

Nota: Puede utilizar un bloque using para las clases que implementan IDisposable.

EDIT: Esto es igual que

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

Todavía no puedo envolver mi cabeza alrededor de esto. De la referencia: "Si el SqlCeConnection está fuera del alcance, no está cerrado. Debe cerrar explícitamente la conexión llamando a Close o Dispose". En su primer ejemplo, no "cierra explícitamente la conexión". –

+1

Al usar la instrucción 'using', llama al método' Dispose' en el objeto que se está utilizando, que a su vez llamaría al método 'Close', en el caso de' SqlCeConnection'. Utilice una herramienta como ILSpy para ver qué código se ejecuta cuando se invoca 'Dispose' en' SqlCeConnection'. Consulte la documentación [aquí] (http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx). – shahkalpesh

0

Debe utilizar using comunicado, que maneja el cierre conexión sin molestias http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

¿Qué pasa con otros conectores como el conector Mysql .net y otros? @Mamoo – Adrian

+0

Cualquier conector, como el proveedor Mysql.net * debería * (y probablemente sí) implementar IDisposable en objetos como Conexión y Comando, por lo que "usar" puede y debe estar allí también. Lo mismo ocurre con el acceso a archivos o cada vez que un objeto se cruza con código/recursos no administrados – plyawn

0

usted tiene que tratar siguiente manera. Debido a que la conexión se cierre en bloque finally

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 
} 
Cuestiones relacionadas