Zitat von
Sherlock:
...Genau das würde ich nicht machen.
Da ich meinen Code stehts teste, macht mir das nichts: Das ist ja ein relativ einfacher Fehler, der sofort auffällt.
Aber:
Wenn ich einen langen
SQL-Ausdruck im Code zusammenbasteln würde, dann habe ich ja schon etwas falsch gemacht. Bei längeren
SQL-Anweisungen erstelle ich mir dafür im RDMBS eine View, Funktion oder Stored Procedure (je nachdem, was das RDBMS so kann).
Und wenn ich mal frickeln muss/will/darf/kann, dann mache ich das so (mit Leerzeichen am Ende. Das bekommt man schon hin. Von mir aus auch ein crlf oder was weiss ich):
Delphi-Quellcode:
Const
sqlLongStmt = 'SELECT * FROM SQLTable '
+ 'WHERE Foo = Bar '
+ 'AND Bar = 2';
...
SQLQuery.Execute (sqlLongStmt);
...
SQLQuery.SQL.Text := sqlLongStmt;
...
"Magic Strings im Code sind schlecht".
Ich lass mir meinen Delphi-Code doch nicht durch ellenlange 'Add'-Aufrufe (oder Stringkonstanten, die über mehrere Zeilen gehen) unleserlich machen. Wichtig ist (oben ist ein schlechtes Beispiel), das der Name der Konstanten selbsterklärend ist.
Hier mal ein Vergleich:
Delphi-Quellcode:
SQLQuery.SQL.Clear;
SQLQuery.SQL.Add('SELECT MAX(R.Total) FROM Customer C '+crlf;
SQLQuery.SQL.Add(' JOIN Revenue r ON c.CustomerID = r.CustomerID '+crlf;
SQLQuery.SQL.Add(' WHERE r.DateTime BETWEEN :DateFrom AND :DateTo';
// Befüllen mit Parametern
....
// Oder so
Const
GetHighestRevenueOfLastFY = 'SELECT MAX(R.Total) FROM Customer C '
+ 'JOIN Revenue r ON c.CustomerID = r.CustomerID '
+ 'WHERE r.DateTime BETWEEN :DateFrom AND :DateTo';
....
SQLQuery.SQL.Add := GetHighestRevenueOfLastFY;
// Befüllen mit Parametern
So versteht das auch jemand, der kein
SQL kann. Zugegeben, o.g.
SQL ist simpel, aber was ist, wenns mal richtig komplex wird? Wie gesagt: Sobald mal ein JOIN drin vorkommt oder der Filter komplexer wird (oder.. oder.. oder), bau ich mir lieber eine VIEW zusammen. Dann packe ich die
Query aber trotzdem wie oben gezeigt in eine Konstante, gebe der einen guten Namen und verwende die im Code.
Um also die Frage des Threadstellers zu beantworten ('Wie würde ich ein langes
SQL-Statement im Delphi-Code formatieren?'): Gar nicht.