Entwickler-Ecke

Datenbanken - Probleme mit SQL-Code (Syntaxfehler/fehlender Operator)


Stocki1990 - Fr 26.02.10 22:41
Titel: Probleme mit SQL-Code (Syntaxfehler/fehlender Operator)
Guten Abend Leute!

Ich habe ein kleines Problem bei dem Ausführen eines SQL-Codes und bin mit
meinem Latein nun echt am Ende. Ich weiß nicht, wie man diese Hausübung am besten
lösen kann.

Ich habe eine Datenbank mit 2 Tabellen:
- Lieferscheine
- Lieferscheinedetail

In beiden Datenbanken kommt eine idente Auftragsnummer (zB 101010) vor.

Die Tabelle "Lieferscheine" wird in einem Listview ausgegeben. Die Auftragsnummer wurde als LV-Caption deklariert.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.AlleAuftrageeinlesen();
var
LI : TListItem;

begin

lv_auftrag.Items.clear;

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('SELECT * FROM Lieferscheine');
 ADOQuery1.open;

  While not ADOQuery1.Eof do begin
  LI := lv_auftrag.items.add;
  LI.caption := ADOQuery1.FieldValues['Lieferschein'];
  LI.subitems.add(ADOQuery1.FieldValues['LSDatum']);
  LI.subitems.add(ADOQuery1.FieldValues['Firma']);

{  if not ADOQuery1.FieldValues['RDatum'].IsNull and (ADOQuery1.FieldValues['RDatum'] <> '') then
  LI.SubItems.Add(ADOQuery1.FieldValues['RDatum']);}


   ADOQuery1.Next;
 end;
  adoquery1.close;
 end;


Um die Details des Lieferscheines aufrufen zu können, werden die Daten der Tabelle "Lieferscheinedetail" in ein 2tes Listview eingelesen. Aufgerufen wird das 2te Listview mit "Onklick"


Der Prozedur ist folgende:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.Auftragdetailseinlesen();
var
LI : TListItem;
Summe : integer;

begin

lv_details.Items.clear;

 ADOQuery1.close;
 ADOQuery1.SQL.clear;
 ADOQuery1.SQL.Add('SELECT * FROM Lieferscheindetails where Lieferschein =' + lv_auftrag.Selected.Caption);
 ADOQuery1.open;

  While not ADOQuery1.Eof do begin
  LI := lv_details.items.add;
  LI.caption := ADOQuery1.FieldValues['Lieferschein'];
  LI.subitems.add(ADOQuery1.FieldValues['Artikel']);
  LI.subitems.add(ADOQuery1.FieldValues['Menge']);
  LI.subitems.add(ADOQuery1.FieldValues['Einheit']);
  LI.subitems.add(ADOQuery1.FieldValues['Bezeichnung']);
  LI.subitems.add(ADOQuery1.FieldValues['Preis']);

   ADOQuery1.Next;

 end;
  adoquery1.close;

 end;


Nun kommt aber jedoch die Fehlermeldung, dass es einen "Syntaxfehler (fehlender Operator) in Abfrageausdruck" gibt.

Woran könnte dies liegen ????

Ich hoffe, dass ihr mir bei meinem Problem helfen könnt und wünsche euch natürlich noch ein schönes Wochenende.

Grüße Christoph


PS: Ich kann auch Screenshots einfügen, wenn euch dabei geholfen wäre


Xentar - Fr 26.02.10 22:48

user profile iconStocki1990 hat folgendes geschrieben Zum zitierten Posting springen:
PS: Ich kann auch Screenshots einfügen, wenn euch dabei geholfen wäre

Oder einfach die komplette Delphi Zeile +- 5 dadrüber / drunter.
Oder auch die komplette Prozedur.

Aber: Such hier im Forum mal nach Params oder ParamByName, vielleicht hilft dir das schon weiter.


Stocki1990 - Fr 26.02.10 22:59

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconStocki1990 hat folgendes geschrieben Zum zitierten Posting springen:
PS: Ich kann auch Screenshots einfügen, wenn euch dabei geholfen wäre

Oder einfach die komplette Delphi Zeile +- 5 dadrüber / drunter.
Oder auch die komplette Prozedur.

Aber: Such hier im Forum mal nach Params oder ParamByName, vielleicht hilft dir das schon weiter.


Hallo Xentar!

Danke für deine rasche Antwort :)

Habe nun die beiden Prozeduren eingefügt, um dir mein Problem genauer verdeutlichen zu können.

Grüße Christoph


BenBE - Sa 27.02.10 00:05

Bei Strings müssen Anführungszeichen um den Ausdruck mit dem nötigen Escaping. Alternativ (und zu bevorzugen) wären Prepared Statements oder Master\Client-Datenbank-Abfragen.


Stocki1990 - Sa 27.02.10 02:00

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Bei Strings müssen Anführungszeichen um den Ausdruck mit dem nötigen Escaping. Alternativ (und zu bevorzugen) wären Prepared Statements oder Master\Client-Datenbank-Abfragen.


Danke BenBE - Habe soeben deinen Rat befolgt und es funktioniert.

Der SQL-Code sieht nun folgendermaßen aus:


SQL-Anweisung
1:
ADOQuery1.SQL.Add('SELECT * From LieferscheinDetail WHERE Lieferschein = "' +  lv_auftrag.Selected.Caption +'" ');                    


Ihr seid echt die Besten :)

Grüße Christoph


Xentar - Sa 27.02.10 02:35

Schön geht trotzdem anders.. deswegen: such nach Params und Prepare!


BenBE - Sa 27.02.10 04:11

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Schön geht trotzdem anders.. deswegen: such nach Params und Prepare!

Und darum würde ich den Threadstarter auch dringend bieten. Weil in der Form ist das extrem gegen Fehler anfällig. Prepared Statements sind hier Stand der Technik.