Ist es OK, SQLCommand als Parameter zu übergeben?

8

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.

    
etoisarobot 23.04.2010, 13:49
quelle

4 Antworten

6

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.

    
Eric Eijkelenboom 23.04.2010, 13:59
quelle
0

Warum änderst du es nicht so:

%Vor%

Möchten Sie zusätzliche Parameter? Erstellen Sie Überladungen, Refactor. Teilen Sie den meisten Code in gemeinsamer Funktion. Die Erstellung von new System.Data.SqlClient.SqlCommand() everywhere ist ein falscher Ansatz.

    
LukLed 23.04.2010 13:58
quelle
0

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:

%Vor%
  

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 ...)

    
Heinzi 23.04.2010 14:11
quelle
-1

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.

    
JustLoren 23.04.2010 13:54
quelle

Tags und Links