2008-12-17 15 views
62

Wenn ich eine SQLConnection in einer Verwendung wickeln, sollte ich es schließen oder nicht das Ende ist es mit Griff?Does End Using schließen eine offene SQL-Verbindung

using cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 'Do I need this? 
end using 

Antwort

94

einen mit Block verlassen ruft .Dispose() auf das betreffende Objekt (cn in Ihrem Beispiel), die für eine SqlConnection wird die Verbindung und alle offenen Ressourcen schließen.

+41

Mit anderen Worten: JA. –

+3

Was passiert, wenn im using-Block eine Ausnahme ausgelöst wird? Wird die Verbindung weiterhin entsorgt? – Youssef

+10

Joel Coehoorns JA. ist nicht eindeutig. Die vollständige Antwort ist: "Sie müssen nicht schließen, weil das Ende mit handle es" –

30

Präziser Aufruf Entsorgen oder Schließen wird die zugrunde liegende physikalische Verbindung als „nicht in Gebrauch“ markiert - aber wirklich nicht schließen. Eine "Nicht benutzt" Verbindung, die noch nicht physisch geschlossen ist, steht somit für das Pooling zur Verfügung. Daher würde der Aufruf von Dispose eine Verbindung zum Verbindungspool zurückgeben.

+1

Entschuldigung. Sie sagen, Aufruf von Dispose oder Close "schließt es nicht wirklich", dann sagen Sie, "Calling Dispose würde eine Verbindung zum Pool zurückgeben". Könntest Du das erläutern? a) Sendet Dispose sowohl * als auch * es zurück in den Pool? b) Schließt Close es auch nach dem Schließen in den Pool zurück? Oder geht es erst nach einem Dispose zurück in den Pool? –

+2

Warum wurde die falsche Antwort überprüft? Es ist klar bekannt, dass close/dispose die Verbindung nicht wirklich schließt, sondern zurück in den Pool bringt. –

1

mit nur eine Abkürzung, um zu versuchen/finally. dies ist equivilent Code zu dem, was Sie

gebucht
Try 
    SqlConnection cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 'Do I need this? 
Finally 
    cn.Dispose() 
End Try 

entsorgen soll im Falle von Verbindungen kümmern uns um alle Ressourcenbereinigung, es es schließt.

4

Während die Dispose-Methode SQL die Verbindung nicht schließt (eventuell nach Darin) Sie den Anruf verlassen sollte es zu schließen. Der Grund dafür ist, dass Sie sich darauf verlassen würden, dass die zugrunde liegende Implementierung von Dispose zum Schließen verwendet wird. Auch ein Open ohne Close zu sehen, ist vergleichbar mit einem Neuen ohne Delete für diejenigen von uns, die in nicht verwalteten Sprachen programmiert haben. Es ist ein Code-Geruch für mich.

+0

Ich stimme dem Code Geruch zu. Ich programmiere gerne explizit, nicht implizit. –

+23

Ich stimme nicht zu. Es ist nur Lärm. Erlernen Sie das neue Paradigma mit Blöcken. – TrueWill

+0

Ich hasse das Sprichwort "Code Geruch" Ich weiß nicht, warum die Leute denken, es ist in Ordnung, lol zu verwenden. Meiner Meinung nach bist du anal remanent, die using-Anweisung, die die Klammer schließt, drückt die Disposition der Ressource aus, die die using-Anweisung verwendet.Sie könnten argumentieren, dass der explizite Close-Aufruf der Codedatei 3 Zeilen hinzufügt, was möglicherweise dazu führt, dass der using-Anweisungsblock groß genug ist, dass Sie die erste Zeile des using-Blocks in einem Codeeditor nicht mehr sehen können Die Entwickler empfinden Feinheiten als eine explizite Close-Anweisung, da es eine Open-Anweisung gibt –

2

"Ein Block verhält sich wie ein Try ... Endlich Konstruktion, in der der Try-Block die Ressourcen nutzt und der Finally-Block diese entsorgt. Deshalb garantiert der Using-Block die Entsorgung der Ressourcen, nein Egal, wie Sie den Block verlassen. Dies gilt auch im Falle einer unbehandelten Ausnahme, außer für eine StackOverflowException. "
https://msdn.microsoft.com/en-us/library/htd05whh.aspx

Verwandte Themen