Einzelnen Beitrag anzeigen

Delphi.Narium

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

AW: SQLite select geht nicht

  Alt 19. Nov 2018, 14:53
Was ist denn edit12?

Ein TEdit oder irgendwas anderes?

Ja nach Typ hat .Text am Ende noch 'nen Zeilenumbruch (das ist z. B. bei TMemo.Text der Fall).

Damit wird dann ein fehlerhaftes SQL zusammengestellt.

Da der Fehler aber near "Select" heißt, liegt er vermutlich auch in der Nähe des Wortes select.

Die beiden SQLs, die den Unterschied zwischen funktioniert und funktioniert nicht darstellen sollen, unterscheiden sich nicht nur im Wert hinter dem Like (bzw. wie der aufgebaut wird), sondern auch an dem Text (Leerzeichen?) vor dem Select.

Mal den "Debugger für Arme" nutzen und es so versuchen:
Delphi-Quellcode:
 main.qryproducts.SQL.Add(' Select * from fam_db where fam_db.name like ') ;
            main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));
ShowMessage(main.qryproducts.SQL.text);
Die Anzeige per Strg+C und Strg+V hier posten, eventuell sieht man dann ja mal, was da wirklich im SQL steht und nicht nur, was man anhand der Quelltextfragmente vermuten würde.

Achso: Für den Fall, dass sich mal in edit12.text irgendwo ein Hochkomma befinden sollte, wird die Methode scheitern, dann entsteht automatisch ein ungültiges SQL.

Einfach zuerst mal den Aufruf auf Parameter umstellen. Und wenn das dann nicht funktioniert, nochmal fragen.

So, wie es momentan ist, kann man keine dauerhaft vollumfänglich fehlerfreie Ausführung des Selects realisieren, da man ein dateninduziert fehlerhaftes SQL nicht ausschließen kann.

Noch ein achso:

QuotedStr quoted delphikonform und nicht SQL-konform.

Ungefähr sowas sollte da am Ende mal bei rauskommen:
Delphi-Quellcode:

function LikeParam(AValue : String) : String;
begin
  Result := '%' + AValue + '%';
end;

begin
...
  main.qryproducts.Close;
  main.qryproducts.SQL.Clear;
  main.qryproducts.SQL.Add('select * from fam_db'
  main.qryproducts.SQL.Add('where fam_db.name like :Name');
  main.qryproducts.SQL.Add('and fam_db.menge like :Menge');
  main.qryproducts.SQL.Add('and fam_db.einheit_kurz like :Einheit_kurz');
  main.qryproducts.SQL.Add('and fam_db.dafo_kurz like :Dafo_kurz');
  main.qryproducts.SQL.Add('and fam_db.hersteller_lang like :Hersteller_lang');
  main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc');
  main.qryproducts.ParamByName('Name').AsString := LikeParam(edit12.text);
  main.qryproducts.ParamByName('Menge').AsString := LikeParam(edit13.text);
  main.qryproducts.ParamByName('Einheit_kurz').AsString := LikeParam(edit14.text);
  main.qryproducts.ParamByName('Dafo_kurz').AsString := LikeParam(edit15.text);
  main.qryproducts.ParamByName('Name').AsString := LikeParam(edit16.text);
  main.qryproducts.Open;
Damit dürfen dann auch Hochkommas in der Eingabe enthalten sein und wenn jemand in der Eingabe noch SQL-Fragmente erfasst, die bei der bisherigen Logik zu 'nem gültigen SQL führen, bleibt das schadlos und führt nicht zu irgendwelchen kontraproduktiven Nebenwirkungen (nennt man zuweilen schonmal SQL-Injection).
  Mit Zitat antworten Zitat