4 Stimmen

Ist Schließen/Disposing ein SqlDataReader erforderlich, wenn Sie bereits die SqlConnection schließen?

Ich bemerkte Diese Frage aber meine Frage ist etwas spezifischer.

Gibt es einen Vorteil bei der Verwendung von

using (SqlConnection conn = new SqlConnection(conStr))
{
     using (SqlCommand command = new SqlCommand())
     {
        // dostuff
     } 
}

anstelle von

using (SqlConnection conn = new SqlConnection(conStr))
{
     SqlCommand command = new SqlCommand();
     // dostuff
}

Offensichtlich ist es wichtig, wenn Sie mehr als einen Befehl mit derselben Verbindung ausführen wollen, da das Schließen einer SqlDataReader ist effizienter als das Schließen und erneute Öffnen einer Verbindung (Aufruf conn.Close();conn.Open(); wird ebenfalls die Verbindung freigeben).

Ich sehe, dass viele Leute darauf bestehen, dass das Scheitern der Schließung der SqlDataReader bedeutet, dass die Verbindungsressourcen offen bleiben, aber gilt das nicht nur, wenn man die Verbindung nicht schließt?

16voto

Jamie Ide Punkte 46985

Meiner Meinung nach sind hier zwei Regeln zu beachten:

  1. Klassen, die IDisposable implementieren, sollten in eine using Block.
  2. Sie sollten sich nicht auf die Implementierung von IDisposable in einer Klasse verlassen, um Regel 1 zu ignorieren.

Das heißt, selbst wenn Sie wissen, dass das Entsorgen des Verbindungsobjekts das Entsorgen des zugehörigen Befehlsobjekts zur Folge hatte, sollten Sie sich nicht auf dieses Verhalten verlassen.

Übrigens ist es möglich, Blöcke auf eine sauberere Weise zu verschachteln:

using (SqlConnection conn = new SqlConnection(conStr))
using (SqlCommand command = new SqlCommand())
{
    // dostuff
}

und ich würde verwenden

SqlCommand command = conn.CreateCommand();

anstatt einen neuen SqlCommand zu erstellen und ihn dann mit der Verbindung zu verknüpfen.

5voto

Aaronaught Punkte 118136

Technisch ist nicht erforderlich; das Schließen einer SqlConnection sollte alle Ressourcen zerstören, die der SqlDataReader verwendet. Der umgekehrte Fall ist ebenfalls zutreffend; Sie müssen nicht Dispose die SqlConnection wenn Sie über eine SqlDataReader die erstellt wurde mit CommandBehavior.CloseConnection .

Praktisch Wenn jedoch eine Klasse Folgendes implementiert IDisposable sollten Sie Dispose wenn Sie mit ihm fertig sind. Die Implementierungsdetails von Framework-Klassen können jederzeit geändert werden, und sofern in der Dokumentation nicht ausdrücklich auf Umstände hingewiesen wird, unter denen es nicht notwendig ist, die Dispose die Instanz, besteht immer die Möglichkeit, dass eine zukünftige Änderung/Aktualisierung dazu führt, dass Ihr Code ein Ressourcenleck hat.

Es ist wirklich kein zusätzlicher Aufwand - wickeln Sie es einfach in ein using Block.

1voto

Daniel DiPaolo Punkte 53359

Das mag in vielen Fällen nicht notwendig sein, aber es ist nicht ohne Grund die beste Praxis. Es gibt keinen Grund, Ressourcen über den Punkt hinaus bestehen zu lassen, an dem sie nicht mehr nützlich sind. Die using Konstrukt hilft, dies zu gewährleisten.

0voto

John Punkte 15906

Ist es nicht nur eine Frage der Sie die Ressource jetzt freigeben vs. Garbage Collection es später freigeben?

0voto

jvenema Punkte 43201

Das ist ein Unterschied. Wenn Sie erstellen 2 dieser Leser, ohne die Verbindung zu öffnen/zu schließen, aber den ersten nicht vor der Verwendung des zweiten entsorgen, erhalten Sie einen Konflikt, der besagt, dass die Verbindung bereits mit einem offenen Leser verbunden ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X