Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [SQL]: SyntaxProbs (https://www.delphipraxis.net/21726-%5Bsql%5D-syntaxprobs.html)

yankee 7. Mai 2004 09:06


[SQL]: SyntaxProbs
 
Ich habe die Fogende Abfrage an 'nem MySQL-Server:
Delphi-Quellcode:
ZQuery1.SQL.Text :='SELECT * FROM buecher WHERE `Titel`=''' +WTitel+ ''' `Verlag`=''' +WVerlag+ ''' `Bestellnr`=''' +WBestellnr+ ''' `Preis`=''' +WPreis+ '';
Bloß funzt es nicht. Kurze Erklärung:
WTitel, WVerlag usw. Sind Variabeln. In meinem Beispiel habe ich einfach ein * drin. Ich habe es auch schon mit einem % versucht...

Was ist daran falsch?

sakura 7. Mai 2004 09:12

Re: [SQL]: SyntaxProbs
 
Ich täte es so tun:

Delphi-Quellcode:
ZQuery1.SQL.Text :='SELECT * FROM buecher WHERE [Titel]=' + QuotedStr(WTitel) + ' [Verlag]=' + QuotedStr(WVerlag) + ' [Bestellnr]=' + QuotedStr(WBestellnr) + ' [Preis]=' + QuotedStr(WPreis);
...:cat:...

yankee 7. Mai 2004 09:22

Re: [SQL]: SyntaxProbs
 
Ich habe den Text aus deinem Beitrag sogar go copy&pasted, aber der Syntaxfehler bleibt gleich.

shmia 7. Mai 2004 09:23

Re: [SQL]: SyntaxProbs
 
Also ich würde es auch so wie Sakura machen; aber zusätzlich noch ein
AND zwischen die Vergleiche in der Where-Bedingung einfügen. :mrgreen: :mrgreen:

sakura 7. Mai 2004 09:30

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von shmia
AND zwischen die Vergleiche in der Where-Bedingung einfügen. :mrgreen: :mrgreen:

:lol: Ja, den Teil habe ich gar nicht realisiert :oops:

...:cat:...

Sharky 7. Mai 2004 09:38

Re: [SQL]: SyntaxProbs
 
Hai yankee,

ich kann nur einen Tip geben;-) baue deine SQL-Strings anders auf :stupid:

Hier einmal ein Beispiel wie ich es in diesem Fall machen würde:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with ZQuery1 do
  begin
    Close;
    SQL.Text :=
     'SELECT * FROM buecher ' + #10 +
     'WHERE (Titel LIKE :WTitel)' +#10+
     'AND (Verlag LIKE :WVerlag)' +#10+
     'AND (Bestellnr LIKE :WBestellnr)' +#10+
     'AND (Preis = :WPreis)';
    // Ein * in dem Suchtext wird durch den SQL-Wildcart '%' ersetzt
    ParamByName ('WTitel').AsString := StringReplace(WTitel,'*','%',[rfReplaceAll]);
    ParamByName ('WVerlag').AsString := StringReplace(WVerlag,'*','%',[rfReplaceAll]);
    ParamByName ('WBestellnr').AsString := StringReplace(WBestellnr,'*','%',[rfReplaceAll]);
    ParamByName ('WPreis').AsString := StringReplace(WPreis,'*','%',[rfReplaceAll]);
    Open;
  end;
end;

yankee 7. Mai 2004 09:51

Re: [SQL]: SyntaxProbs
 
das bringt mich weiter, thx.
Aber in Problem bleibt: Es kommt zwar keine Fehlermeldung mehr, aber es passiert dafür auch grundsätzlich nicht. Mal die komplette Procedure:
Delphi-Quellcode:
procedure TMainForm.LoadTitleList(WTitel, WVerlag, WBestellnr, WPreis:string);
begin
    ZQuery1.SQL.Text :='SELECT * FROM buecher ' + #10 +
     'WHERE (Titel LIKE :WTitel)' +#10+
     'AND (Verlag LIKE :WVerlag)' +#10+
     'AND (Bestellnr LIKE :WBestellnr)' +#10+
     'AND (Preis = :WPreis)';
    ZQuery1.Open;
    while not ZQuery1.Eof do
    begin
        TitelComboBox.Items.Add(ZQuery1.FieldByName('Titel').AsString);
        VerlagComboBox.Items.Add(ZQuery1.FieldByName('Verlag').AsString);
        BestellnrComboBox.Items.Add(ZQuery1.FieldByName('Bestellnr').AsString);
        PreisComboBox.Items.Add(ZQuery1.FieldByName('Preis').AsString);
        ZQuery1.Next;
    end;
