2009-06-02 6 views
2

Was passiert, wenn Sie Close() für ein SqlConnection-Objekt aufrufen, bevor Sie Close() für einen SqlDataReader mit dieser Verbindung aufrufen?Was passiert, wenn Sie eine SqlConnection vor dem SqlDataReader schließen?

Eigentlich möchte ich wirklich wissen, ob die Reihenfolge, in der Sie sie schließen, wichtig ist oder nicht. Verlässt das Aufrufen von SqlConnection.Close() die Verbindung vollständig oder bleibt sie geöffnet, wenn Sie Close() für einen SqlDataReader mit dieser Verbindung nicht aufrufen?

Sorry für die mehreren Fragen, aber ich glaube nicht, dass ich wirklich verstehe, wie das Schließen von Verbindungen funktioniert.

Antwort

12

Es schließt die Verbindung (gibt es an den Pool zurück) und SqlDataReader würde eine Ausnahme auslösen (System.InvalidOperationException), falls es danach verwendet wird.

+1

Sehr schnelle Antwort +1 – ichiban

+0

Also gibt es einen Grund zu stören schließen Sie den SqlDataReader, wenn Sie gerade die SqlConnection direkt danach schließen? Es klingt wie es ist sicher, nur die SqlConnection zu schließen. Ist das so? – Ender

+2

@Ender ist der richtige Weg, es zu schließen. Es fühlt sich einfach nicht gut an, die Verbindung zu schließen. Wahrscheinlich sollten Sie 'using' Anweisungen trotzdem verwenden. –

8

Anstatt sich Gedanken darüber zu machen, wie man sie schließt, warum sollte man sie nicht mit Anweisungen umhüllen?

Die using-Anweisungen stellen sicher, dass Ihre Objekte geschlossen sind, und in der richtigen Reihenfolge, wenn Sie sie entsprechend verschachteln. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/yh598w02.aspx.

+0

kann man "using" -Anweisungen in .NET 2.0 verwenden? –

+0

Ja, die Verwendung von Anweisungen erfolgte in C# im 1.1-Framework und in VB im 2.0-Framework. –

3

Die tatsächliche Datenbankverbindung wird geschlossen (in den Pool zurückgegeben), wenn Sie das Objekt SqlConnection schließen/entsorgen, sodass die Datenbankressourcen sicher sind.

Sie sollten jedoch auch die SqlDataReader schließen/entsorgen, andernfalls wird ein Verweis auf das Objekt SqlConnection beibehalten und beide im Speicher behalten. Schließlich wird der Finalizer das Objekt SqlDataReader entsorgen, wenn Sie es nicht tun, und dann das Objekt SqlConnection kann auch gesammelt werden, aber Sie haben keine Kontrolle darüber, wenn das passiert.

Die SqlDataReader kann teilweise verwendet werden, nachdem Sie die Verbindung geschlossen haben, aber nichts, auf das Sie sich wirklich verlassen können. Es hat immer noch einige Daten im Puffer, daher funktionieren möglicherweise einige Operationen, aber alles, was mehr Daten von der Datenbank erfordert, verursacht eine Ausnahme.

+0

Cool, danke für die ausführliche Erklärung. – Ender

Verwandte Themen