2011-09-12 5 views
7

¿SqlDataAdapter cierra el SqlConnection después de la función Fill() o necesito cerrarlo yo mismo?¿SqlDataAdapter cierra la función SqlConnection después de Fill()?

string cnStr = @"Data Source=TEST;Initial Catalog=Suite;Persist Security Info=True;User ID=app;Password=Immmmmm"; 
cn = new SqlConnection(cnStr); 
SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Date", cn); 
SqlDataAdapter adapter = new SqlDataAdapter(cmd); 

DataSet ds = new DataSet(); 
adapter.Fill(ds); 

cn.Close() // ???????? 

Console.WriteLine(ds.Tables[0].Rows.Count); 
Console.WriteLine(cn.State); 

Respuesta

14

En su uso actual, se cerrará para usted:

Si el IDbConnection se cierra antes de relleno se llama, se abre para recuperar datos y luego se cierra. Si la conexión está abierta antes de que se llame a Fill, permanece abierto.

http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

Creo que es siempre mejor para atender de manera explícita para usted mismo con una declaración using:

using (SqlConnection conn = new SqlConnection("")) 
{ 
    conn.Open(); 

    // Do Stuff. 

} // Closes here on dispose. 

Esto suele ser más fácil de leer y no se basa en la gente para entender el funcionamiento interno de SqlDataAdapter.Fill, solo la declaración y las conexiones using.

Sin embargo, si sabe la conexión se cierra antes de que el adaptador la use (como en, acaba de crear la conexión) y no se utiliza para nada más, su código es perfectamente seguro y válido.

En lo personal, me gustaría escribir algo como esto:

string cnStr = "Data Source=TEST;Initial Catalog=Suite;Persist Security Info=True;User ID=app;Password=Immmmmm"; 
    DataSet ds = new DataSet(); 

    using (SqlConnection cn = new SqlConnection(cnStr)) 
    using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Date", cn)) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    { 
     conn.Open(); 
     adapter.Fill(ds);  
    } 
+0

pero si escribo este código sin necesidad de utilizar la construcción cn estado lo han cerrado antes de la salida de la función – Wachburn

+1

@Wachburn de hecho, y la consulta de MSDN verifica esto. Lo siento, no capté esto la primera vez. –

+0

Se encarga de cerrarlo por usted si el comando se ejecuta con éxito, pero ¿qué ocurre en un caso de excepción? (interbloqueo, tiempo de espera, etc.) –

4

Como sé que necesita para cerrar la conexión es el propietario

mejor manera de hacer es

using(SqlConnection con = new SqlConnection()) 
{ 
    // you code 
} 

este cerrará su conexión automáticamente

usando bloque en C# viene muy a mano al tratar con objetos desechables. Los objetos desechables son aquellos que pueden liberar explícitamente los recursos que usan cuando se los llama a deshacerse de ellos. Como sabemos, la recolección de elementos no utilizados de .Net no es determinista, por lo que no puede predecir cuándo se recolectará exactamente el objeto.

leer este post para más detalles en: understanding ‘using’ block in C#

Cuestiones relacionadas