2009-09-14 17 views
9

Tengo el siguiente código de ado.net, si ya uso usando para envolver mi DBCommand, ¿tengo que cerrar la conexión de abajo explícitamente?¿DbCommand.Close() también cerrará la conexión?

Gracias,

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

Respuesta

4

Sí, si todo lo que ha envuelto en el bloque using es el DbCommand, entonces se tienen que cerrar explícitamente la DbConnection, como se hace actualmente en el código. Sin embargo, es suficiente simplemente llamar al Dispose. No necesita llamar tanto al Close como al Dispose.

+0

Creo que @Satya es correcto en este caso y su respuesta es incorrecta. – Coops

+0

@CodeBlend: en el caso de que alguien esté usando Enterprise Library, entonces sí, su respuesta es correcta. Sin embargo, aunque el código hace referencia a clases como 'Base de datos ', el contenido de la pregunta y las etiquetas no hacen referencia a EntLib. Como resultado, si las personas están buscando una respuesta a la pregunta tal como se les ha preguntado, entonces esto aún sería correcto. –

-1

No, no lo hacen.

Una vez que se golpea el final del bloque de uso, se le pide deshacerse de él.

+2

No tengo idea de por qué esto se está subiendo de categoría, ya que es simplemente incorrecto. Tienes que cerrar la conexión. Esta pregunta se trata de tener que eliminar la ** conexión **, no el ** comando **. "usar" el comando solo no lo hace. –

+0

Basado en el comentario de su código y en el hecho de que está llamando explícitamente a dbCommand.Connection.Close y dbCommand.Connection.Dispose() Creo que él estaba preguntando si era necesario, ya que él ya estaba envolviendo el comando en un bloque de uso. Si le preguntaba si todavía necesita llamar a algo como db.Close y db.Dispose, entonces está 100% correcto. Simplemente no pensé que esa era su pregunta. – cptScarlet

+0

"si ya uso usando para envolver mi DBCommand, tengo que cerrar la * conexión de abajo * explícitamente" Eso parece bastante claro. –

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

El bloque de aplicación cierra las conexiones de base de datos después de que haya terminado con ellos. Por ejemplo, la implementación del método ExecuteNonQuery incluye una instrucción using. La instrucción using obtiene recursos, ejecuta una instrucción y elimina los recursos. En este caso, el recurso es la conexión de la base de datos. En el caso del método ExecuteReader, el bloque de aplicaciones usa el método Command-Behavior.CloseConnection para cerrar la conexión después de que el lector se cierra.

+0

Entonces, ¿la respuesta marcada como "la respuesta" aquí es completamente incorrecta? – Coops

1

Esta publicación es antigua, pero estoy respondiendo que estoy seguro de que la conexión está cerrada si utilizamos este bloque con EnterpriseLibrary (las clases y los nombres de métodos en el bloque de código me hacen pensar en esto). El tipo que hizo la pregunta y quién respondió debería considerar explícitamente si estamos hablando de EnterbriseLibrary o no. He probado con un bloque finally, y SÍ, la conexión se cierra automáticamente después del bloque de uso con DbCommand.

+0

¿Puede publicar el código, me gustaría un ejemplo para demostrar que lo que dice es correcto, aunque creo que es – Coops

Cuestiones relacionadas