2010-12-08 9 views
31

que estoy haciendo mis métodos de acceso de base de datos a SQL Server como estoado.net conexión de cierre cuando se utiliza el "uso" declaración

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

     } 
    } 
    } 

¿Es necesario que se cierre o se deshaga de SqlCommand, o tomará la instrucción using me importa eso? Simplemente no quiero que la conexión cuelgue abierta Gracias

Respuesta

55

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

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

+2

Se ocupará de ello, pero aún así lo cerraría explícitamente y usaría el bloque using() solo como una "copia de seguridad" para cuando lo olvide. –

+1

¡Gracias! ¡Gracias a todos los que respondieron también! – twal

+0

Confiar en tales 'características' puede ser peligroso y confuso. Todavía lo cerraría explícitamente, al igual que marc_s. TBH, yo también lo eliminaría explícitamente, y solo en el lugar que quisiera que fuera dispuesto. – ThunderGr

1

cuando el alcance

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

voluntad sobre, la conexión será automáticamente dispuesta por tiempo de ejecución. así que no te preocupes

4

Como dijo Phil, la cláusula de uso se ocupará de eso por ti. Cuando se compila, envuelve la conexión create in try ... finalmente y coloca la llamada de eliminación de la conexión dentro de finally.

Para obtener más información, puede ver el using statement article at msdn.

0

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.

+4

No, necesita usar() para cada objeto desechable - 'usando (SqlConnection .....)' solo no se ocupará de su 'SqlCommand' –

+6

Anything que implementa IDisposable debe colocarse en una instrucción de uso. Es una buena práctica poder ver rápidamente el código que simplemente no está bien. – NotMe

12

Dicho sea de paso, puede hacer que el código sea más concisa y fácil de leer de la siguiente manera:

using (SqlConnection con = new SqlConnection(/*connection string*/)) 
using (SqlCommand cmd = new SqlCommand(storedProcname, con)) 
{ 
    //... 
} 
+0

oh genial, gracias! – twal

3

Si el código se cerrará la conexión, sin embargo significa que typcally liberación de nuevo a la agrupación de conexiones para ser verdaderamente cerrada más adelante .

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

Si es absolutamente necesario la conexión cerrada verdaderamente (un caso extremo para estar seguro) a continuación, utilizar el método estático de THS SqlConnection ClearAllPools

2

Using palabra clave se cerrará automáticamente la conexión para que por lo que no es necesario preocuparse por llamar al connection.close() al final cada vez.

+0

No veo bien, cómo esto difiere de la respuesta aceptada. ¿Puedes elaborar? – Nicktar

Cuestiones relacionadas