2010-07-30 19 views
14

En mi DAL que escribir consultas de esta manera:Cierre SqlConnection y SqlCommand C#

using(SQLConnection conn = "connection string here") 
{ 
    SQLCommand cmd = new ("sql query", conn); 
    // execute it blah blah 
} 

Ahora me acaba de ocurrir que yo no estoy cerrando explícitamente el objeto SQLCommand. Ahora sé que el bloque 'using' se ocupará del objeto SQLConnection, pero ¿esto también se ocupará del objeto SQLCommand? Si no es así, tengo un problema grave. Tendría que poner 'using' en SQLCommand en miles y miles de líneas de código o hacer un cmd.Close() en cientos de métodos. Por favor, dígame que si pone en uso o cierre el comando proporcionará una mejor administración de la memoria de la aplicación web?

+0

Creo que esto también debe ser interesante para usted: http://valueinjecter.codeplex.com/ wikipage? title = Data% 20access% 20layer% 20% 28ORM% 29% 20with% 20the% 20Value% 20Injecter & refiringTitle = Inicio – Omu

Respuesta

9

No, la instrucción using no se ocupará del comando.

Usted debe envolver los comandos con using declaraciones también, ya que esto va a llamar adecuadamente Dispose en ellos:

using(SQLConnection conn = 'connection string here') 
{ 
    using(SQLCommand cmd = new ('sql query', conn)) 
    { 
     //execute it blah blah 
    } 
} 
12

El SqlConnection no tiene conocimiento acerca de la SqlCommand, por lo que debería cerrar por sí mismo:

using (SqlConnection conn = new SqlConnection("connection string here")) 
using (SqlCommand cmd = new SqlCommand("sql query", conn)) 
{ 
    // execute it blah blah 
} 
4

No va a manejar el SqlCommand, pero el SqlCommand se finalmente ser manejado por el recolector de basura. Tiendo a hacer lo siguiente:

using (SqlConn conn ...) 
using (SqlComm comm ...) 
{ 
    conn.Open(); 
} 

El apilamiento de las instrucciones using aquí manejará ambos.

Cuestiones relacionadas