Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage mit BETWEEN geht nicht. (https://www.delphipraxis.net/26530-sql-abfrage-mit-between-geht-nicht.html)

Die Muhkuh 24. Jul 2004 20:40


SQL-Abfrage mit BETWEEN geht nicht.
 
Hi,


bin grad in SQL eingestiegen und schon kommen die Fehler :mrgreen:

Mein Code:

Delphi-Quellcode:
SQL.Close;
  SQL.SQL.Add('SELECT * FROM artikel' +
              'WHERE verkaufspreis BETWEEN 80 AND 500');
  SQL.Open;
Kommt eine Meldung:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: 'Ungültiges Schlüsselwort
Symbol-String: BETWEEN
Zeilennummer: 1'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------


verkaufpreis ist mit $ (Währung) angeben (in der DB).

Vielleicht kann mir jemand helfen ;).

bttb930 24. Jul 2004 21:35

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
füg mal ein freizeichen vor dem WHERE ein, dann geht's

Sharky 25. Jul 2004 06:34

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Zitat:

Zitat von Spider
Hi,
bin grad in SQL eingestiegen und schon kommen die Fehler :mrgreen:

Mein Code:

Delphi-Quellcode:
SQL.Close;
  SQL.SQL.Add('SELECT * FROM artikel' +
              'WHERE verkaufspreis BETWEEN 80 AND 500');
  SQL.Open;
.

Hai Spider,
den Grund für die Fehlermeldung hat bttb930 ja schon gesagt ;-)
Zur Zeit schaut dein SQL-Befehl ja so aus:
SQL-Code:
SELECT * FROM artikelWHERE verkaufspreis BETWEEN 80 AND 500
Dann noch drei Tips zu deinem Code:

a) SQL ist wohl deine Querykomponente? In diesem Fall fürde ich ihr auch einen Namen geben der zeigt das es sich um ein Query handelt.
b) Du fügst mit .SQL.ADD eine neue Zeile zu deiner Abfrage hinzu. Wenn diese vorher aber schon einen SQL-Befehl enthalten hat bekommst Du ein Problem. Also entweder vorher ein .SQL.Clear oder direckt die Eigenschaft SQL.Text setzen.
c) Fange so früh wie möglich (jetzt gleich) an beim Aufbau deiner SQL-Befehle mit Parametern zu arbeiten. Das wird dir viel arbeit ersparen

Die Muhkuh 25. Jul 2004 07:41

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Moin,

Thx, das war der Fehler!

@Fish

zu a) Im moment hab ich eh bloß eine Query, ein DBGrid, eine Datesource und ein Button aufem Formular. Das wird nix größeres nur mal so zum testen der einzelnen Funktionen von SQL.

zu b) Wird gemacht!

zu c) Wie meinst du das genau? So:

Delphi-Quellcode:
var
  Name: String;
begin
  Name := Edit1.Text;
  [...}
  SQL.SQL.Add('SELECT ' + Name + ' FROM [...}');


*MFG*

PS: Mein Code sieht nun so aus:

Delphi-Quellcode:
  SQL.Close;
  SQL.SQL.Clear;
  SQL.SQL.Add('SELECT name, einkaufspreis FROM artikel WHERE verkaufspreis ' +
              'BETWEEN 60 AND 800');
  SQL.Open;

Sharky 25. Jul 2004 07:50

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Zitat:

Zitat von Spider
..
zu c) Wie meinst du das genau? So:
.
.
.

Hai Spinnengetier ;-)

Nö, ich meinte Parameter
In deinem Fall also so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  With Query1 do
  begin
    Close;
    SQL.Text :=
     'SELECT name, einkaufsprei FROM artikel' + #10
     + 'WHERE verkaufspreis BETWEEN :wert1 AND :wert2';
    // :wert1 und :wert2 sind die Parameter.
    // Diese werden dann erst gesetzt.
    ParamCheck := True;
    Params.ParamByName('wert1').AsInteger := 60;
    Params.ParamByName('wert2').AsInteger := 800;
    Open;
  end;
end;

Die Muhkuh 25. Jul 2004 07:58

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
@Nicht_Säugetierfähige_Gatung :mrgreen:


Aso. Und bei den Werten muss immer ein Doppelpunk( : ) davor sein? Warum?

mirage228 25. Jul 2004 08:01

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Zitat:

Zitat von Spider
@Nicht_Säugetierfähige_Gatung :mrgreen:


Aso. Und bei den Werten muss immer ein Doppelpunk(:) davor sein? Warum?

Hi

Weils Parameter sind, muss der Doppelpunkt stehen. Dann kannst du sie mit ParamByName z.B. ansprechen ;)

mfG
mirage228

Sharky 25. Jul 2004 08:02

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Zitat:

Zitat von Spider
...muss immer ein Doppelpunk(:) davor sein? Warum?

Damit sie als Parameter erkannt werden ;-)
Wie Du sie dann nennst ist egal, nur der Doppelpunkt davor ist wichtig.
Hier hatte ich schon einmal etwas zu den Parametern geschrieben. Dann wird es sicher auch einleuchtender warum Du sie verwenden solltest.

Die Muhkuh 25. Jul 2004 08:08

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Hai,

und das gleiche könnte ich auch mit INSERT INTO machen?

z.B.:

Delphi-Quellcode:
SQL.Close;
  SQL.SQL.Clear;
  SQL.SQL.Add('INSERT INTO artikel (name, einkaufspreis, verkaufspreis, bestand)' +
              ' VALUES (":name", ":ek", ":vk", ":bestand")');
  SQL.Params.ParamByName('name').AsString := Edit1.Text;
  SQL.Params.ParamByName('ek').AsString := Edit2.Text;
  SQL.Params.ParamByName('vk').AsString := Edit3.Text;
  SQL.Params.ParamByName('bestand').AsString := Edit4.Text;
  SQL.Open;

Und dann noch so ne grundlegende Frage:

Wo ist der Unterschied zwischen:

Delphi-Quellcode:
SQL.Params.ParamByName('name').AsString := Edit1.Text
und

Delphi-Quellcode:
SQL.ParamByName('name').AsString := Edit1.Text
?

Sharky 25. Jul 2004 11:27

Re: SQL-Abfrage mit BETWEEN geht nicht.
 
Zitat:

Zitat von Spider
...und das gleiche könnte ich auch mit INSERT INTO machen?..

Jup. Du kannst Parameter aber nicht für z.B. den Tabellennamen nehmen.
Delphi-Quellcode:
begin
  SQL.Close;
  SQL.SQL.Clear;
  SQL.SQL.ADD ('SELECT * FROM :tabelle');
  ParamByName ('tabelle').AsString := 'artikel';
end;
Geht z.B. nicht.

Zitat:

Wo ist der Unterschied zwischen:...
Es gibt keinen, der Compiler erkennt das ParamByName eine "untereigenschaft" von Params ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr.
Seite 1 von 2  1 2      

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