Warum funktioniert das nicht???

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
navyseabear
Beiträge: 16
Registriert: So 21. Jan 2018, 09:27

Warum funktioniert das nicht???

Beitrag von navyseabear »

Moin moin,
ich habe da ein kleines Problem, welches mich gestern Nacht fast meine ganzen Haare gekostet hat. Ich habe sie mir gerauft, da ich echt keine Ahnung habe wo der Fehler liegt.
Also, ich möchte in meiner Datenbank (mariadb) ein paar Abfragen durchführen.
Folgender Aufruf funktioniert ohne Probleme:

Code: Alles auswählen

SQLQuery2.SQL.Text := 'SELECT * FROM `unterkategorie1` WHERE hauptkategorielfd = ''' + IntToStr(lfdHauptkategorie) + ''';'; 
SQLQuery2.Open;
SQLQuery2.ExecSQL;
SQLTransaction2.Commit;
wohingegen folgender Aufruf nicht funktioniert:

Code: Alles auswählen

SQLQuery3.SQL.Text := 'SELECT * FROM `unterkategorie2` WHERE unterkategorie1lfd = ''' + IntToStr(lfdUnterkategorie1) + ''';';
SQLQuery3.Open;
SQLQuery3.ExecSQL;
SQLTransaction3.Commit;

Code: Alles auswählen

TestTxt := 'SELECT * FROM `unterkategorie2` WHERE unterkategorie1lfd = ''' + IntToStr(lfdUnterkategorie1) + ''';';
zeigt mir immer einen korrekten SQL Aufruf an. Diesen kann ich genau so in phpMyAdmin kopieren und er wird ohne Fehler ausgeführt und zeigt mir auch die richtigen Ergebnisse an.
Warum klappt das eine und das andere nicht? Beide SQLQuery haben korrekte Einstellungen und funktionieren auch.
Schreibe ich z.B. folgendes:

Code: Alles auswählen

SQLQuery3.SQL.Text := 'SELECT * FROM `unterkategorie2` WHERE unterkategorie1lfd = 2;';
SQLQuery3.Open;
SQLQuery3.ExecSQL;
SQLTransaction3.Commit;
bekomme ich auch ein vernünftiges Ergebnis. Ich brauche aber die Variable lfdUnterkategorie!
Wo mache ich was falsch? Irgendwo muss da doch ein Denkfehler bei mir sein.

Es kann doch nicht sein, dass es einmal genau so funktioniert und einmal eben nicht.

mfg
Tobias

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Warum funktioniert das nicht???

Beitrag von theo »

Wie sind denn die Felder definiert?

Komisch finde ich schon mal, dass du Integer in Anführungszeichen setzt.

Code: Alles auswählen

hauptkategorielfd = ''' +....

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Warum funktioniert das nicht???

Beitrag von six1 »

probiere es mal so:

Code: Alles auswählen

SQLQuery3.active:=false;
SQLQuery3.SQL.Text := 'SELECT * FROM `unterkategorie2` WHERE unterkategorie1lfd = :unterkategorie1lfd ;';
SQLQuery3.Parambyname('unterkategorie1lfd').asinteger:=lfdHauptkategorie;
SQLQuery3.active:=true;
Gruß, Michael

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Warum funktioniert das nicht???

Beitrag von Sieben »

Mich wundert, was du da alles aufrufst. Entweder Query.Open - wenn ein Resultset erwartet wird wie eben bei Select - oder ExecSQL - wenn nicht, wie zB bei Delete oder Update. Und ein Commit nach einem Select ist auch nicht nötig, es wird da ja nichts geschrieben. Und wieso eine Transaktions-Komponente pro Query? Geht das bei diesen Komponenten nicht über die Connection?

Ach ja, und was heisst 'funktioniert nicht'? Gibt's ne Fehlermeldung? Oder nur ein leeres Resultset? Eventuell müsste man auch noch ein bisschen mehr Kontext zu dem Code haben. Als erstes mal die Feldtypen, wie ja auch schon angemerkt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Warum funktioniert das nicht???

Beitrag von af0815 »

Faustregel:
Open bei 'Select'
ExecSQL bei allen anderen

Commit:
Bei ExecSQL - ja, wenn mans braucht, dann aber richtig und alle Stufen
Bei 'Select' normalerweise unnötig, ausser man verwendet auch andere Befehle zusätzlich
Wenn man es nicht explizit braucht, dann entsprechgend der verwendeten Komponenten auf autocommit schalten. Ist bei SqlDB und ZEOS unterschiedlich.

