![]() |
Datenbank: Access • Version: 2007 • Zugriff über: ADO
Wie größere SQL Statements schreiben?
Hallo :hi: ,
ich hoffe, dass ich hier in der richtigen Rubrik bin. Meine Frage ist allgemein zu SQL-Statements. Wie schreibt ihr denn größere SQL-Statements, mit mehreren Parametern usw., in Delphi? :gruebel: |
Re: Wie größere SQL Statements schreiben?
Na man trägt es in das TStrings-Objekt ein, oder man nutzt Views oder SPs.
Was genau ist deine Frage? |
Re: Wie größere SQL Statements schreiben?
Ja, sorry. Hätte ich genauer schreiben sollen.
Wie das technisch geht ist mir klar, mir geht es um die Formatierung im Quellcode. |
Re: Wie größere SQL Statements schreiben?
Ich formatier das so, daß es im Quellcode nicht stört, und beim SQL-Monitor nicht alles in einer Zeile landet.
Sprich: mit TQuery.SQL.Add() jeweils immer eine Zeile hinzufügen. Was ich definitv vermeide ist einen SQLString irgendwie zusammenzubasteln und diesen dann in die Query zu setzen, das geht nur schief, da man dann selber auf Leerzeichen und sonstiges achten muss. Sherlock |
Re: Wie größere SQL Statements schreiben?
Im Moment nehme ich auch SQL.Add() und füge das Zeile für Zeile ein. Es sieht nur im Code komisch aus, daher habe ich hier gefragt.
SQL-Strings zusammenbasteln ist natürlich nicht so toll. :mrgreen: |
Re: Wie größere SQL Statements schreiben?
Delphi-Quellcode:
query.sql.text := 'SELECT * FROM tabelle ' +
'WHERE blubb = :blubb AND ' + 'meow = :meow ' + 'ORDER BY wuppdi'; |
Re: Wie größere SQL Statements schreiben?
Ich mache es z.B. so:
Delphi-Quellcode:
begin
query := TQuery.Create(nil); try with query.sql do begin Clear; Add('SELECT'); Add(' *'); Add('FROM tabelle'); Add('WHERE'); Add(' (blubb = :blubb) AND'); Add(' (meow = :meow)'); Add('ORDER BY wuppdi'); end; query.ParamByName('meow').AsString := 'Test'; query.ParamByName('blubb').AsInteger := 123; query.Open; // Etwas tun query.Close; finally query.Free; end; end; |
Re: Wie größere SQL Statements schreiben?
Zitat:
Sherlock |
Re: Wie größere SQL Statements schreiben?
Dann halt so ;-) (pseudo code)
Delphi-Quellcode:
const crlf = #10#13
beging query.sql.text := 'SELECT * FROM tabelle' + crlf + 'WHERE blubb = :blubb AND' + crlf + 'meow = :meow' + crlf + 'ORDER BY wuppdi'; und für "+ crlf +" ein kleines template. |
Re: Wie größere SQL Statements schreiben?
Es gibt übrigens schon eine Konstane dafür sLineBreak
|
Re: Wie größere SQL Statements schreiben?
Zitat:
|
Re: Wie größere SQL Statements schreiben?
Zitat:
Delphi-Quellcode:
Mein TOAD kann daraus auch sehr einfach den SQL-Befehl "strippen". Aus Deiner Variante vermutlich auch...aber..naja, aber halt.
query.sql.add('SELECT * FROM tabelle');
query.sql.add('WHERE blubb = :blubb AND'); query.sql.add('meow = :meow'); query.sql.add('ORDER BY wuppdi)'; Sherlock |
Re: Wie größere SQL Statements schreiben?
Zitat:
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:
"Magic Strings im Code sind schlecht".
Const
sqlLongStmt = 'SELECT * FROM SQLTable ' + 'WHERE Foo = Bar ' + 'AND Bar = 2'; ... SQLQuery.Execute (sqlLongStmt); ... SQLQuery.SQL.Text := sqlLongStmt; ... 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:
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.
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 Um also die Frage des Threadstellers zu beantworten ('Wie würde ich ein langes SQL-Statement im Delphi-Code formatieren?'): Gar nicht. |
Re: Wie größere SQL Statements schreiben?
Danke schon mal für die vielen Antworten.
Das mit den Views kenne ich jetzt nicht, werde ich mir aber unbedingt anschauen. Ich habe jetzt ein SQL-Insert mit ca. 25 Parametern mit SQL.Add() zusammengebosselt, aber das sieht irgendwie so unübersichtlich aus. :? |
Re: Wie größere SQL Statements schreiben?
Zitat:
![]() |
Re: Wie größere SQL Statements schreiben?
Zitat:
Sherlock |
Re: Wie größere SQL Statements schreiben?
Zitat:
Die einfachste Möglichkeit, hier übersicht zu schaffen, wäre die, das Du den schwer lesbaren Code in eine separate Prozedur mit einem guten Namen verlagerst und ordentlich kommentierst. Eine weitere Möglichkeit hat Sherlock aufgezeigt: Verzichte ganz auf das Basteln von SQL-Anweisungen und überlasse das Delphi: Verwende dazu Datenmodule, die die Verbindung zur Datenbank sowie die benötigten TxxQuery, TxxTable usw. enthalten. Auf deinem Formular plazierst Du eine TDatasource, die sich mit den Datenmengen im Datenmodul verbindet. Alle TDBEdits verbinden sich mit der TDatasource. Dann noch einen TDBNavigator (oder eine ähnliche Funktionalität per TButton) und -wupps- bist du fertig. Der einzige kleine Nachteil an dieser RAD-Lösung: Es ist nirgens im Code dokumentiert, das (und wie!) die Daten in Richtung Datenbank geschubst werden. Dafür ist es stabil, sicher und funktioniert. |
Re: Wie größere SQL Statements schreiben?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz