todos los formularios formulario estado conexión cerró cerrar boton aplicacion anterior actual abrir abiertos abierta c# asp.net using sqlconnection sqlcommand

c# - los - ¿Debo cerrar() un SQLConnection antes de que se elimine?



cerrar todos los formularios abiertos c# (8)

Según mi otra pregunta aquí sobre Objetos desechables , ¿debemos llamar a Cerrar () antes del final de un bloque de uso?

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


Como tiene un bloque que usa, se llamará al método Dispose de SQLCommand y se cerrará la conexión:

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


Desmontaje de SqlConnection del uso 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); }

Llama a Close () dentro de Dispose ()


La palabra clave using cerrará la conexión correctamente, por lo que no se requiere la llamada adicional para Cerrar.

Desde el artículo de MSDN sobre la agrupación de conexiones de SQL Server :

"Recomendamos encarecidamente que siempre cierre la conexión cuando haya terminado de usarla para que la conexión se devuelva al grupo. Puede hacerlo utilizando los métodos Cerrar o Eliminar del objeto Conexión o abriendo todas las conexiones dentro de un grupo. usando la declaración en C # "

La implementación real de SqlConnection.Dispose usando .NET Reflector es la siguiente:

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



No, la clase SqlConnection hereda de IDisposable, y cuando se encuentra el fin del uso (para el objeto de conexión), llama automáticamente a Dispose en la clase SqlConnection.


No, no es necesario cerrar una conexión antes de llamar a Dispose.

Algunos objetos (como SQLConnections) pueden reutilizarse después de llamar a Cerrar, pero no después de llamar a Dispose. Para otros objetos, llamar a Close es lo mismo que llamar a Dispose. (ManualResetEvent y Streams creo que se comportan así)


No, tener el bloque de Uso llama a Dispose() para usted de todos modos, por lo que no es necesario llamar a Close() .


Usando Reflector , puede ver que el método Dispose de SqlConnection realmente llama a Close() ;

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