end;
Ich rufe die Procedure dann noch mit
LoadTitleList('%','%','%','%');
auf.

Sharky 7. Mai 2004 09:52

Re: [SQL]: SyntaxProbs
 
Ähm....

Wo ist in dem Code das ParamByName???

yankee 7. Mai 2004 09:59

Re: [SQL]: SyntaxProbs
 
Den Befehl kannte ich bis jetzt nicht. Ich habe mal in der OH nachgesehen, aber daraus werde ich nicht schlau (zumal die auf Englisch ist...)

Sharky 7. Mai 2004 10:07

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von yankee
Den Befehl kannte ich bis jetzt nicht. Ich habe mal in der OH nachgesehen, aber daraus werde ich nicht schlau (zumal die auf Englisch ist...)

Dann ein einfaches Beispiel :stupid:

Delphi-Quellcode:
begin
  with Query1 do
  begin
    Close;
    SQL.Text := 'SELECT * FROM tabelle WHERE name = :myParameter';
    ParamByName ('myParameter').AsString := 'Sharky';
    Open;
  end;
end;
:myParameter ist ein Parameter in der SQL-Anweisung. Diesem muss jetzt mit der Funktion ParamByName ein Wert zugewiesen werden.

Beim DB-Server kommt dann folgender SQL-Befehl an:
SQL-Code:
SELECT * FROM tabelle WHERE name = 'Sharky'
Der Vorteil ist:
a) Der Quellcode ist übersichtlicher
b) Du brauchst dich nicht um die richtige "Formatierung" zu kümmern, das sollte der Treiber machen. (z.B. Das Richtige Datumsformat, Text in Hochkommas setzen usw.

Robert_G 7. Mai 2004 10:21

Re: [SQL]: SyntaxProbs
 
Das würde so auf jeden Falle klappen (du musst höchtens noch Prameter.Value durch irgendwas erstezen, dass die ZEOS verwenden):
Delphi-Quellcode:
With DeineQuery Do
Begin
  SQL.Text :=
    'SELECT *' + #10 +
    'FROM  Buecher' + #10 +
    'WHERE Titel    Like :WTitel    And' + #10 +
    '      Verlag   Like :WVerlag   And' + #10 +
    '      Bestellnr Like :WBestellnr And' + #10 +
    '      Preis    =   :WPreis';
  // Parameterzuweisung
  With Parameters Do
    ParamByName('WTitel').Value    := WTitel;
    ParamByName('WVerlag').Value   := WVerlag;
    ParamByName('WBestellnr').Value := WBestellnr;
    ParamByName('WPreis').Value    := WPreis;
  End;
  // Ausführen
  Open;
End;

yankee 7. Mai 2004 10:56

Re: [SQL]: SyntaxProbs
 
Jo, thx. Ein Problem bleibt noch: Die while-Schleife wird nur einmal durchlaufen, anstatt 3mal.
Was soll das?
Delphi-Quellcode:
    while not ZQuery1.Eof do
    begin
        TitelComboBox.Items.Add(ZQuery1.FieldByName('Titel').AsString);
        VerlagComboBox.Items.Add(ZQuery1.FieldByName('Verlag').AsString);
        BestellnrComboBox.Items.Add(ZQuery1.FieldByName('Bestellnr').AsString);
        PreisComboBox.Items.Add(ZQuery1.FieldByName('Preis').AsString);
        ZQuery1.Next;
    end;

Sharky 7. Mai 2004 11:02

Re: [SQL]: SyntaxProbs
 
Bist Du sicher das auch drei Einträge zurück gegeben werden?
Prüfe das mal durch ein einfaches:

Delphi-Quellcode:
begin
  //Die Abfrage
  Open;
  ShowMessage ('Es wurden ' + IntToStr (ZQuery1.RecordCount) + ' Einträge gefunden');
  while not ZQuery1.Eof do
    begin
        TitelComboBox.Items.Add(ZQuery1.FieldByName('Titel').AsString);
        VerlagComboBox.Items.Add(ZQuery1.FieldByName('Verlag').AsString);
        BestellnrComboBox.Items.Add(ZQuery1.FieldByName('Bestellnr').AsString);
        PreisComboBox.Items.Add(ZQuery1.FieldByName('Preis').AsString);
        ZQuery1.Next;
    end;
end;

yankee 7. Mai 2004 11:05

Re: [SQL]: SyntaxProbs
 
Nein, es wird nur ein Ergebnis zurückgegeben.
Aber PHPMyAdmin bestätigt mir, dass 3 Einträge vorhanden sind...

Sharky 7. Mai 2004 11:09

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von yankee
Nein, es wird nur ein Ergebnis zurückgegeben.
Aber PHPMyAdmin bestätigt mir, dass 3 Einträge vorhanden sind...

Dann liegt es an der WHERE Bedingung. Hast Du da noch einen kleinen Fehler?
Poste mal deine Aktuelle Procedure und die Feld-Definition der Tabelle.

yankee 7. Mai 2004 11:15

Re: [SQL]: SyntaxProbs
 
Delphi-Quellcode:
procedure TMainForm.LoadTitleList(WTitel, WVerlag, WBestellnr, WPreis:string);
begin
    With ZQuery1 Do
    Begin
        SQL.Text :=
        'SELECT *' + #10 +
        'FROM  Buecher' + #10 +
        'WHERE Titel    Like :WTitel    And' + #10 +
        '      Verlag   Like :WVerlag   And' + #10 +
        '      Bestellnr Like :WBestellnr And' + #10 +
        '      Preis    =   :WPreis';
      // Parameterzuweisung
        ParamByName('WTitel').Value    := WTitel;
        ParamByName('WVerlag').Value   := WVerlag;
        ParamByName('WBestellnr').Value := WBestellnr;
        ParamByName('WPreis').Value    := WPreis;
        Open;
         ShowMessage ('Es wurden ' + IntToStr (ZQuery1.RecordCount) + ' Einträge gefunden');
    End;
    while not ZQuery1.Eof do
    begin
        TitelComboBox.Items.Add(ZQuery1.FieldByName('Titel').AsString);
        VerlagComboBox.Items.Add(ZQuery1.FieldByName('Verlag').AsString);
        BestellnrComboBox.Items.Add(ZQuery1.FieldByName('Bestellnr').AsString);
        PreisComboBox.Items.Add(ZQuery1.FieldByName('Preis').AsString);
        ZQuery1.Next;
    end;
end;
Aufruf:
LoadTitleList('%','%','%','%');
Könnte es damit zusammenhängen, dass der Preis FLOAT ist und nicht mit einem % aufgerufen werden kann. Ich habe nämlich einen Datensatz, der bei Preis null hat...

Sharky 7. Mai 2004 11:18

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von yankee
...Könnte es damit zusammenhängen, dass der Preis FLOAT ist und nicht mit einem % aufgerufen werden kann. Ich habe nämlich einen Datensatz, der bei Preis null hat...

Ja klar! Es würde ja auch keinen Sinn machen einen Preis zu suchen der z.B. 1* Euro kostet ;-)
Entweder wird genau nach einem Preis gesucht oder Du machst es mit zwei Variablen und einer BETWEEN abfrage.

