2008-12-17 20 views
62

Si envuelvo una SQLConnection en una Utilización, ¿debería cerrarla o el final utilizarla?¿Finaliza el uso de cerrar una conexión SQL abierta?

using cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 'Do I need this? 
end using 

Respuesta

94

salir de un bloque usando llama .Dispose() en el objeto en cuestión (cn en su ejemplo) que por un SqlConnection se cerrará la conexión y los recursos abiertos.

+41

En otras palabras: SÍ. –

+3

¿Qué pasará si se lanza una excepción dentro del bloque de uso? ¿la conexión seguirá siendo eliminada? – Youssef

+10

SÍ de Joel Coehoorn. es ambiguo. la respuesta completa es: "No es necesario que cierre porque el extremo que lo utiliza" –

30

Llamar con más precisión Dispose o Close marcará la conexión física subyacente como "No está en uso", pero en realidad no la cierra. Por lo tanto, está disponible una conexión "No en uso" que aún no está físicamente cerrada para la puesta en común. Por lo tanto, al llamar a Dispose se devolverá una conexión al grupo de conexiones.

+1

Lo sentimos ... usted dice que si se llama a Dispose o Close "realmente no se cierra", entonces se dice "llamar a Dispose devolvería una conexión al grupo". ¿Puedes aclarar? a) ¿Descarta ambos cerrarlo * y * devolverlo al grupo? b) ¿Cerrar también lo devuelve al grupo después de cerrarlo? ¿O solo volverá a la piscina después de un Dispose? –

+2

¿Por qué se ha verificado la respuesta incorrecta? se sabe claramente que cerrar/eliminar no cierra la conexión, sino que vuelve a traerla al grupo. –

1

usar es solo una abreviatura para probar/finalmente. este es el código equivilent a lo que usted envió

Try 
    SqlConnection cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 'Do I need this? 
Finally 
    cn.Dispose() 
End Try 

Desechar se supone que cuidar de toda la limpieza de recursos, en el caso de las conexiones que se va a cerrar.

4

Mientras que el método Dispose de SQL cierra la conexión (eventualmente de acuerdo con darin) debe dejar la llamada para cerrar allí. La razón es que confiaría en la implementación subyacente de Dispose para llamar close. Ver también un Abrir sin Cerrar es como ver un Nuevo sin Eliminar para aquellos de nosotros que hemos programado en idiomas no administrados. Es un olor de código para mí.

+0

Estoy de acuerdo con el olor del código. Me gusta programar explícitamente, no implícitamente. –

+23

No estoy de acuerdo. Es solo ruido. Aprende el nuevo paradigma con el uso de bloques. – TrueWill

+0

Odio el dicho "código de olor" No sé por qué la gente piensa que está bien usar jajaja. En mi opinión, estás siendo analmente retentivo, el uso del enunciado que cierra la frase expresa la eliminación del recurso que utiliza la instrucción using.Podría argumentarse que la llamada de cierre explícita agrega 3 líneas al archivo de código, lo que posiblemente cause que el bloque de instrucciones use sea lo suficientemente grande como para que ya no pueda ver la primera línea del bloque de uso en un editor de código y esto puede ser más inconveniente para las sensibilidades delicadas de los desarrolladores que una declaración cerrada explícita porque hay una declaración abierta –

2

"Un bloque que usa se comporta como un Try ... Finalmente construcción en la que el bloque Try usa los recursos y el bloque Finally los descarta. Por eso, el bloque Using garantiza la eliminación de los recursos, no importa cómo salga del bloque. Esto es cierto incluso en el caso de una excepción no controlada, a excepción de una StackOverflowException ".
https://msdn.microsoft.com/en-us/library/htd05whh.aspx

Cuestiones relacionadas