2010-04-21 4 views
14

Le code suivant laisse-t-il la connexion ouverte en cas d'exception? J'utilise une base de données Microsoft SQL compact edition.Manière correcte de fermer la connexion à la base de données en cas d'exception

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

Sûrement une meilleure façon serait de déclarer un objet de connexion avant l'essai, établir une connexion à l'intérieur du bloc try et fermer dans un bloc 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(); 
} 

Répondre

4
try 
catch 
finally 

est la bonne façon de gérer cela, car la connexion doit toujours être fermé à la fin. mais vous devez vérifier non seulement que conn != null, mais aussi si l'état conn n'est pas Closed.

8

Utilisez Using

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

Pourquoi ne pas utiliser un utilisant autour de la connexion ainsi que la commande?

27

La façon dont vous gérez SqlCeCommand dans votre code avec l'aide d'un bloc using, vous pouvez faire la même chose pour le SqlCeConnection.

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

Remarque: Vous pouvez utiliser un bloc using pour les classes qui mettent en œuvre IDisposable.

EDIT: C'est le même 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

Je ne peux toujours pas envelopper ma tête autour de cela. De la référence: "Si le SqlCeConnection est hors de portée, il n'est pas fermé.Vous devez fermer explicitement la connexion en appelant Close ou Dispose." Dans votre premier exemple, vous ne fermez pas explicitement la connexion. –

+1

Lors de l'utilisation de l'instruction 'using', elle appelle la méthode' Dispose' sur l'objet utilisé, qui à son tour appelle la méthode 'Close', dans le cas de' SqlCeConnection'. Utilisez un outil tel que ILSpy pour voir quel code est exécuté lorsque 'Dispose' est appelé sur' SqlCeConnection'. Voir la documentation [ici] (http://msdn.microsoft.com/en-us/library/bb300654%28v=vs.100%29.aspx). – shahkalpesh

0

Vous devez utiliser la déclaration using, qui gère la fermeture de connexion sans tracas http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

+0

Qu'en est-il des autres connecteurs comme le connecteur Mysql .net et autres. @Mamoo – Adrian

+0

Tout connecteur, comme le fournisseur Mysql.net * devrait (et probablement) implémenter IDisposable sur des objets comme Connection et Command, ainsi "using" peut être et devrait aussi être présent. Il en va de même pour l'accès aux fichiers ou à chaque fois qu'un objet se transforme en code/ressources non gérés – plyawn

0

Vous devez essayer de suivre Way. Parce que la connexion se termine en bloc enfin

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 
} 
Questions connexes