2010-07-07 27 views
5

Estoy usando DataSet para recuperar datos de Microsoft SQL Server. ¿Debo cerrar explícitamente la conexión (o el SqlDataAdapter subyacente cierra automáticamente la conexión)?Cerrar la conexión subyacente de DataSet explícitamente?

Siempre uso DataReader (con usando), pero la primera vez que uso DataSet es por eso que me pregunto acerca de las mejores prácticas. Gracias por adelantado.

Respuesta

0

El uso de la declaración limpia los recursos no administrados antes de que el objeto sea basura. La conexión es un recurso no administrado, por lo que debe estar cerca incluso si está con un DataSet.

+0

No estoy utilizando actualmente el "uso" de conjunto de datos, eso es exactamente lo que me preguntaba? ¿Debo cerrar cuando trato con DataSet? Gracias. –

+0

si está utilizando un lector, entonces debería cerrar/eliminar el adaptador y/o lectores utilizados para evitar excepciones. Ver mi respuesta a continuación. –

+0

Amit: Como mencioné anteriormente, ya uso "using" para DataReaders (que se ocupa del cierre). Mi pregunta es solo para DataSets. Por favor lea mi pregunta nuevamente Gracias. –

0

Solo para aclarar las cosas, estoy siguiendo la forma convencional de principiantes de interactuar con db.

public DataSet GetData() 
{ 
    SqlDataReader reader; 
    string connstr = your conn string; 
    SqlConnection conn = new SqlConnection(connstr); 
    DataTable st = new DataTable(); 
    DataSet ds = new DataSet(); 
    try 
    {     
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandText = "Your select query"; 
     cmd.Connection = conn; 
     conn.Open(); 

     reader = cmd.ExecuteReader(); 
     dt.Load(reader); 
     ds.Tables.Add(dt); 
    } 
    catch (Exception ex) 
    { 
     // your exception handling 
    } 
    finally 
    { 
     reader.Close(); 
     reader.Dispose(); 
     conn.Close(); 
     conn.Dispose(); 
    }  
    return ds; 
} 
0

siempre creo que es una buena idea para llevar un registro de mis conexiones, de ninguna manera importa wich estoy conectando a una base de datos.

Dijiste que siempre usas un lector de datos, pero ahora estás usando un conjunto de datos. Supongo que eso significa que está utilizando un DataAdapter para ir con su DataSet. Si ese es el caso, y está usando MSSQL, entonces el SqlDataAdapter se abrirá y cerrará la conexión por usted, pero como dije, me gusta hacer un seguimiento de esto, especialmente dado que puede usar SqlCommand.ExecuteScalar (incluso si está utilizando a DataAdapter la mayor parte del tiempo) en algún momento, y el SqlCommand no administrará su estado de conexión por usted.

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

3

Un DataSet es una 'vista' desconectada en la base de datos. Es decir, carga los datos de la base de datos en un DataSet (en realidad, en un DataTable, que se puede poner en un DataSet), y puede cerrar la conexión que ha utilizado para completar DataTable o .

Puede seguir trabajando con los datos que están en el conjunto de datos. No requiere una conexión abierta a la base de datos.

De hecho, debe cerrar una conexión de base de datos tan pronto como no necesite ningún acceso de base de datos pronto. Las conexiones a las bases de datos deben ser de corta duración.

1

La mejor práctica es llamar Dispose() para todos los miembros de ADO.NET implementado IDisposable: conexión, comando, adaptador, tabla, conjunto, lector, etc:

using (SqlConnection connection = new SqlConnection(connectionString)) 
using (SqlCommand command = connection.CreateCommand()) 
{ 
    connection.Open(); 
    using (DataSet ds = new DataSet()) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
    { 
     adapter.Fill(ds); 
    } 
} 
Cuestiones relacionadas