2009-01-22 11 views
9

Czy ktoś wie, czy metoda SqlDataAdapter.Dispose faktycznie zamyka lub unieszkodliwia SqlConnections? Załadowałem Reflector i widzę, że SqlDataAdapter dziedziczy po DbDataAdapter. Jeśli zdemontuję i spojrzę na metodę utylizacji w tej klasie, wydaje się, że nie ma możliwości zbycia żadnych SqlConnections. Przypuszczam, że mógłbym napisać test na to, ale pomyślałem, że zapytam, czy ktoś ma wgląd w to.Czy SqlDataAdapter.Dispose faktycznie Zamknij skojarzony SqlConnection?

Odpowiedz

10

Pierwszą rzeczą, o której należy pamiętać, jest to, że DataAdapter zarządza i blokuje połączenie w pewnych okolicznościach. Na przykład, jeśli używasz DataAdapter prawdopodobnie pracujesz na DataTables/DataSets przy użyciu funkcji .Fill() i .Update().

Z .Fill() docs:

Celem połączenia związane z SELECT musi być ważny, ale nie muszą być otwarte. Jeśli połączenie zostanie zamknięte przed wywołaniem wypełnienia, zostanie otwarte w celu pobrania danych, a następnie zamknięte. Jeśli połączenie jest otwarte, zanim zostanie wywołane wypełnienie, pozostaje otwarte.

W ogóle nie wspomina się o połączeniu, więc należałoby zarządzać nim ręcznie.

Teraz zapytałeś konkretnie o metodę Dispose(). Podobnie jak w przypadku aktualizacji, Dispose() docs nie wspomina o połączeniu, więc należałoby zamknąć to ręcznie.

Wreszcie możemy poprawić kod Boba Kinga lekko tak:

Using conn as New SqlConnection(""), _ 
     adapter as New SqlDataAdapter() With {.Connection = conn} 
    'Do stuff 
End Using 

Albo w C#:

using (SqlConnection conn = new SqlConnection("")) 
using (SqlDataAdapter adapter = new SqlDataAdapter() {Connection = conn}) 
{ 
    // Do stuff 
} 

Nie 100% mam składnię zainicjować właściwą kartę, ale wpisz go bezpośrednio w oknie odpowiedzi. W razie potrzeby naprawię to później.

+0

Hmm, Joel, nigdy więcej nie mogłem zadeklarować wielu IDisposables w tej samej instrukcji Using. To całkiem sprytne! –

+0

Ponadto, myślę, że wersja C# Inicjatorów Obiektów nie używa wiodącego "." http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx –

0

Nie, nie pozbawia połączenia. Uważam, że nie powinno. Możesz użyć go gdzie indziej.

1

O ile mi wiadomo, nie ma. Używam zagnieżdżone Korzystanie sprawozdań do osiągnięcia tego celu, tworzyć połączenia, następnie utworzyć kartę i jak przy użyciu instrukcji „pop”, adapter jest umieszczony, wtedy połączenie jest umieszczony, co robi wywołać zamknij

Using conn as New SqlConnection("") 
    Using adapter as New SqlDataAdapter() With {.Connection = conn} 
     'Do stuff' 
    End Using 
End Using 

Składnia jest praktycznie identyczna dla języka C#, jeśli jest to Twój wybrany język.

Powiązane problemy