Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   select mit ' läuft nicht (https://www.delphipraxis.net/208980-select-mit-laeuft-nicht.html)

Dr. Jack 8. Okt 2021 14:59

Datenbank: sqlite • Version: 3 • Zugriff über: firedac

select mit ' läuft nicht
 
Hallo zusammen,

mein Problem ist, dass ich mit einen Select direkt in der DB auch ein richtiges Ergebnis bekomme.

select * from fam_check where DATE(verfall, + '1 year') <= CURRENT_DATE AND (DATE(p_datum, + '5 years') <= CURRENT_DATE)

übertrage ich den Select in Delphi bekomme ich kein Ergebnis

Delphi-Quellcode:
 
       main.qryproducts.FetchOptions.AutoClose := False;
       main.qryproducts.SQL.Clear;
   
// erster Versuch so:
       main.qryproducts.SQL.Add('SELECT * ');
       main.qryproducts.SQL.Add('FROM fam_check ');
       main.qryproducts.SQL.Add('WHERE DATE(verfall, + '+ quotedstr('1 year')+  ' ) <= CURRENT_DATE' );
       main.qryproducts.SQL.Add('AND (DATE(p_datum, + ' +   quotedstr('5 years') +') <= CURRENT_DATE) '  );

// zweite Versuch mit Parametern        
       main.qryproducts.SQL.Add('SELECT * ');
       main.qryproducts.SQL.Add('FROM fam_check ')           ;
       main.qryproducts.SQL.Add('WHERE DATE(verfall, + :jahr_begin ) <= CURRENT_DATE' );
       main.qryproducts.SQL.Add('AND (DATE(p_datum, + :jahr_end   ) <= CURRENT_DATE) '  );

       main.qryproducts.ParamByName('jahr_begin').AsString := '1 year';
       main.qryproducts.ParamByName('jahr_end').AsString := '5 years';

       main.qryproducts.SQL.SaveToFile('S:\log.txt');

       main.qryproducts.Open;

        while not main.qryproducts.Eof do
          begin
          loeschfristen_apbetro_fam_insert_lv(main.qryproducts.FieldByName('ID').AsString,        
          main.qryproducts.FieldByName('name').AsString,main.qryproducts.FieldByName('dafo_kurz').AsString);
          main.qryproducts.Next;
          end;
die Ausgabe im Logfile kann ich 1:1 in die DB kopieren und es geht. Woran ligt es? Hoffe ihr könnt mir helfen thx.

himitsu 8. Okt 2021 15:18

AW: select mit ' läuft nicht
 
Was ist am zweiten Versuch verkehrt,
bzw. warum verwendest du das nicht?


Stimmt die Syntax so überhaupt?
Ich bin mir fast sicher, dass das + in den String gehört, und nicht davor.
SQL-Code:
DATE(verfall, '+1 year')




QuotedStr ist ausschließlich für die Pascal-Syntax, also aus ' wird ''.
Du brauchst aber eine Quote/Escape-Funktion für die SQL-Syntax, welche also aus ' ein \' machen, sowie aus \ ein \\ usw.

Hier wird es damit zufällig "funktionieren", so lange keine ' oder \ im String vorkommen.

Fazit: Such in deiner DB-Komponente, bzw. in deren Units nach einer passenden Funktion.


Und ja, daß in vielen Beispielen, Tutorials usw. QuoteStr genommen wird, ist grauenhaft und es war schon immer falsch, aber immer wieder wird dieser Mist kopiert.

Sherlock 8. Okt 2021 15:20

AW: select mit ' läuft nicht
 
Wie genau lautet denn die Fehlermeldung? Es fehlt ein kleines bisschen Exceptionhandling an der Stelle, die vielleicht Wunder wirken könnte. Oder zumindest Licht ins Dunkel bringen kann ;-)

Sherlock

Dr. Jack 8. Okt 2021 15:23

AW: select mit ' läuft nicht
 
Zitat:

Zitat von Sherlock (Beitrag 1495836)
Wie genau lautet denn die Fehlermeldung? Es fehlt ein kleines bisschen Exceptionhandling an der Stelle, die vielleicht Wunder wirken könnte. Oder zumindest Licht ins Dunkel bringen kann ;-)

Sherlock

Es gibt tatsächlich keine Fehlermeldung, ich bekomme nur einfach keinen Daten. D.h., wenn ich nur select * from fam_check nehme geht alles. Es liegt offensichtlich an der where bedingung, genauer an den Hochkommata

Dr. Jack 8. Okt 2021 15:29

AW: select mit ' läuft nicht
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von himitsu (Beitrag 1495835)
Was ist am zweiten Versuch verkehrt,
bzw. warum verwendest du das nicht?



QuotedStr ist ausschließlich für die Pascal-Syntax, also aus ' wird ''.
Du brauchst aber eine Quote/Escape-Funktion für SQL, Strings, welche also aus ' ein \' machen, sowie aus \ ein \\ usw.

Fazit: Such in deiner DB-Komponente, bzw. in deren Units nach einer passenden Funktion.


Und ja, daß in vielen Tutorials QuoteStr genommen wird ist grauenhaft und es war schon immer falsch, aber immer wieder wird dieser Mist kopiert.

Der zweite Versuch liefert auch kein Ergebnis. select * from fam_check geht. Nur die Where-Bedingung scheint irgendwie fehlerhaft zu sein.

Habe mal Bilder angehängt. 01 liefert kein Ergebnis mit der vollen Query. 02 ist auf select * from fam_check reduziert

himitsu 8. Okt 2021 15:32

AW: select mit ' läuft nicht
 
Siehe mein "Edit" da oben ... das bezüglich dem "+" :angle:

Dr. Jack 8. Okt 2021 15:39

AW: select mit ' läuft nicht
 
Zitat:

Zitat von himitsu (Beitrag 1495839)
Siehe mein "Edit" da oben ... das bezüglich dem "+" :angle:

Zitat:

Zitat von himitsu (Beitrag 1495835)
Was ist am zweiten Versuch verkehrt,
bzw. warum verwendest du das nicht?


Stimmt die Syntax so überhaupt?
Ich bin mir fast sicher, dass das + in den String gehört, und nicht davor.
SQL-Code:
DATE(verfall, '+1 year')


Geht beides, sehr lustig :lol: Aber Delphi ists immer noch egal... mist Hoffnungsschimmer....

Delphi.Narium 8. Okt 2021 15:45

AW: select mit ' läuft nicht
 
Korrekte Syntax siehe: SQLite date Function

Dr. Jack 8. Okt 2021 15:48

AW: select mit ' läuft nicht
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1495842)
Korrekte Syntax siehe: SQLite date Function

Daher habe ich das tatsächlich auch:): SELECT DATE('2018-11-01','+1 year'); Ich habe es geändert, aber liefert immer noch kein Ergebnis.:(

Sherlock 8. Okt 2021 15:56

AW: select mit ' läuft nicht
 
Der Unterschied ist aber immer noch da, oder hast Du den behoben?

SQL: SELECT DATE('2018-11-01','+1 year');
Delphi: SELECT DATE('2018-11-01', + '1 year');

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 Uhr.
Seite 1 von 3  1 23      

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