web-dev-qa-db-fra.com

SqlCommand avec instruction using

J'ai vu que dans la plupart des échantillons, SqlCommand était utilisé comme ceci

using (SqlConnection con = new SqlConnection(CNN_STRING))
{
    using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con))
    {
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);           
        return ds;
    }
}

Je sais pourquoi nous utilisons la déclaration "using". Mais SqlCommand n'inclut pas la méthode Close (), donc devrions-nous vraiment l'utiliser dans l'instruction using

20
Omer K

Parce qu'il implémente également IDisposable .

Le but de l'instruction Using est que lorsque le contrôle arrive à la fin de l'utilisation, il supprime cet objet de l'utilisation du bloc et libère de la mémoire. son but n'est pas seulement de fermer automatiquement la connexion, il disposera essentiellement de l'objet de connexion et, bien entendu, la connexion sera également fermée à cause de cela.

Son objectif est de libérer les ressources que nous avons utilisées dans l'instruction Using.

Selon ( MSDN:

En règle générale, lorsque vous utilisez un objet IDisposable, vous devez le déclarer et l'instancier dans une instruction using. L'instruction using appelle la méthode Dispose sur l'objet de la bonne manière et (lorsque vous l'utilisez comme indiqué précédemment), elle provoque également la sortie de l'objet lui-même dès que Dispose est appelé. Dans le bloc using, l'objet est en lecture seule et ne peut pas être modifié ou réaffecté.

L'instruction using garantit que Dispose est appelée même si une exception se produit pendant que vous appelez des méthodes sur l'objet. Vous pouvez obtenir le même résultat en plaçant l'objet dans un bloc try puis en appelant Dispose dans un bloc finally; en fait, c'est ainsi que l'instruction using est traduite par le compilateur. L'exemple de code précédent se développe dans le code suivant au moment de la compilation (notez les accolades supplémentaires pour créer la portée limitée de l'objet):

REMARQUE:

Vous pouvez instancier l'objet ressource, puis transmettre la variable à l'instruction using, mais ce n'est pas une meilleure pratique. Dans ce cas, l'objet reste dans la portée après que le contrôle quitte le bloc using même s'il n'aura probablement plus accès à ses ressources non gérées. En d'autres termes, il ne sera plus entièrement initialisé. Si vous essayez d'utiliser l'objet en dehors du bloc using, vous risquez de déclencher une exception. Pour cette raison, il est généralement préférable d'instancier l'objet dans l'instruction using et de limiter sa portée au bloc using.

28
Ehsan Sajjad

SqlCommand implémente IDisposable qu'une instruction using appellera .Dispose() avant la fin du bloc using. Je ne sais pas exactement ce que fait SqlCommand.Dispose(), mais c'est une bonne idée d'appeler .Dispose() sur une instance avec laquelle vous avez terminé, c'est-à-dire que cela effacera peut-être la connexion à la base de données.

5
Jason Evans