2011-09-12 14 views
7

Czy SqlDataAdapter zamknij SqlConnection po funkcji Fill(), czy też muszę go zamknąć?Czy SqlDataAdapter zamyka funkcję SqlConnection after 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); 

Odpowiedz

14

W bieżącym użytkowania, będzie zamknąć dla Ciebie:

Jeśli IDbConnection jest zamknięty przed Fill nazywa, jest otwarty do pobierania danych i następnie zamknięte. Jeśli połączenie jest otwarte, zanim zostanie wywołane wypełnienie, pozostaje otwarte.

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

Myślę, że to zawsze lepiej, aby wyraźnie zaspokoić sobie z using stwierdzeniem:

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

    // Do Stuff. 

} // Closes here on dispose. 

Często jest to bardziej czytelne i nie polegać na ludziach rozumiejąc wewnętrzne funkcjonowanie z SqlDataAdapter.Fill, tylko oświadczenie i połączenia using.

Jeśli jednak użytkownik zna, to połączenie jest zamykane, zanim adapter go użyje (jak w przypadku, gdy połączenie zostało właśnie utworzone) i nie jest używane do niczego innego, kod jest całkowicie bezpieczny i ważny.

Osobiście chciałbym napisać coś takiego:

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

ale jeśli piszę ten kod bez korzystania budowę cn cokolwiek się stanie zamkniętym przed wyjściem z funkcji – Wachburn

+1

@Wachburn rzeczywiście i konsultacji MSDN sprawdza to. Przepraszam, nie złapałem tego za pierwszym razem. –

+0

Zajmuje się zamykaniem dla ciebie, jeśli polecenie zostanie wykonane pomyślnie, ale co z wyjątkiem w przypadku wyjątku? (zakleszczenie, przekroczenie limitu czasu, itp.) –

4

co wiem trzeba zamknąć połączenie przez jesteś właścicielem

Najlepszym sposobem na to jest

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

ten automatycznie zamknie połączenie

używanie bloku w C# jest bardzo wygodne w obsłudze z jednorazowymi przedmiotami. Obiekty jednorazowe to obiekty, które mogą jawnie uwolnić zasoby, których używają do wywoływania. Jak wiemy, zbieranie śmieci .Net jest niedeterministyczne, więc nie można przewidzieć, kiedy dokładnie obiekt zostanie zebrany.

Przeczytaj ten artykuł do bardziej szczegółowo: understanding ‘using’ block in C#

Powiązane problemy