net example ejemplo data c# sql .net database using

c# - example - SqlConnection.Close() dentro usando una sentencia



sqlconnection vb.net ejemplo (8)

¿Es incorrecto si no agrego sqlConnection.Close (); antes de tirarlo

No, no es tanto como esté usando su conexión dentro de Using . Cuando abandone el ámbito de uso, se llamará Dispose para la conexión SQL. que cerrará la conexión existente y liberará todos los recursos también.

Estoy usando este código:

public void InsertMember(Member member) { string INSERT = "INSERT INTO Members (Name, Surname, EntryDate) VALUES (@Name, @Surname, @EntryDate)"; using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) { sqlConnection.Open(); using (SqlCommand sqlCommand = new SqlCommand(INSERT, sqlConnection)) { sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar).Value = member.Name; sqlCommand.Parameters.Add("@Surname", SqlDbType.VarChar).Value = member.Surname; sqlCommand.Parameters.Add("@EntryDate", SqlDbType.Date).Value = member.EntryDate; sqlCommand.ExecuteNonQuery(); } } }

¿Es incorrecto si no agrego sqlConnection.Close(); antes de tirarlo? Quiero decir. No está mostrando ningún error, ningún problema en absoluto. ¿Es mejor cerrarla primero? ¿Si es así por qué?


Está utilizando un objeto que Dispose() el objeto por usted.

Si toma la conexión fuera de la declaración de Using , entonces sí, tendrá que cerrar la conexión cuando termine.


Esta es una pregunta muy interesante y no tan obvia como muchos pueden pensar. El uso de la instrucción funcionará correctamente para la conexión solo si se eliminan todos los objetos que utilizan la conexión. Hace algún tiempo tuvimos un problema con las conexiones abiertas en nuestro servidor de SQL. Todo se veía bien porque las conexiones estaban dentro del uso de sentencias, pero uno de los desarrolladores creó algunos métodos con SqlDataReader y no lo cerró correctamente. Debido a que las conexiones no fueron liberadas.

La razón de esto es la forma en que funciona la recolección de basura. En pocas palabras: crea un mapa de objetos para disponer y, en realidad, disponer de ellos cuando no hay referencias activas a esos objetos.


La using statement ensures that Dispose is called a using statement ensures that Dispose is called incluso si se produce una excepción mientras llama a los métodos en el objeto. You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block ; de hecho, así es como el compilador traduce la instrucción using. MSDN

Así que en última instancia, su línea de código

using (sqlConnection = new SqlConnection(sqlConnectionString_WORK))

se convertirá en un try finally block de IDisposable object in the finally por el compilador que llama IDisposable object in the finally


La declaración de uso es un bloque try try y, en su caso, el bloque final tendría una connection.Dispose() llamada. Así que realmente no necesita una connection.Close() independiente connection.Close() Declaración de connection.Close() allí.

La ventaja es que esto garantiza la eliminación incluso en caso de una excepción, ya que el bloque finally siempre se ejecutará.

try { sqlConnection.Open(); // .... } finally { if(sqlConnection != null) sqlConnection.Dispose(); }


No hay necesidad de Close or Dispose el bloque de using , esto se hará cargo de usted.

Como se indica desde MSDN :

El siguiente ejemplo crea una Conexión Sql, la abre y muestra algunas de sus propiedades. La conexión se cierra automáticamente al final del bloque de uso.

private static void OpenSqlConnection(string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); Console.WriteLine("ServerVersion: {0}", connection.ServerVersion); Console.WriteLine("State: {0}", connection.State); } }


No, no está mal. El sqlConnection cerrará la conexión después de que pase con el método de bloqueo y llamada Dispose. SqlConnection.Dispose () igual al método SqlConnection.Close ().

Desde MSDN: Si la SqlConnection sale del alcance, no se cerrará. Por lo tanto, debe cerrar explícitamente la conexión llamando a Cerrar o Eliminar. Cerrar y disponer son funcionalmente equivalentes.


Según la MSDN :

debe cerrar explícitamente la conexión llamando a Cerrar o Eliminar . Cerrar y disponer son funcionalmente equivalentes.

Por lo tanto, llamar a Dispose (implícitamente, incluso, using ) cubrirá sus bases, por así decirlo.

También vale la pena señalar, aunque no es específico de su caso, que Close siempre se llamará efectivamente cuando la cosa esté envuelta en una declaración de using , lo que podría no ser el caso si se omitiera y se produjera una excepción sin la debida try / catch / finally manejo.