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();
}
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);
}
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 ()
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);
}
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);
}
Non, appeler Dispose () sur SqlConnection appelle également Close ().
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()
.
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)
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.