Stringgewurstel ist der Anfang vom Ende -> Immer Parameter verweden, die werden auch richtig an die DB weitergreicht. Beispiele dazu gibt in der Wiki und hier im Forum.


BTW: Ich habe eine 'select from *' Allergie. Zeigt für mich nur, das derjenige der es verwendet keine Ahnung hat, was er eigentlich zurückhaben will.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

navyseabear
Beiträge: 16
Registriert: So 21. Jan 2018, 09:27

Re: Warum funktioniert das nicht???

Beitrag von navyseabear »

ich hatte mir schon so gedacht das mein Code etwas wirr ist. Früher hatte ich es leichter mich in irgendwelche Vorgänge einzulesen und diese dann auch zu verstehen und entsprechend anzuwenden. Heute bin ich immer froh, wenn ich ein paar Zeilen Beispiel Code bekomme, die ich dann meinen Vorstellungen anpassen kann. Bin dann immer happy wenn es funktioniert. Aus diesem Grunde bin ich auch immer Dankbar wenn ich leicht verständliche Anleitungen finde oder einfache Beispielprogramme.
Daher noch einmal Sorry wenn ich hier für Kopfschütteln gesorgt habe.
Werde dann mal nach einem guten Buch oder einer vernünftigen Anleitung über Datenbank und SQL Programmierung suchen. :-(

mfg
Tobias

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Warum funktioniert das nicht???

Beitrag von Sieben »

Die Frisur wird's danken. :wink: Empfehlung kann ich leider nicht geben, habe mit Datenbanken noch nicht wirklich wieder angefangen und das Zeug, mit dem ich es mal gelernt habe, ist garantiert nicht mehr auf Stand.

navyseabear
Beiträge: 16
Registriert: So 21. Jan 2018, 09:27

Re: Warum funktioniert das nicht???

Beitrag von navyseabear »

Jetzt war ich die halbe Nacht mal damit beschäftigt, nach einer vernünftigen Anleitung mit Beispielen die man versteht zu suchen. Leider ohne echten Erfolg.
Gibt es den nichts vernünftiges, vielleicht sogar in Deutsch, wo einmal der Aufbau eines SQL Programms erklärt wird? Und zwar auch so, das ich es verstehen kann?
Wofür die einzelnen Komponenten gebraucht werden? Wie diese zusammenhängen? Wie ich ggf. mehrere verschiedene Zugriffe gleichzeitig auf eine Datenbank durch mein Programm realisiere, ohne den ganzen Bildschirm mit SQL-Komponenten voll zu haben? Warum mal Open und mal ExecSQL? Eben mal die Basics für einen Hobbyprogrammierer der noch ein Leben drumherum hat. Einfach zu verstehen. Ich habe leider weder die Nerven noch die Zeit mich tagelang durch irgendwelche Handbücher und Befehlssyntax durchzuarbeiten. Die Zeit hatte ich mal früher. Programmieren ist eben ein Hobby welches ich dann mache, wenn ich mal Zeit habe. Wäre auch happy mit einer, ganz Old School, Buchempfehlung die ich mir dann bestellen kann.

mfg
Tobias

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Warum funktioniert das nicht???

Beitrag von gladio »

Gibt es den nichts vernünftiges, vielleicht sogar in Deutsch, wo einmal der Aufbau eines SQL Programms erklärt wird?
Wird so ziemlich in jedem Buch über Delphi oder Freepascal beschrieben.
z.B. Datenbank-Programmierung Borland Delphi 6 (Doberenz/Kowalski) oder Datenbanken mit Delphi (C&L Verlag, Toolbox) oder Grundlagen: Einstieg in SQL (Troll/Bartosch)
Das erste mal, dass ich SQL begegnete, war in einem Buch zu Delphi 3 vor ca. 20 Jahren. Da hat sich so viel nicht geändert.
Gibt auch gute Beschreibungen im Netz, auch für Einsteiger.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Warum funktioniert das nicht???

Beitrag von af0815 »

... LazInfos ... Link ist an jedem von meinen Posts. Ist zwar auch älter, aber ein paar Grundlagen sind drinnen. Ausserdem sind die Tutorials in der Lazarus Wiki auch nicht so schlecht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten