2010-07-07 21 views
5

Ich verwende DataSet, um Daten vom Microsoft SQL Server abzurufen. Muss ich die Verbindung explizit schließen (oder der zugrunde liegende SqlDataAdapter schließt automatisch die Verbindung)?DataSet-zugrunde liegende Verbindung explizit schließen?

Ich benutze immer DataReader (mit mit), aber das erste Mal mit DataSet - deshalb Fragen über Best Practice. Danke im Voraus.

Antwort

0

Mit der Anweisung werden nicht verwaltete Ressourcen bereinigt, bevor das Objekt als Garbage Collection erfasst wird. Die Verbindung ist eine nicht verwaltete Ressource und sollte daher geschlossen sein, selbst wenn Sie mit einem DataSet arbeiten.

+0

Bin zur Zeit nicht "mit" mit DataSet verwenden, Genau das habe ich mich gefragt? Muss ich beim Umgang mit DataSet schließen? Vielen Dank. –

+0

Wenn Sie ein Lesegerät verwenden, müssen Sie den/die Adapter und/oder Lesegeräte schließen, um Ausnahmen zu vermeiden. Siehe meine Antwort unten. –

+0

Amit: Wie bereits erwähnt, benutze ich bereits "using" für DataReadern (die sich um das Schließen kümmern). Meine Frage ist nur für DataSets. Bitte lies meine Frage erneut. Vielen Dank. –

0

Nur um Dinge klar zu machen, folge ich konventionellen Anfänger Art der Interaktion mit 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

Ich denke immer, ist es eine gute Idee, den Überblick über meine Verbindungen zu halten, egal weicht, wie ich in eine Datenbank bin zu verbinden.

Sie haben gesagt, dass Sie immer einen Datenreader verwenden, aber jetzt verwenden Sie einen Datensatz. Ich nehme an, dass bedeutet, dass Sie einen DataAdapter verwenden, um mit Ihrem DataSet zu gehen. Wenn dies der Fall ist, und Sie MSSQL verwenden, wird die SqlDataAdapter öffnen und schließen Sie die Verbindung für Sie, aber wie ich schon sagte, ich mag dies selbst zu verfolgen, vor allem, da Sie SqlCommand.ExecuteScalar verwenden können (auch wenn Sie verwenden a DataAdapter die meiste Zeit) an einem Punkt, und die SqlCommand wird Ihren Verbindungsstatus für Sie nicht verwalten.

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

3

A DataSet ist ein Trennungs 'Ansicht' auf der Datenbank. Das heißt, Sie laden die Daten aus der Datenbank in eine DataSet (eigentlich in einer DataTable, die in eine DataSet gestellt werden kann), und Sie können die Verbindung schließen, die Sie verwendet haben, um die DataTable oder DataSet zu füllen.

Sie können weiterhin mit den Daten arbeiten, die sich im Dataset befinden. Es benötigt keine offene Verbindung zur DB.

In der Tat sollten Sie eine DB-Verbindung schließen, sobald Sie bald keinen DB-Zugriff benötigen. Verbindungen zu Datenbanken sollten kurzlebig sein.

1

Die beste Vorgehensweise ist Dispose() für alle ADO.NET Mitglieder IDisposable implementiert aufzurufen: Verbindung, Befehl, Adapter, Tabelle, Set, Leser, 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); 
    } 
} 
Verwandte Themen