Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: Wie größere SQL Statements schreiben?

  Alt 18. Nov 2009, 13:06
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat