![]() |
AW: SQLite select geht nicht
Also der select muss sauber sein...
Trotzdem: [FireDAC][Phys][SQLite] ERROR: near "Select": syntax error Dieser Aufruf ohne Daten aus einem Edit-Feld zu benutzen geht aber...
Delphi-Quellcode:
ist das irgendwie falsch?
main.qryproducts.SQL.Add('select * from fam_db where fam_db.name like '+ quotedstr('%aspirin%') );
main.qryproducts.Open;
Delphi-Quellcode:
main.qryproducts.SQL.Add(' Select * from fam_db where fam_db.name like ') ;
main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37)); |
AW: SQLite select geht nicht
Falsch ist relativ, ich würde es trotzdem immer parametrisieren.
Delphi-Quellcode:
main.qryproducts.SQL.Add(' Select * from fam_db where fam_db.name like :param1') ;
main.qryproducts.ParamByName('param1').AsString := '%'+edit12.text+'%'; |
AW: SQLite select geht nicht
Und SQL.Add fügt immer neue Zeilen hinzu, alter Inhalt wird dabei weder gelöscht noch überschrieben.
|
AW: SQLite select geht nicht
Abgesehen von der Parametrisierung, kann ich mir höchstens noch vorstellen, dass der Zeilenumbruch nach dem "like" ein Problem verursacht.
|
AW: SQLite select geht nicht
Schau mal, ob noch irgendwo eine nicht ausgeführte, commitete Table Änderung rumfliegt, besonders eine, die Spalten hinzufügt, die Du in Deinem Statement benutzt.
Alternativ schau in Deiner Tabelle oder im Ergebnis des funktionierenden Statements, ob die Spalten alle vorhanden sind, von denen Du glaubst, dass sie da sind. |
AW: SQLite select geht nicht
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:
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.
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); 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:
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 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; ![]() |
AW: SQLite select geht nicht
so nach 6 Stunden Frust:
Delphi-Quellcode:
ich weiß gerade nicht warum genau sowas funktioniert, aber es geht. Vielleicht hat SQLite ein Problem, wenn Daten direkt aus einem Edit-Feld kommen...
main.qryproducts.FetchOptions.AutoClose := False;
main.qryproducts.SQL.Clear; name_edit:=edit12.Text; menge_edit:=edit13.Text; einheit_edit:=edit14.Text; dafo_kurz_edit:=edit15.Text; hersteller_edit:=edit16.Text; begin //name main.qryproducts.SQL.Add('select * from fam_db where fam_db.name like '+ quotedstr('%'+(name_edit) +'%') ); main.qryproducts.SQL.Add('and fam_db.menge like '+ quotedstr('%'+(menge_edit) +'%') ); main.qryproducts.SQL.Add('and fam_db.einheit_kurz like '+ quotedstr('%'+(einheit_edit) +'%') ); main.qryproducts.SQL.Add('and fam_db.dafo_kurz like '+ quotedstr('%'+(dafo_kurz_edit) +'%') ); main.qryproducts.SQL.Add('and fam_db.hersteller_lang like '+ quotedstr('%'+(hersteller_edit) +'%') ); main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc'); main.qryproducts.Open; listview2.Items.Clear; Danke wie immer an die fleißigen Leute mit den guten Tips. Das mit dem Hochkomma werde ich noch anpassen. Da habe ich gar nicht dran gedacht...Gut zu wissen TOP :-D |
AW: SQLite select geht nicht
Hallo,
bei einem Deiner letzten Statements stand das Order by doppelt main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc'); main.qryproducts.SQL.Add('ORDER_BY fam_db.name, (cast(menge as integer)) ASC'); Ausserdem hattest du +37 statt dem % genommen. Die Statements sind also auch so verschieden gewesen. So wie du es jetzt hast, ist es zumindestens etwas besser lesbar, aber Parameter sind noch besser (Stichwort: Sql-Injection) |
AW: SQLite select geht nicht
Warum sieht man immer wieder komische Konstrukte
wie main.qryproducts.SQL.Clear; main.qryproducts.SQL.Add('select * from fam_db')... Wenn die Alternative
Delphi-Quellcode:
viel sauberer und schneller ist.
main.qryproducts.SQL.Text := 'select * from fam_db';
|
AW: SQLite select geht nicht
Weil damit klargemacht werden sollte, dass das SQL vor dem Befüllen leer sein muss, das war in den bisherigen Beispielen nicht klar, so dass der Fehler auch von einem Select stammen konnte, dass (irrtümlich) an ein bereits vorhandenen SQL "darangepappt" wurde. Das führt nämlich genau zu der Fehlermeldung.
Außerdem macht man im Quelltext keine derartigen .Text := 'irgendwas'-.Add-Orgien. Solche SQLs werden einmalig ausformuliert und dann als Konstanten, Resourcen ... abgelegt, so dass im Quelltext nur noch diese zugewiesen werden müssen und anschließend werden die Parameter befüllt. Aus den obigen 15 Zeilen von mir werden dann nur noch acht Zeilen. Und wenn man dann mal die Datenbank wechseln muss, muss man nur noch an einer (möglichst zentralen) Stelle die SQL-Statement-Konstanten-Resourcen ... anpassen. Für den Rest des Quelltextes ist das transparent: Sprich: da muss man dann nicht mehr ran. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz