AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FB: Prepared Query mit In-Statement ?
Thema durchsuchen
Ansicht
Themen-Optionen

FB: Prepared Query mit In-Statement ?

Ein Thema von hoika · begonnen am 30. Dez 2017 · letzter Beitrag vom 11. Jan 2018
Antwort Antwort
Seite 1 von 3  1 23      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#1

FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 16:25
Datenbank: FB • Version: 2 • Zugriff über: egal
Hallo,
ich habe eine Query, die wird 100mal ausgeführt.

Select Feld3 From Tab
Where
(Feld1=:Feld1) And
(Feld2 In :Feld2)

Feld1 ist Integer
Feld2 ein String oder String-Liste

Leider kann ich die Query nicht preparen wegen dem In.

Geht das irgendwie anders ??
Heiko

Geändert von hoika (30. Dez 2017 um 16:27 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 17:09
Was steht den in dem Parameter Feld2?
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#3

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 17:15
Warum geht das nicht?

Fehlermeldung?

Quelltext mit Parameterbefüllung und konkreten Beispieldaten?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 17:21
IN unterstützt keine Parameter.
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#5

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 17:53
Jain, so absolut stimmt das nicht.

Je Parameter darf nur ein Wert übergeben werden.

Dashier funktioniert:
Delphi-Quellcode:
  qry.Close;
  qry.SQL.Clear;
  qry.SQL.Add('select feld3 from tabelle where feld1 = :feld1 ');
  qry.SQL.Add('and feld2 in (:feld2) ');
  qry.Prepare;
  qry.Params[0].AsInteger := 1;
  qry.Params[1].AsString := '''Feldinhalt''';
  qry.Open;
  ShowMessage(Format('%d',[qry.RecordCount]));
  qry.Close;
Dashier funktioniert ebenfalls:
Delphi-Quellcode:
  qry.Close;
  qry.SQL.Clear;
  qry.SQL.Add('select feld3 from tabelle where feld1 = :feld1 ');
  qry.SQL.Add('and feld2 in (:feld2a,:feld2b,:feld2c) ');
  qry.Prepare;
  qry.Params[0].AsInteger := 1;
  qry.Params[1].AsString := '''FeldinhaltA''';
  qry.Params[2].AsString := '''FeldinhaltB''';
  qry.Params[3].AsString := '''FeldinhaltC''';
  qry.Open;
  ShowMessage(Format('%d',[qry.RecordCount]));
  qry.Close;
Dashier funktioniert jedoch nicht:
Delphi-Quellcode:
  qry.Close;
  qry.SQL.Clear;
  qry.SQL.Add('select feld3 from tabelle where feld1 = :feld1 ');
  qry.SQL.Add('and feld2 in (:feld2) ');
  qry.Prepare;
  qry.Params[0].AsInteger := 1;
  qry.Params[1].AsString := '''FeldinhaltA'',''FeldinhaltB'',''FeldinhaltC''';
  qry.Open;
  ShowMessage(Format('%d',[qry.RecordCount]));
  qry.Close;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 18:15
Hallo,
Fehlermeldung beim Prepare "Token ? unknown"

Feld2 ist eine variable Anzahl von Strings.

Ich habe hier IBExpert und IBDAC.

Das das Prepare nicht geht, ist ja bekannt, wie könnte man das denn lösen?
Ich möchte ungern X prepared Queries (pro Anzahl der Strings eine) bauen, sehe das aber als einzige Lösung.
Heiko

Geändert von hoika (30. Dez 2017 um 19:01 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 18:41
Token unknown lässt auf einen Syntaxfehler im SQL schließen, vermutlich ist das aber nur eine Teilmenge der Fehlermeldung.
Bitte mal das vollständige SQL und die vollständige Fehlermeldung. So ist das nur was für die

Ein Parameter = ein Wert.
Wenn ein Wert aus mehreren Zeichenfolgen besteht, geht das.

Wenn ein Parameter aber mehrere einzelne Werte enthält, die eigentlich separat ins IN sollen, dann geht das nicht.
Delphi-Quellcode:
qry.SQL.Text := 'select * from x where feld2 IN (:Parameter)';
qry.Params[0].AsString := 'Das ist jetzt mal etwas Text.';
funktioniert.
Das wird zu select * from x where feld2 IN ('Das ist jetzt mal etwas Text.') , wobei hier das IN auch durch ein = ersetzt werden könnte.
Delphi-Quellcode:
qry.SQL.Text := 'select * from x where feld2 IN (:P1,:P2,:P3,:P4,:P5,:P6)';
qry.Params[0].AsString := 'Das'
qry.Params[1].AsString := 'ist'
qry.Params[2].AsString := 'jetzt'
qry.Params[3].AsString := 'mal'
qry.Params[4].AsString := 'etwas'
qry.Params[5].AsString := 'Text.'
funktioniert, kann aber zu einem deutlich anderen Ergebnis, als die vorherige Variante, führen.
Delphi-Quellcode:
qry.SQL.Text := 'select * from x where feld2 IN (:Parameter)';
qry.Params[0].AsString := '''Das'',''ist'',''jetzt'',''mal'',''etwas'',''Text.''';
funktioniert eventuell technisch. Im IN steht aber nur ein Wert, nach dem gesucht werden soll, und nicht sechs Werte, wie der Aufbau des Parameters suggerieren könnte. Und wenn hier die Anzahl der ' nicht so ganz passt, könnte die daraus resultierende Fehlermeldung auch 'Token unknown' enthalten.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 18:56
Das IN ist ja faktisch nur eine Kurzform für mehrere OR-verknüpfte Werte. Und mehrere Werte bekommt man eben nicht dynamisch parametrisiert. Klingt blöd, is aber so.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 19:44
Hallo,
der Fehler kommt bereits beim Prepare,
hat also nichts mit der Anzahl der Strings im Parameter zu tun.

FB macht das schon richtig so, dass es sagt, IN kann nicht prepared werden.


Token unknown lässt auf einen Syntaxfehler im SQL schließen, vermutlich ist das aber nur eine Teilmenge der Fehlermeldung.

Nein, ohne das IN funktioniert es.
Heiko

Geändert von hoika (30. Dez 2017 um 19:46 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: FB: Prepared Query mit In-Statement ?

  Alt 30. Dez 2017, 19:57
Select Feld3 From Tab
Where
(Feld1=:Feld1) And
(Feld2 In :Feld2)
Das geht nicht, nur so:
SQL-Code:
Select Feld3 From Tab
Where
  (Feld1=:Feld1) And
  (Feld2 In (:Feld2))
Die Klammern dürfen nicht Teil des Parameterinhaltes sein. Ist dem so, so ist "Token unknown" ein Teil der Fehlermeldung.

Vollständig dürfte sie in etwa
Zitat:
SQL Error: Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 35 ?. Error Code: -104. Invalid token The SQL: select id from tabbel where id in ?;
lauten.

Hallo,
der Fehler kommt bereits beim Prepare,
hat also nichts mit der Anzahl der später tatsächlichen Parameter zu tun.

FB macht das schon richtig so, dass es sagt, IN kann nicht prepared werden.
Doch, das hat mit den Parametern zu tuen. Die sind in Deinem Statement schlicht und einfach falsch und deshalb hat Prepare kein gültiges SQL, das es später mit Parametern versorgen kann.

Um Die Syntax für das Prepare zu prüfen, gehe ich zum Testen immer her und mache um die Parameter Hochkommata.

Also
SQL-Code:
Select Feld3 From Tab
Where
  (Feld1=':Feld1') And
  (Feld2 In ':Feld2')
bei Deinem Statement. Das wird auch scheitern, da es ein ungültiges SQL ist. Die Klammern beim IN fehlen!!!
Parameter können nur Werte enthalten, aber nicht Teile des SQLs. Die Klammern sind aber Teile des SQLs.
SQL-Code:
Select Feld3 From Tab
Where
  (Feld1=:Feld1) And
  (Feld2 :Feld2)
qry.params[0] := 'in (1,2,3)'; geht ja auch nicht oder gar
SQL-Code:
Select Feld3 From Tab
Where
  (Feld1=:Feld1) And
  (:Feld2)
qry.params[0] := 'feld2 in (1,2,3)'; geht auch nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 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