2009-06-05 10 views
7

Ich weiß, es gab zahlreiche Fragen hier über Inline-SQL vs gespeicherte Prozeduren ... Ich möchte nicht eine andere so starten! Dies ist über Inline (oder dynamische) SQL.Was sind die besten Praktiken zur Formatierung von Inline-SQL mit ADO.NET in C#

Ich weiß auch, dass dieser Punkt mehr oder weniger strittig mit Linq zu SQL und seinem Nachfolger Entity Framework geworden ist.

Aber ... Angenommen, Sie haben gewählt (oder werden von Ihren Vorgesetzten benötigt), um mit dem alten ADO.NET und inline (oder dynamisch) sql zu arbeiten. Was sind dann die besten Praktiken dafür und für die Formatierung der SQL?

Was ich jetzt mache, ist folgendes: Ich möchte meine SQL-Anweisungen zuerst in einer gespeicherten Prozedur erstellen. Dies gibt mir Syntaxfärbung in SQL Server Management Studio und die Möglichkeit, die Abfrage problemlos zu testen, ohne sie über die von mir entwickelte Anwendung im Code ausführen zu müssen.

Also, solange ich Umsetzung/Debugging, sieht mein Code wie folgt aus:

using (SqlConnection conn = new SqlConnection("myDbConnectionString")) 
    { 
     conn.Open(); 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "myStoredProcName"; 
      // add parameters here 
      using (SqlDataReader rd = cmd.ExecuteReader()) 
      { 
       // read data and fill object graph 
      } 
     } 
    } 

Sobald das Debugging und die Testphase abgeschlossen ist, ich den Code oben wie folgt zu ändern:

using (SqlConnection conn = new SqlConnection("myDbConnectionString")) 
    { 
     conn.Open(); 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = GetQuery(); 
      // add parameters here 
      using (SqlDataReader rd = cmd.ExecuteReader()) 
      { 
       // read data and fill object graph 
      } 
     } 
    } 

Und ich füge eine zusätzliche private Methode zB hinzu GetQuery(), in dem ich Kopieren/den ganzen Block der gespeicherten Prozedur wie folgt ein:

private string GetQuery() 
    { 
     return @" 
    SET NOCOUNT ON; 
    SELECT col1, col2 from tableX where id = @id 

    -- more sql here 
     "; 
    } 

wie diese Arbeiten hat den Vorteil, dass ich den Code zurückkehren kann leicht wieder die gespeicherte Prozedur aufrufen, wenn ich zu debuggen/update haben der sql-code später, und sobald es fertig ist, kann ich den sql-code wieder mit copy/paste, , ohne zitate um jede zeile und so Zeug setzen.

Ist es eine gute Übung, Zeilenumbrüche in die Abfrage einzufügen?
Gibt es andere Dinge oder Tricks, an die ich nicht gedacht habe, die diesen Ansatz verbessern können?
Wie macht man so etwas?
Oder bin ich der einzige, der immer noch inline sql verwendet (muss verwenden)?

+2

LINQ-zu-SQL ist ** nicht ** "offiziell tot"; es ist immer noch ein unterstütztes Produkt mit fortlaufender Entwicklung; EF konzentriert sich einfach auf neue Funktionen. –

+0

Sorry war nur etwas zitieren ich in anderen Fragen hier gefunden ... entfernt es ;-) – fretje

Antwort

7

Inline (mit oder ohne die literale @"..." Syntax) ist gut für kurze Abfragen ... aber für etwas länger, in Betracht ziehen, die Tsql als eine Datei im Projekt; entweder als eingebettete Ressourcen/resx oder als flache Dateien. Natürlich sollte man zu diesem Zeitpunkt sowieso eine gespeicherte Prozedur erstellen; -p

Aber wenn es als separate Datei verwendet wird, erzwingt es die gleiche Trennung, die es später zu einer gespeicherten Prozedur macht (wahrscheinlich nur Hinzufügen von CREATE PROC usw.).

Ein Problem mit Inline - es macht es so verlockend für jemanden, Benutzereingaben zu verketten ... was offensichtlich schlecht ist (Sie haben im Beispiel korrekt Parameter verwendet).

+0

ja, die Parameter sind ein weiterer Grund, um alles in eine gespeicherte Prozedur zuerst ... Ich sql nie verketten! – fretje

+0

gut ich sql manchmal verketten (um das DRY-Prinzip zu beachten) ... aber ich verkette es nie mit Benutzereingabe ;-) – fretje

+0

Wenn Sie es in flache Dateien einfügen, wie bekommen Sie es dann in den Befehl? – fretje

2

Ich habe .NET-Ressourcendateien in der Vergangenheit verwendet. Diese waren praktisch, um eine Bibliothek aller in einer bestimmten Codebibliothek verwendeten Abfragen zu behalten, insbesondere wenn die gleiche Abfrage an mehreren Stellen verwendet werden könnte (ja, ich weiß, dass dies auch auf ein schlechtes Design hinweist, aber manchmal muss man innerhalb der angegebenen Box arbeiten) für dich).

0

Jenseits nicht-triviale SQL-Anweisungen einzeilig, ich nehme immer den Vorteil-line Multi und eine konst machen

const string SelectMyTable = @" 
SELECT column_one 
    , column_two 
    , column_three 
    FROM my_table 
"; 

Das alles mir zum Testen SQL Manager ausschneiden und einfügen.

Verwandte Themen