Entwickler-Ecke

Datenbanken - Unterschiedliche Delimiter bei Strings in SQL-Abfragen


Tranx - Di 07.01.14 09:03
Titel: Unterschiedliche Delimiter bei Strings in SQL-Abfragen
Hallo Leute,

mal wieder ein merkwürdiges Phänomen, das ich mir nicht erklären kann. Ich habe (Delphi 5, Access-Datenbank über ODBC, bitte jetzt keine Antworten, das sei überaltet) einen Effekt:

Bei einer TQuery werden Abfragen mit Quotedstr für Texte (" als Delimiter) ordnungsgemäß geöffnet.

Wenn ich jedoch eine Abfrage nach Summen von Feldern mache, und dort dann Eingrenzungen habe, muss ich die " durch ' ersetzen, sonst bekomme ich eine Fehlermeldung, dass die Abfrage Parameter sucht. Wie kann das sein, dass die TQuery.SQL mal so und mal zu benutzen ist? Liegt das etwa an RequestLive? Das ist bei der Summenabfrage nämlich auf False zu setzen, während es bei der normalen Abfrage auf True steht.


Beispiel "normale" TQuery:

Delphi-Quelltext
1:
'Select * FROM '#$D#$A'AUFTRÄGE'#$D#$A'WHERE (AKTJAHR = -1)'#$D#$A'AND NOT(AUFTR_TYP = "AN")'#$D#$A'ORDER BY NR'#$D#$A                    

Beispiel Summenabfrage (ebenfalls TQuery):

Delphi-Quelltext
1:
Select sum(IST_BET) as Ist, sum(Rechn_BET) as Rechn, sum(Netto_BET) as Netto, sum(Rabatt_BET) as Rabatt, Count(Auftr_Nr) As n'#$D#$A'FROM AUFTRÄGE '#$D#$A'WHERE (AKTJAHR = -1)'#$D#$A'AND NOT(AUFTR_TYP = 'AN')'#$D#$A                    


jaevencooler - Do 09.01.14 14:49

Moin, Moin,

Du solltest die Abfrage mit Parametern machen, das ist so oder so besser.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
myQuery.close;
myQuery.sql.add(' Select * FROM AUFTRÄGE '); 
myQuery.sql.add(' WHERE AKTJAHR = -1 ');
myQuery.sql.add('   AND NOT AUFTR_TYP = :refAuftr_typ ');
myQuery.sql.add(' ORDER BY NR ');

myQuery.ParambyName('refAuftr_typ').asstring = 'AN';
myQuery.Open;


das gleichg Schema für deine andere Abfrage, und da den ParambyName eben als asfloat oder asInteger
definieren.

Gruß
Michael


Tranx - Fr 10.01.14 09:25

Das mit den Parametern ist schwierig, da ich sehr unterschiedliche Abfragen (unterschiedliche Anzahl von Feldern auf unterschiedliche Anzahl von Vergleichswerten) in einer TQuery nutze. Und die Übertragung der SQL-Abfrage einer TQuery auf eine andere nutze ich für von Delphi erstellte SQL-Abfrage einer Access-Abfrage. Sie soll genau die gleiche Datenmenge abbilden, wie die aktuelle Abfrage auf die Access-Tabelle "Aufträge".

Was ich eben nicht verstehe ist die Tatsache, dass einmal das " als Textbegrenzer und zum anderen das ' als Textbegrenzer genommen werden muss. Ich habe das zwar dadurch gelöst, dass ich in dem SQL-Text jedes " durch ' ersetze, aber verstehen tue ich das nicht.