web-dev-qa-db-fra.com

Dois-je fermer () une connexion SQLConnection avant de la supprimer?

Par mon autre question ici sur les objets jetables , devrions-nous appeler Close () avant la fin d'un bloc using?

using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
    command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
    command.CommandType = System.Data.CommandType.Text;

    connection.Open();
    command.ExecuteNonQuery();

    // Is this call necessary?
    connection.Close();
}
110
John Bubriski

Puisque vous avez un bloc using, la méthode Dispose de la commande SQLCommand sera appelée et elle fermera la connexion:

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}
105
CMS

Désassemblage de SqlConnection à l'aide de . NET Reflector :

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }

    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

Il appelle Close () à l'intérieur de Dispose ()

24
statenjason

Le mot-clé using fermera la connexion correctement, de sorte que l'appel supplémentaire à Close n'est pas nécessaire.

De l'article MSDN sur regroupement de connexions SQL Server :

"Nous vous recommandons vivement de toujours fermer la connexion lorsque vous avez fini de l'utiliser afin que la connexion soit renvoyée au pool. Vous pouvez le faire à l'aide des méthodes Close ou Dispose de l'objet Connection, ou en ouvrant toutes les connexions à l'intérieur d'une instruction using en C # "

L'implémentation réelle de SqlConnection.Dispose à l'aide de . NET Reflector est la suivante:

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}
19
Thomas Bratt

En utilisant Reflector , vous pouvez voir que la méthode Dispose de SqlConnection appelle en fait Close();

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}
5
Aaron Daniels

Non, appeler Dispose () sur SqlConnection appelle également Close ().

MSDN - SqlConnection.Dispose ()

3
Justin Niessner

Non, le fait d'utiliser le bloc appelle Dispose() pour vous de toute façon, il n'est donc pas nécessaire d'appeler Close().

3
Jason Evans

Non, il n'est pas nécessaire de fermer une connexion avant d'appeler Dispose.

Certains objets (comme SQLConnections) peuvent être réutilisés après avoir appelé Close, mais pas après avoir appelé Dispose. Pour les autres objets, l'appel de Close revient à appeler Dispose. (ManualResetEvent et Streams je pense se comporter comme ça)

2
pipTheGeek

Non, la classe SqlConnection hérite d'IDisposable et lorsque la fin de l'utilisation (pour l'objet de connexion) est rencontrée, elle appelle automatiquement Dispose sur la classe SqlConnection.

1
blparker