MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Ekkehard
Beiträge: 78
Registriert: So 12. Feb 2023, 12:42
OS, Lazarus, FPC: Windows Lazarus 3.6, FPC 3.2.2
CPU-Target: 64-Bit
Wohnort: Hildesheim

MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von Ekkehard »

Hallo Ihr Lieben,
vielleicht kann mir mal wieder jemand über die Straße helfen.
Eigentlich will ich etwas ganz Einfaches machen, nämlich mit den in Lazarus vorgesehen Komponenten auf eine SQL-Datenbank zugreifen und dort Einträge holen, ändern und löschen.
Den ersten Teil des Weges habe ich überraschend problemlos hinbekommen, ich kann nämlich mit meiner lokalen MariaDB reden :)

(Dazu habe ich die Datenbank (https://mariadb.com/downloads/) heruntergeladen und installiert, die in der Installation vorhandene "libmariadb.dll" (in dann "libmysql.dll") umbenannt und in das Lazarus-Verzeichnis und zusätzlich in das Projektverzeichnis kopiert. In Lazarus auf einem Formular die Komponenten TMySQL57Connection, TSQLQuery, TDataSource und TSQLTransaction platziert. In der MySQL57Connection1 den Schalter SkipLibraryCheck = True gesetzt, kann nun die Verbindung aktiviert werden. Im SQLQuery1.Database = MySQL57Connection1 und SQLQuery1.Transaction = SQLTransaction1, zusätzlich die SQLQuery1.Options = [sqoAutoApplyUpdates, sqoAutoCommit]. In TDataSource DataSource1.DataSet = SQLQuery1 und in TSQLTransaction SQLTransaction1.Database = MySQL57Connection1. Zur Ansicht habe ich noch ein TDBEdit DBEdit1.DataSource = DataSource1 und einen TDBNavigator DBNavigator1.DataSource = DataSource1 eingefügt.).

Mit diesem Setup kann ich sowohl in der IDE als auch im laufenden Programm durch alle Datensätze laufen und diese ansehen. Sobald ich aber einen Datensatz ändere, wird die Datenbankverbindung geschlossen und der DBNavigator ausgegraut. Öffnet man die Datenbank wieder, sieht man, dass die Änderung übernommen wurde. Entfernt man eine der Optionen (sqoAutoApplyUpdates, sqoAutoCommit) wird nichts mehr gespeichert.

Fragen.
1.) wie soll das eigentlich funktionieren?
2.) Kann ich das Speichern der Änderungen manuell anstoßen?

Das Projekt habe ich beigefügt. Die angesprochene Datenbank ist sehr einfach eine Tabelle mit einem Integer ID- und einem VarChar Content-Feld. An den Benutzerrechten kann es eigentlich nicht liegen, die habe ich versuchsweise auf "Alles ist erlaubt" gestellt, ohne Verhaltensänderung.

Liebe Grüße
Ekkehard
Dateianhänge
SimpleTestDBConnection.zip
(3.34 KiB) 132-mal heruntergeladen

Benutzeravatar
juelin
Beiträge: 310
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von juelin »

Hi,
verusch es mal mit Package ZEOS.
Package laden und Komponeten aus ZEOS einfügen.
Das sollte klappen.
Du brauchst aber auch libmariadb.dll.
Gruß
Jürgen

charlytango
Beiträge: 1140
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von charlytango »

ohne groß in die Tiefe gegangen zu sein fällt mir auf, dass das SQL Statement in SQLQuery1

Code: Alles auswählen

select * from test  
ist. Versuche es doch mal mit

Code: Alles auswählen

select id, content from test  
Erstmal ist select * ganz schlechter Stil und es macht oft auch Probleme, z.B. wenn Lazarus es nicht schafft den Primary Key zu "erraten".

MariaDB wird im SQLDB Framework nicht wirklich unterstützt, wenn es gar nicht klappt würde ich ZEOS versuchen.

Deine Transaktion steht übrigens auf caRollback, wass dir möglicherweise in die Suppe spuckt ;-)

Eine gute Idee bei DB-Entwicklung ist es auch ein SQL Log einzurichten damit du die Nachrichten zum und vom SQL Server auch mitbekommst.
Im OnLog der Connection kannst du etwas wie das Folgende machen;

Code: Alles auswählen

procedure TForm1.MySQL57Connection1Log(Sender: TSQLConnection;
  EventType: TDBEventType; const Msg: String);
var
  s: string;
begin
  case EventType of
    detCustom:   s:='Custom:  ';
    detPrepare:  s:='Prepare: ';
    detExecute:  s:='Execute: ';
    detFetch:    s:='Fetch:   ';
    detCommit:   s:='Commit:  ';
    detRollBack: s:='Rollback:';
    else s:='Unknown event. Please fix program code.';
  end;
  Memo1.Append(s + ' ' + Msg); //oder auch in ein logfile schreiben