yankee 7. Mai 2004 11:40

Re: [SQL]: SyntaxProbs
 
Gut, dann lasse ich den Preis vorläufig mal raus...
Jedenfalls lautet die SQL-Abfrage jetzt so:
Delphi-Quellcode:
SQL.Text :=
        'SELECT *' + #10 +
        'FROM  Buecher' + #10 +
        'WHERE Titel    Like :WTitel    And' + #10 +
        '      Verlag   Like :WVerlag   And' + #10 +
        '      Bestellnr Like :WBestellnr And';
Und es gibt 'ne exception. (Also jetzt nicht beim compilieren, sondern zur Laufzeit). Wieso?

Sharky 7. Mai 2004 11:44

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von yankee
...
Delphi-Quellcode:
' Bestellnr Like :WBestellnr And';
Und es gibt 'ne exception. (Also jetzt nicht beim compilieren, sondern zur Laufzeit). Wieso?

Das letze AND muss natürlich raus ;-)

shmia 7. Mai 2004 11:44

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von yankee
Und es gibt 'ne exception. (Also jetzt nicht beim compilieren, sondern zur Laufzeit). Wieso?

Weil nach dem letzten AND nichts mehr folgt !! :wall:

yankee 7. Mai 2004 12:18

Re: [SQL]: SyntaxProbs
 
DANKE EUCH ALLEN!!!!!!!!!!!
Gut, dass ich euch habe! Sonst wäre ich hoffnungslos verloren!

Sharky 7. Mai 2004 12:21

Re: [SQL]: SyntaxProbs
 
Zitat:

Zitat von yankee
DANKE EUCH ALLEN!!!!!!!!!!!
Gut, dass ich euch habe! Sonst wäre ich hoffnungslos verloren!

:?: Rechnungsadresse :?: :stupid: :tongue:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz