Ich habe eine Business-Schicht, die eine Conn-Zeichenfolge und einen SQLCommand wie
an eine Datenschicht übergibt %Vor%Der DataLayer führt dann einfach die sql wie folgt aus
%Vor%Ist es in Ordnung, den SQLCommand als Parameter zu übergeben, oder gibt es einen besser akzeptierten Weg? Eine meiner Sorgen ist, wenn beim Ausführen der Abfrage ein Fehler auftritt, wird die cmd.dispose-Zeile niemals ausgeführt. Bedeutet das, dass es weiterhin Speicherplatz verbraucht, der niemals freigegeben wird?
Aktualisierung:
Nach Erics Rat teilte ich die Business- und Datenlayer explizit auf, damit die Methode in der Business-Schicht so aussieht
%Vor%und Methode, die in der DataLayer aufgerufen wird, sieht so aus.
%Vor%Auf diese Weise wird deutlich, dass sowohl der SQLCommand als auch die SQLConnection ordnungsgemäß entsorgt werden. Danke.
Im Idealfall sollte Ihre Business-Schicht die Implementierungsdetails Ihrer Datenschicht nicht kennen. Ob Sie also die Datenschicht mit SqlCommand
-Objekten oder mit etwas wie NHibernate implementieren, sollte für die Business-Schicht irrelevant sein. Dies macht es theoretisch leicht, Ihre Datenschicht zu verschieben und durch eine andere zu ersetzen.
Zusammenfassung: Die Weitergabe von SqlCommand
von der Business-Schicht an die Datenschicht wird in meinen Augen nicht als gute Praxis angesehen.
Bezüglich Dispose()
: Wenn Sie eine using-Anweisung verwenden (wie using(SqlConnection ...)
), wird die Methode Dispose()
automatisch am Ende der using-Anweisung aufgerufen. Sie müssen dies nicht manuell tun.
Derjenige, der das Kommando erstellt, sollte dafür verantwortlich sein. Der einfachste Weg dafür ist, den Aufruf von cmd.Dispose
von ExecSql
zu entfernen und stattdessen Ihre Funktion wie folgt aufzurufen:
Einer meiner Bedenken ist, wenn beim Ausführen der Abfrage ein Fehler auftritt, wird die cmd.dispose-Zeile niemals ausgeführt. Bedeutet das, dass es weiterhin Speicherplatz verbraucht, der niemals freigegeben wird?
Zufälligerweise muss SqlClient.SqlCommand
nicht entsorgt werden. Dies ist jedoch ein Implementierungsdetail, auf das Sie sich nicht verlassen sollten - die allgemeine Regel lautet immer noch: Wenn es IDisposable
implementiert, müssen Sie es entsorgen. (% Co_de%, zum Beispiel muss entsorgt werden ...)
Nun, für den Anfang könnten Sie es ändern zu:
%Vor%Außerdem unterscheide ich meine Geschäfts- und Datenschichten generell stärker als Sie. Meine Business-Schicht würde eine Methode "GetLocalSurvey" in der Datenschicht aufrufen, die den gesamten SQL-Unsinn behandeln würde.