112 votes

Dois-je Fermer() une occurrence de SQLConnection avant, il est éliminé?

Pour mon autre question porte ici sur les objets Jetables, devrions-nous appeler Close() avant la fin de l'aide du bloc?

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

106voto

CMS Points 315406

Puisque vous avez l'aide du bloc, la méthode dispose de l'SQLCommand sera appelée, et elle va fermer 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);
}

25voto

statenjason Points 3635

Démontage de SqlConnection de l'aide .NET Réflecteur:

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()

20voto

Thomas Bratt Points 10738

Le mot-clé using va fermer la connexion correctement de sorte que l'appel supplémentaire à Proximité n'est pas nécessaire.

De l'article MSDN sur SQL Server pool de Connexion:

"Nous vous recommandons fortement de toujours fermer la connexion lorsque vous êtes fini de l'utiliser, de sorte que le la connexion sera retourné à l' piscine. Vous pouvez le faire en utilisant soit le Près ou de Disposer de méthodes de la Objet de connexion, ou par l'ouverture de tous les les connexions à l'intérieur d'une instruction d'utilisation en C#"

La mise en œuvre effective de SqlConnection.Disposer à l'aide .NET Réflecteur est comme suit:

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

5voto

Aaron Daniels Points 6052

À l'aide de Réflecteur, vous pouvez voir que l' Dispose méthode de SqlConnection ne fait appel Close();

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

3voto

Jason Evans Points 15732

Non, l'Utilisation de bloquer les appels Dispose() pour vous de toute façon, donc il n'est pas nécessaire d'appeler Close().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X