2016-02-27 6 views
2

J'utiliseEst-ce que "connection.Close()" est le moyen le plus sûr ou le plus sûr de fermer une connexion SQL?

connection.Close(); 

Mais ceci est mon premier projet en .NET et je ne sais pas si je ferme correctement.

Je ne veux pas que mon site web meure instantanément après l'avoir diffusé sur un vrai hébergement.

D'habitude, je le fais de cette façon:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()); 

    SqlCommand cmd = new SqlCommand(); 

    cmd.Connection = conn; 

    // <some code> 

    conn.Open(); 
    /<some code> 
    conn.Close(); 
+0

Il est OK votre code, mais en utilisant est plus clairement –

Répondre

6

Vous devez placer la connexion dans une déclaration à l'aide;

using(var connection = new SqlConnection) 
{ 
    connection.Open(); 
    ...other code using it here. 
} 

L'instruction using garantit que SqlConnection est éliminée lorsque vous avez terminé. Dans votre scénario (en fonction de l'endroit où vous placez la méthode close), si une exception est fermée, elle n'atteindra jamais la méthode Close() et la connexion restera ouverte.

Encore mieux, puisque vous construisez un site web. Il devrait y avoir une méthode sur l'objet Request (qui devrait être disponible) appelée RegisterForDispose. Cela va automatiquement éliminer la connexion (qui la ferme) lorsque la requête se termine. Vous pouvez l'utiliser comme ceci:

var connection = new SqlConnection(); 
Request.RegisterForDispose(connection); 

Les deux accomplissent la même chose à la fin, mais la seconde permet plus de flexibilité.

+0

édité mon posté. C'est ce que vous vouliez dire? – Harugawa

+0

Oui, donc dans votre code si une exception est levée quelque part, la connexion ne se fermera pas. Il finira par le faire en tant que Garbage Collector à un moment donné, mais il est toujours préférable de faire en sorte que vous le fassiez soit en lançant un essai/finalement, soit en utilisant une instruction using. – kemiller2002

+0

+1 Le bloc using garantit la mise à la disposition correcte et à vie de la connexion, de ses flux sous-jacents et des boucles d'événements. , Close() est correct tant que vous le gérez correctement via les blocs Try-Finally. Au niveau procédural, la variable de connexion sortira de la portée après le retour quand même. –

2

Faites ce que Kevin a dit et mettre votre appel en .Open() à l'intérieur du bloc à l'aide:

using(var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString())) 
{ 
    var cmd = new SqlCommand("my sql command here", conn); 

    conn.Open(); 

    cmd.(whatever method you are using) 
}