2010-07-07 17 views
5

Sto utilizzando DataSet per recuperare i dati da Microsoft SQL Server. Devo chiudere esplicitamente la connessione (o il SqlDataAdapter sottostante chiude automaticamente la connessione)?Chiudere esplicitamente la connessione sottostante di DataSet?

Uso sempre DataReader (con utilizzando), ma la prima volta che utilizzo DataSet: ecco perché mi sto interrogando sulle best practice. Grazie in anticipo.

risposta

0

L'istruzione using ripulisce le risorse non gestite prima che l'oggetto venga sottoposto a garbage collection. La connessione è una risorsa non gestita quindi dovrebbe essere chiusa anche se si è con un DataSet.

+0

non sono attualmente in uso "utilizzando" con DataSet, questo è esattamente che mi stavo chiedendo? Devo chiudere quando si ha a che fare con DataSet? Grazie. –

+0

se si utilizza il lettore, è necessario chiudere/chiudere l'adattatore e/oi lettori utilizzati per evitare eccezioni. Vedi la mia risposta qui sotto. –

+0

Amit: Come accennato sopra, utilizzo già "using" per DataReader (che si occupa della chiusura). La mia domanda è solo per DataSet. Per favore, leggi di nuovo la mia domanda. Grazie. –

0

Solo per fare chiarezza sto seguendo il modo convenzionale di iniziare i principianti di interagire 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

penso sempre che sia una buona idea per tenere traccia dei miei collegamenti, nessun modo importa wich Sto connessione a un database.

Hai detto che usi sempre un datareader, ma ora stai utilizzando un set di dati. Suppongo che questo significhi che stai usando un DataAdapter per andare con il tuo DataSet. Se questo è il caso, e stai usando MSSQL, allora lo SqlDataAdapter aprirà e chiuderà la connessione per te, ma come ho detto, mi piace tenerne traccia da solo, soprattutto perché potresti usare SqlCommand.ExecuteScalar (anche se stai usando a DataAdapter per la maggior parte del tempo) e lo SqlCommand non gestirà il tuo stato di connessione per te.

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

3

Un DataSet è una disconnesso 'vista' sul database. Cioè, i dati vengono caricati dal database in un DataSet (in realtà, in un), e puoi chiudere la Connessione che hai utilizzato per popolare lo DataTable o DataSet.

È possibile continuare a lavorare con i dati presenti nel set di dati. Non richiede una connessione aperta al DB.

In effetti, è necessario chiudere una connessione DB non appena non si ha bisogno di alcun accesso al DB a breve. Le connessioni ai database dovrebbero essere di breve durata.

1

La pratica migliore è chiamare Dispose() per tutti i membri di ADO.NET implementato IDisposable: il collegamento, il comando, adattatore, tavola, set, lettore, ecc:

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); 
    } 
} 
Problemi correlati