Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Parameter werden nicht ausgefüllt .. (https://www.delphipraxis.net/205150-sql-parameter-werden-nicht-ausgefuellt.html)

erich.wanker 6. Aug 2020 09:12

Datenbank: mysql • Version: 1 • Zugriff über: ZeosLib7

SQL Parameter werden nicht ausgefüllt ..
 
Hallo ..
ich verstehe es nicht :-(

Ich versuche gerade ein Problem zu lösen - da die zu suchenden Texte einen Bindestrich beinhalten - deswegen baue ich mir Parameter.. und hoffe SO das Problem zu beseitigen

Aber wenn ich mir mein nicht funktionierendes SQL Statement ausgeben lassen will - sehe ich, dass die Parameter als Text drinnen stehen - und nicht die Werte.

Der SQL-TEXT was bei meiner Procedure rauskomme .. die Parameter werden nicht augefüllt sondern dargestellt???

Zitat:

SELECT * FROM material where ((`Materialkurztext` LIKE '% :matname %') OR (`Materialnummer` LIKE '% :matnummer %')) ORDER BY `Materialkurztext` ASC LIMIT 100 OFFSET 0
Der Delphi-Code:

Delphi-Quellcode:
UniMainModule.n_MATERIAL.SQL.Clear;
          UniMainModule.n_MATERIAL.SQL.Append('SELECT * FROM klassifizierung where ((`Materialkurztext` LIKE ''% :matname %'') OR (`Materialnummer` LIKE ''% :matnummer %'')) ORDER BY `' + my_Fieldname_m + '`' + sortierreihenfolge + ' LIMIT ' + inttostr(mainform.datenbank_limit) + ' OFFSET ' + inttostr(mein_limit_m));
          UniMainModule.n_MATERIAL.Params.Clear;
          UniMainModule.n_MATERIAL.Params.CreateParam(ftString, 'matname', ptInput);
          UniMainModule.n_MATERIAL.Params.CreateParam(ftString, 'matnummer', ptInput);
          UniMainModule.n_MATERIAL.ParamByName('matname').Value := sql_filter_m;
          UniMainModule.n_MATERIAL.ParamByName('matnummer').Value := sql_filter_m;
          UniLabel55.Caption:= UniMainModule.n_MATERIAL.SQL.Text;
  UniMainModule.n_MATERIAL.Open;

Info: n_MATERIAL ist ein TZQuery

Hat jemand eine Idee wo der Fehler liegt?

DeddyH 6. Aug 2020 09:34

AW: SQL Parameter werden nicht ausgefüllt ..
 
Parameter werden erst bei der Ausführung mit Werten belegt, daher siehst Du die Parameternamen. Allerdings lässt sich der Code erheblich kürzen, wie wäre es denn so?
Delphi-Quellcode:
UniMainModule.n_MATERIAL.SQL.Text := 'SELECT * FROM klassifizierung where ((`Materialkurztext` LIKE :matname) OR (`Materialnummer` LIKE :matnummer)) ORDER BY `' + my_Fieldname_m + '`' + sortierreihenfolge + ' LIMIT ' + inttostr(mainform.datenbank_limit) + ' OFFSET ' + inttostr(mein_limit_m);
UniMainModule.n_MATERIAL.ParamByName('matname').AsString := '%' + sql_filter_m + '%';
UniMainModule.n_MATERIAL.ParamByName('matnummer').AsString := '%' + sql_filter_m + '%';
Ich selbst würde es ja noch anders machen, aber so sollte es IMO funktionieren.

Uwe Raabe 6. Aug 2020 09:39

AW: SQL Parameter werden nicht ausgefüllt ..
 
Die Idee hinter SQL-Parametern ist, dem Server ein parametrisiertes SQL zu schicken und dann die Parameterwerte in einem separaten Call nachzureichen. Das erlaubt, dieselbe SQL-Anweisung mit unterschiedlichen Parametern auszuführen, ohne sie jedesmal neu interpretieren und optimieren zu müssen. Insofern suchst du die SQL-Anweisung mit aufgelösten Parametern innerhalb deines Programms vergebens. Das von dir beobachtete Verhalten ist vollkommen korrekt so.

Jasocul 6. Aug 2020 09:43

AW: SQL Parameter werden nicht ausgefüllt ..
 
Deine Parameter stehen im SQL-Statement als Text drin und nicht als Parameter. Dadurch existieren deine Parameter quasi nicht.
Falsch:
Code:
Select * from Tabelle where Feld like '% :Parameter %'
Richtig:
Code:
Select * from Tabelle where Feld like '%' + :Parameter + '%'
Ich würde aber auch eher den Ansatz von DeddyH verfolgen, also die Wildcards beim Parameter mit anzugeben.

haentschman 6. Aug 2020 09:51

AW: SQL Parameter werden nicht ausgefüllt ..
 
Moin...:P

Zitat:

Hat jemand eine Idee wo der Fehler liegt?
..2 davon. :zwinker:

1. Das SQL ist QT technisch zu kompliziert. :zwinker: So ist es übersichtlicher...
Delphi-Quellcode:
Format(UniMainModule.n_MATERIAL.SQL.Text := 'SELECT * FROM klassifizierung where (Materialkurztext LIKE :matname) OR (Materialnummer LIKE :matnummer) ORDER BY %s %s LIMIT %s OFFSET %s', [my_Fieldname_m, sortierreihenfolge, inttostr(mainform.datenbank_limit), inttostr(mein_limit_m)];

UniMainModule.n_MATERIAL.ParamByName('matname').AsString := '%' + sql_filter_m + '%';
UniMainModule.n_MATERIAL.ParamByName('matnummer').AsString := '%' + sql_filter_m + '%';

UniMainModule.n_MATERIAL.Open;
Die Parameter werden automatisch angelegt. Die Hochkommata werden nicht benötigt...außer bei blöden Namen. :roll:

2. Der Parameter mit "LIKE" ist falsch. #6/#7

PS: Das nächse Mal laßt ihr mir eine Chance...:stupid:

DeddyH 6. Aug 2020 09:54

AW: SQL Parameter werden nicht ausgefüllt ..
 
Bei einer einfachen OR-Verknüpfung werden auch die Klammern nicht benötigt :wink:. Und wenn man schon Format einsetzt, kann man für ganze Zahlen auch gleich %d nehmen und muss nicht erst umwandeln.

haentschman 6. Aug 2020 09:57

AW: SQL Parameter werden nicht ausgefüllt ..
 
Zitat:

Und wenn man schon Format einsetzt, kann man für ganze Zahlen auch gleich %d nehmen
...Copy/Paste. :oops:

Delphi-Quellcode:
Format(UniMainModule.n_MATERIAL.SQL.Text := 'SELECT * FROM klassifizierung where (Materialkurztext LIKE :matname) OR (Materialnummer LIKE :matnummer) ORDER BY %s %s LIMIT %d OFFSET %d', [my_Fieldname_m, sortierreihenfolge, mainform.datenbank_limit, mein_limit_m];

erich.wanker 6. Aug 2020 10:23

AW: SQL Parameter werden nicht ausgefüllt ..
 
SUPER.. Vielen Dank

Funktioniert jetzt .. und ist von überschüssigen Klammern und Co befreit

Danke

DasWolf 6. Aug 2020 10:27

AW: SQL Parameter werden nicht ausgefüllt ..
 
Zitat:

Zitat von haentschman (Beitrag 1471269)
Zitat:

Und wenn man schon Format einsetzt, kann man für ganze Zahlen auch gleich %d nehmen
...Copy/Paste. :oops:

Delphi-Quellcode:
Format(UniMainModule.n_MATERIAL.SQL.Text := 'SELECT * FROM klassifizierung where (Materialkurztext LIKE :matname) OR (Materialnummer LIKE :matnummer) ORDER BY %s %s LIMIT %d OFFSET %d', [my_Fieldname_m, sortierreihenfolge, mainform.datenbank_limit, mein_limit_m];

..und um dann auch noch richtig richtig bei
Delphi-Quellcode:
Format
zu werden:

Delphi-Quellcode:
UniMainModule.n_MATERIAL.SQL.Text := Format('SELECT * FROM klassifizierung where Materialkurztext LIKE :matname OR Materialnummer LIKE :matnummer ORDER BY %s %s LIMIT %d OFFSET %d', [my_Fieldname_m, sortierreihenfolge, mainform.datenbank_limit, mein_limit_m];


Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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