2010-07-07 14 views
5

Używam DataSet do pobierania danych z serwera Microsoft SQL Server. Czy muszę jawnie zamknąć połączenie (lub podstawowy SqlDataAdapter automatycznie zamyka połączenie)?Zamknij jawnie podstawowe połączenie DataSet?

Zawsze używam DataReader (z przy użyciu), ale po raz pierwszy za pomocą DataSet - dlatego zastanawiam się nad najlepszą praktyką. Z góry dziękuję.

Odpowiedz

0

Używanie instrukcji czyszczenia niezarządzanych zasobów, zanim obiekt zostanie usunięty. Połączenie jest niezarządzanym zasobem, więc powinno być blisko, nawet jeśli korzystasz z DataSet.

+0

nie jestem obecnie za pomocą "za pomocą" z DataSet, to właśnie się zastanawiałem? Czy muszę się zamykać podczas pracy z DataSet? Dzięki. –

+0

jeśli korzystasz z czytnika, powinieneś zamknąć/pozbyć się adaptera i/lub czytników używanych w celu uniknięcia wyjątków. Zobacz moją odpowiedź poniżej. –

+0

Amit: Jak już wspomniałem powyżej, używam już "use" dla DataReaders (który zajmuje się zamykaniem). Moje pytanie dotyczy tylko zestawów danych. Proszę ponownie przeczytać moje pytanie. Dzięki. –

0

Dla jasności podążam tradycyjnym sposobem na interakcję z 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

Zawsze myślę, że jest to dobry pomysł, aby śledzić moje połączenia, bez względu na Wich sposób łączę się z bazą danych.

Powiedziałeś, że zawsze używasz datareadera, ale teraz używasz zestawu danych. Zakładam, że oznacza to, że używasz DataAdapter, aby przejść do swojego DataSet. Jeśli tak jest, i używasz MSSQL, to SqlDataAdapter otworzy i zamknie połączenie dla ciebie, ale tak jak powiedziałem, lubię to śledzić, szczególnie, że możesz używać SqlCommand.ExecuteScalar (nawet jeśli używasz w większości przypadków DataAdapter), a SqlCommand nie będzie zarządzać Twoim stanem połączenia.

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

3

DataSet jest odłączony 'Widok' w bazie danych. Oznacza to, że dane są pobierane z bazy danych w postaci DataSet (w rzeczywistości w postaci DataTable, która może być umieszczona w DataSet) i można zamknąć połączenie, które zostało użyte do wypełnienia DataTable lub DataSet.

Możesz kontynuować pracę z danymi znajdującymi się w zbiorze danych. Nie wymaga otwartego połączenia z bazą danych.

W rzeczywistości powinieneś zamknąć połączenie DB, gdy tylko nie potrzebujesz wkrótce dostępu do bazy danych. Połączenia z bazami danych powinny być krótkotrwałe.

1

Najlepszym rozwiązaniem jest wywołanie Dispose() dla wszystkich członków ADO.NET realizowane IDisposable: połączenia, polecenia, adapter, stół, komplet, czytnik itp:

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); 
    } 
} 
Powiązane problemy