AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQLite select geht nicht

Ein Thema von Dr. Jack · begonnen am 19. Nov 2018 · letzter Beitrag vom 20. Nov 2018
Antwort Antwort
Dr. Jack

Registriert seit: 17. Mär 2010
78 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

AW: SQLite select geht nicht

  Alt 19. Nov 2018, 14:21
so nach 6 Stunden Frust:

Delphi-Quellcode:
 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;
ich weiß gerade nicht warum genau sowas funktioniert, aber es geht. Vielleicht hat SQLite ein Problem, wenn Daten direkt aus einem Edit-Feld kommen...
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
  Mit Zitat antworten Zitat
hoika

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

AW: SQLite select geht nicht

  Alt 19. Nov 2018, 14:49
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)
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: SQLite select geht nicht

  Alt 19. Nov 2018, 16:50
Warum sieht man immer wieder komische Konstrukte
wie
main.qryproducts.SQL.Clear;
main.qryproducts.SQL.Add('select * from fam_db')...


Wenn die Alternative main.qryproducts.SQL.Text := 'select * from fam_db'; viel sauberer und schneller ist.
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: SQLite select geht nicht

  Alt 19. Nov 2018, 18:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: SQLite select geht nicht

  Alt 19. Nov 2018, 20:25
Dann sei doch so nett und formulier es einmal "richtig" damit der TE ein sauberes Vorbild hat.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.437 Beiträge
 
Delphi 12 Athens
 
#6

AW: SQLite select geht nicht

  Alt 20. Nov 2018, 06:52
Moin...
Zitat:
Warum sieht man immer wieder komische Konstrukte
wie
main.qryproducts.SQL.Clear;
main.qryproducts.SQL.Add('select * from fam_db')...
... ...
Zitat:
muss man nur noch an einer (möglichst zentralen) Stelle die SQL-Statement-Konstanten-Resourcen ... anpassen.
...du sprichst mir aus der Seele.
Das Tutorial erklärt wie man es machen könnte. http://www.delphipraxis.net/49505-sq...einbinden.html
Zitat:
Dann sei doch so nett und formulier es einmal "richtig" damit der TE ein sauberes Vorbild hat.
1. Immer statt SQL.Clear; SQL.Add -> SQL.Text verwenden
2. immer Parameter! .ParamByName('Name').AsString := 'blubb';
3. wenn möglich auf LIKE verzichten

  Mit Zitat antworten Zitat
hoika

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

AW: SQLite select geht nicht

  Alt 20. Nov 2018, 12:27
Hallo,
naja.

1. SQL immer als Ressource, tztz.

2. Das schlecht lesbare SQL.Text statt mehrzeiligem SQL.Add.
Wenn ich das SQL in Abhängigkeit einiger Einstellugen im Formular selber zusammenbauen will (z.B. zurückgegebene Spalten=Felder einstellbar),
kann ich den SQL-Text dynamisch zusammenbauen pder SQL.Add benutzten. Ich finde 2eres besser.

3. immer Parameter bentzen
natürlich volle Zustimmung

1/3 -> 33% Zustimmung, mehr als bei den heutigen Parteien
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:42 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