end;  
Zuletzt geändert von charlytango am Mo 11. Aug 2025, 21:17, insgesamt 1-mal geändert.

Ekkehard
Beiträge: 78
Registriert: So 12. Feb 2023, 12:42
OS, Lazarus, FPC: Windows Lazarus 3.6, FPC 3.2.2
CPU-Target: 64-Bit
Wohnort: Hildesheim

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von Ekkehard »

select id, content from test
hat keine Verbesserung gebracht, dann probiere ich mal das ZEOS aus.
Danke!
Gruß Ekkehard

charlytango
Beiträge: 1140
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von charlytango »

lies nochmal meinen editierten Post bezüglich des Logs

charlytango
Beiträge: 1140
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von charlytango »

Vorsicht beim aktuellen ZEOS 8 aus dem OPM, das kann etwas Probleme machen.

Joh
Lazarusforum e. V.
Beiträge: 321
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von Joh »

charlytango hat geschrieben: Mo 11. Aug 2025, 21:02 Deine Transaktion steht übrigens auf caRollback, wass dir möglicherweise in die Suppe spuckt ;-)
caCommitRetaining sollte eigentlich passen.
bei caCommit wird die Tabelle nach dem Speichern geschlossen.

Ich hab mir das Testprogramm zwar nicht angeguckt, aber das war das erste, was ich beim Lesen dachte.

Joh
just my two Beer

Ekkehard
Beiträge: 78
Registriert: So 12. Feb 2023, 12:42
OS, Lazarus, FPC: Windows Lazarus 3.6, FPC 3.2.2
CPU-Target: 64-Bit
Wohnort: Hildesheim

Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von Ekkehard »

Lieben Dank für die Unterstützung, die tatsächlich (allerdings anders als erwartet) geholfen hat.
Die ersten Zeilen des Logs nach dem Programmstart sind immer gleich:

Code: Alles auswählen

Prepare:  TQuerySQLStatement : select ID, Content from test
Prepare:  TQuerySQLStatement : show index from test
Execute:  TQuerySQLStatement : show index from test
Execute:  show index from test
Fetch:    show index from test
Fetch:    show index from test
Execute:  TQuerySQLStatement : select ID, Content from test
Execute:  select ID, Content from test
Fetch:    SQLQuery1 : select ID, Content from test
Fetch:    SQLQuery1 : select ID, Content from test
Fetch:    SQLQuery1 : select ID, Content from test
Alle beliebigen Einstellungen in der SQLTransaction der Properties Action und Active sind völlig ohne jeden Einfluss.
Im Log stehen dann nachfolgend immer genau diese vier Zeilen:

Code: Alles auswählen

Prepare:  TQuerySQLStatement : update test set `ID`=:"ID",`Content`=:"Content" where (`ID`= :"OLD_ID")
Execute:  TQuerySQLStatement : update test set `ID`=:"ID",`Content`=:"Content" where (`ID`= :"OLD_ID")
Execute:  update test set `ID`=$1,`Content`=$2 where (`ID`= $3)
Commit:   SQLTransaction1 : Committing transaction
Aber stoUseImplicit = True und stoExplizitStart = False in der Property Options lösen das Problem und es funktioniert!
Dann steht im Log

Code: Alles auswählen

Prepare:  TQuerySQLStatement : update test set `ID`=:"ID",`Content`=:"Content" where (`ID`= :"OLD_ID")
Execute:  TQuerySQLStatement : update test set `ID`=:"ID",`Content`=:"Content" where (`ID`= :"OLD_ID")
Execute:  update test set `ID`=$1,`Content`=$2 where (`ID`= $3)
Wie man sieht, es fehlt(!) das Commit. Richtig einsichtig finde ich das Ganze allerdings nicht und so folgt der Murphy-Zustand 3: "Es funktioniert und keiner weiß warum".
Dann versuche ich mal weiter mein Glück.
Vielen Dank!

Ekkehard
Beiträge: 78
Registriert: So 12. Feb 2023, 12:42
OS, Lazarus, FPC: Windows Lazarus 3.6, FPC 3.2.2
CPU-Target: 64-Bit
Wohnort: Hildesheim

[Gelöst] Re: MariaDB, SQLQuery & Co., nach erfolgreichem Speichern Verbindung weg

Beitrag von Ekkehard »

Ich habe den aktuellen Stand, der das Problem gelöst hat, mal in zwei Beispielprojekte gepackt, eines als GUI- und eines als Kommandozeilen-Anwendung.
Vielleicht hilft das ja noch anderen Menschen.
Dateianhänge
MariaDBSQLTest.zip
(152.2 KiB) 176-mal heruntergeladen

Antworten