ado.net Cierre de la conexión al usar la instrucción "using"


Estoy haciendo mis métodos de acceso a la base de datos de SQL Server de esta manera

  using (SqlConnection con = new SqlConnection(//connection string)
  {
    using (SqlCommand cmd = new SqlCommand(storedProcname, con))
     {
       try{
           con.open();
           //data reader code
       }
       catch
       {

       }
     }
  }

¿Tengo que cerrar o eliminar SqlCommand, o la declaración using se encargará de eso por mí? No quiero que la conexión se abra Gracias

Author: twal, 2010-12-08

7 answers

El using se encargará de ello por ti. Bajo el capó, SqlConnection.Dispose() llama al método SqlConnection.Close(), y SqlCommand.Dispose() llama a SqlCommand.Close().

Como fondo adicional, una instrucción using es azúcar sintáctica para un try ... finally que dispone el objeto IDisposable en el finally.

 56
Author: Phil Hunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-08 16:01:38

Como un aparte, puede hacer que el código sea más conciso y legible de la siguiente manera:

 using (SqlConnection con = new SqlConnection(/*connection string*/))
 using (SqlCommand cmd = new SqlCommand(storedProcname, con))
 {
    //...
 }
 12
Author: Dan Bryant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-22 05:26:01

Como dijo Phil, la cláusula using se encargará de ello por ti. Cuando se compila hacia abajo se envuelve la conexión crear en un intento .. finalmente y coloca la llamada de eliminación de conexión dentro de la finalmente.

Para más información puede ver el artículo using statement en msdn.

 4
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-08 16:04:30

Sí, su código cerrará la conexión, sin embargo, eso significa typcally release back to the connection pool to be truly closed later.

Si ejecuta este fragmento de código, y luego hace un sp_who y observa que su conexión todavía está allí, esa sería la razón.

Si es absolutamente necesario que la conexión esté realmente cerrada (un caso de borde para estar seguro), use el ClearAllPools método estático de ths SqlConnection

 3
Author: Ralph Shillington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-08 16:07:49

Using keyword cerrará automáticamente la conexión por ti así que no tienes que preocuparte por llamar connection.close() al final cada vez.

 2
Author: Abhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-14 13:36:35

Cuando el alcance

using (SqlConnection con = new SqlConnection(//connection string) 
{
}

Se terminará , la conexión se eliminará automáticamente por el tiempo de ejecución. así que no te preocupes

 1
Author: TalentTuner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-08 16:03:19

Creo que "usar" no era necesario para SqlCommand. "Usar" para SqlConnection habría hecho el trabajo solo para usted. De hecho, su conexión se envía al grupo de conexiones.

 0
Author: Kunal Uppal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-08 16:04:57