2009-01-22 12 views
9

Weiß jemand, ob die SqlDataAdapter.Dispose-Methode tatsächlich SqlConnections schließt oder disponiert? Ich habe Reflektor geladen und ich sehe, dass SqlDataAdapter von DbDataAdapter erbt. Wenn ich die displace-Methode in dieser Klasse disassembliere, scheint es keine SqlConnections zu geben. Ich nehme an, ich könnte einen Test dafür schreiben, aber ich dachte mir, ich würde fragen, ob irgendjemand etwas dazu wissen könnte.Funktioniert SqlDataAdapter.Dispose tatsächlich eine zugeordnete SqlConnection?

Antwort

10

Das Erste, was zu beachten ist, ist, dass der DataAdapter Ihre Verbindung unter bestimmten Umständen verwaltet und schließt. Wenn Sie beispielsweise einen DataAdapter verwenden, arbeiten Sie wahrscheinlich mit den Funktionen .Fill() und .Update() in DataTables/DataSets.

Vom .Fill() docs:

Das Verbindungsobjekt mit der SELECT-Anweisung zugeordnet sind, müssen gültig sein, aber es muss nicht geöffnet sein. Wenn die Verbindung geschlossen wird, bevor Fill aufgerufen wird, wird sie geöffnet, um Daten abzurufen, und anschließend geschlossen. Wenn die Verbindung geöffnet ist, bevor Fill aufgerufen wird, bleibt sie geöffnet.

Die .Update() docs nichts über die Verbindung überhaupt erwähnen, so würde ich erwarten, dass es manuell verwalten muss.

Jetzt haben Sie speziell nach der Dispose() -Methode gefragt. Wie Update, die Dispose() docs erwähnen nicht speziell die Verbindung, so würde ich erwarten, es manuell zu schließen.

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

Oder in C#:

Schließlich können wir auf Bob King Code etwas wie diese verbessern

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

nicht zu 100% erhielt ich die initialize Syntax für den Adapter richtig, aber ich tippte es direkt in das Antwortfenster. Ich werde es später bei Bedarf reparieren.

+0

Hmm, Joel, ich habe nie neue IDisposables in derselben Using-Anweisung deklariert. Das ist ziemlich glatt! –

+0

Außerdem denke ich, dass die C# -Version von Object Initialisers kein führendes "." http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx –

0

Nein, es verfügt nicht über die Verbindung. Ich glaube es sollte nicht. Vielleicht möchten Sie es woanders verwenden.

1

Soweit ich weiß es nicht. Ich benutze verschachtelte Anweisungen verwenden, dies zu erreichen, stellt die Verbindung zuerst, dann den Adapter erstellen und wie die Verwendung von Aussagen „Pop“, der Adapter angeordnet ist, dann wird die Verbindung angeordnet ist, die tut Auslöser ein wachsamen:

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

Die Syntax ist praktisch identisch für C#, wenn dies Ihre Sprache der Wahl ist.

Verwandte Themen