2011-12-23 18 views
5

Aquí hay una versión simplificada de mi ejemplo:.Net: ¿Mi conexión se cierra mediante Dispose en este ejemplo?

using (DbCommand cmd = new SqlCommand("myProcedure", (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) { CommandType = CommandType.StoredProcedure }) 
{ 
    cmd.Connection.Open(); 
    using(IDataReader dr = cmd.ExecuteReader()) 
     doWork(dr); 
} 

Cuando se dispone el mando, se cierra la conexión? ¿O necesitaría tener esa primera declaración de uso para la conexión, y luego crear el comando en el cierre?

Respuesta

11

Si desea que el lector para cerrar la conexión, puede utilizar la sobrecarga de ExecuteReader():

... 
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
... 

Por defecto, disponer de un lector no libera la conexión. - see MSDN for more info...

Para abordar la cuestión de Close() vs Dispose(), el MSDN indica:

Si el DbConnection sale del ámbito, no está cerrado. Por lo tanto, debe cerrar explícitamente la conexión llamando a Close o Dispose, que son funcionalmente equivalentes.

Por lo tanto, no es necesario eliminar necesariamente una conexión de cierre automático. La principal diferencia es que una conexión cerrada se puede volver a abrir, pero una conexión eliminada no puede. El principal trabajo adicional que Dispose() hace es establecer internos a null que no tendrán mucho efecto ya que la conexión está pasando fuera del alcance de todos modos.

+0

No creo que elimine la conexión, solo la cierra. –

+0

¿Esto eliminará la conexión? –

+0

Desde MSDN, llamando a Close() y Dispose() en una conexión son funcionalmente equivalentes: –

4

James Michael Hare funciona, pero también querrá deshacerse de su conexión. Prueba esto:

using (SqlConnection conn = (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) 
using (DbCommand cmd = new SqlCommand("myProcedure", conn) { CommandType = CommandType.StoredProcedure }) 
{ 
    cmd.Connection.Open(); 
    using(IDataReader dr = cmd.ExecuteReader()) 
     doWork(dr); 
} 
3

Debe utilizar un

using(var connection = (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) 
{ 
connection.Open(); 
.... 
} 

Porque incluso si cierra la conexión, usted tiene que deshacerse de él. Tenga en cuenta que SQLConnection llama al Close en el Dispose. El problema es que si tuviera que llamar al Close usted mismo, tendría que ponerlo en un try...catch por lo que estaba garantizado y no tendría una pérdida de memoria. Hay otros tipos en el marco que no llaman al Close en el Dispose, que en mi opinión deberían ser envueltos.

+0

Las dos líneas de "usar" que se muestran en mi respuesta funcionan muy bien en este caso. –

+0

@MikeC. Sí, solo quería despotricar sobre las diferentes implementaciones 'Dispose'. –

Cuestiones relacionadas