ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
UweB
Beiträge: 5
Registriert: Di 2. Jul 2024, 11:40
OS, Lazarus, FPC: Windows11Pro (Lazarus 3.4 FPC 3.2.2)
CPU-Target: Win64

ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von UweB »

Ich habe auf Lazarus 3.4 und ZEOS 8 aktualisiert und habe nun Probleme bei der Aktualisierung von mySQL-Tabellen.
die ersten beiden Datensätze speichert er, beim dritten DS kommt die Meldung "0 record(s) updated. Only one record should have been updated."
Die Aktualisierung hatte unter ZEOS 7 problemlos funktioniert. Die Tabelle hat auch einen Index. Welches Feld man ändert, spielt keine Rolle.

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von Stevie »

Hallo Uwe,

wie lautet der Wert der Zeos Property CLIENT_FOUND_ROWS? In der Vergangenheit gab es diesbezüglich ein Problem, das mit Hilfe des Parameters gelöst werden konnte:
The TZUpdateSQL component will raise an error if a record is posted to the connected Dataset where no values were changed. This is because MySQL / MariaDB returns the number of changed records by default. If a record didn't change, 0 is returned instead. See https://dev.mysql.com/doc/refman/8.0/en ... -rows.html for more information. This can be mitigated by adding "CLIENT_FOUND_ROWS=1" to the TZConnection.Properties property.
Vielleicht hat sich zwischen 7 und 8 der Default geändert?

UweB
Beiträge: 5
Registriert: Di 2. Jul 2024, 11:40
OS, Lazarus, FPC: Windows11Pro (Lazarus 3.4 FPC 3.2.2)
CPU-Target: Win64

Re: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von UweB »

Hallo Stevie,
in der Diff-List steht der Parameter CLIENT_FOUND_ROWS gar nicht drin, nach manuellem Eintrag wird er wieder entfernt. Es scheint, den gibt es nicht mehr...

Gruß Uwe

UweB
Beiträge: 5
Registriert: Di 2. Jul 2024, 11:40
OS, Lazarus, FPC: Windows11Pro (Lazarus 3.4 FPC 3.2.2)
CPU-Target: Win64

Re: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von UweB »

Ich habe bisher immer nur die TZConnection, TZTable sowie TZQuery genutzt.
Jetzt habe ich die Tabelle mit einer TZUpdateSQL verbunden und es funktioniert :) - das war bisher nicht notwendig.

Gruß Uwe

UweB
Beiträge: 5
Registriert: Di 2. Jul 2024, 11:40
OS, Lazarus, FPC: Windows11Pro (Lazarus 3.4 FPC 3.2.2)
CPU-Target: Win64

Re: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von UweB »

Ich war etwas voreilig :? es kommt zwar keine Fehlermeldung, aber nach einem Refresh ist alles wieder weg :lol:
Da muss ich mich erstmal mit der Komponente befassen - muss ich wohl selbst definieren, was passieren soll.

Gruß Uwe

charlytango
Beiträge: 1096
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: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von charlytango »

Kannst du ein kleines Projekt posten, das diesen Fehler darstellt? (Idealerweise gegen SQLite oder ein mitgeliefertes Create-Statement für die Tabelle )
Nachdem ich auch mit ZEOS arbeite, interessieren mich seltsame Fehler und deren Vermeidung sehr.

Was mich etwas wundert ist, dass du TZTable verwendest, das hab ich seit vielen Jahren nicht mehr benutzt. Aber das ist wohl individueller Stil.

Als Tip, weil das oft mal schnell untergeht: Ich benutze bei meiner DB Verbindung immer TZSQLMonitor, den ich bei Problemen dazu schalte und der mir Statements und vieles andere in ein log protokolliert, da sieht man oft auch schon mehr.

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von Stevie »

Also, ich habe gerade mal die aktuelle Version ausgecheckt und gesucht. Danach gibt es den Parameter durchaus und zwar in der Datei ZPlainMySqlDriver.pas:

Code: Alles auswählen

...
TMYSQL_CLIENT_OPTIONS =
( CLIENT_LONG_PASSWORD, {  = 1;    new more secure passwords }
  CLIENT_FOUND_ROWS ,   {         = 2;     Found instead of affected rows }
  CLIENT_LONG_FLAG       ,      { = 4;     Get all column flags }
  CLIENT_CONNECT_WITH_DB ,      { = 8;     One can specify db on connect }
  CLIENT_NO_SCHEMA       ,      {  = 16;           Don't allow database.table.column }
  ...
Laut Dokumentation kann man die auch setzen:
...
all mysql_real_connect clientflags are now supported using the names from the enum type below.

TMYSQL_CLIENT_OPTIONS =
( CLIENT_LONG_PASSWORD, { = 1; { new more secure passwords }
CLIENT_FOUND_ROWS , { = 2; { Found instead of affected rows }
CLIENT_LONG_FLAG , { = 4; { Get all column flags }
...
Danach sollte der Parameter also auch noch in Zeos 8 existieren. Hast Du mal versucht, das Property programmatisch zu setzen? So etwas wie

Code: Alles auswählen

ZConnection.Properties.Add('CLIENT_FOUND_ROWS=1');

UweB
Beiträge: 5
Registriert: Di 2. Jul 2024, 11:40
OS, Lazarus, FPC: Windows11Pro (Lazarus 3.4 FPC 3.2.2)
CPU-Target: Win64

Re: ZEOS8-mySQL-Lazarus3.4 Probleme beím speichern

Beitrag von UweB »

Hallo Stevie,
ZConnection.Properties.Add('CLIENT_FOUND_ROWS=1');
das habe ich jetzt mal gesetzt, ändert am Verhalten jedoch nichts...

Ich habe in den betreffenden Tabellen die beiden zutreffenden Felder gemeinsam zum Primärindex gemacht, da funktioniert es wie gewollt.
Das war bisher nicht notwendig gewesen (sind nur kleine Tabellen und sollten eigentlich in der Reihenfolge bleiben wie in der gelieferten Liste).

Danke für Eure Hilfe.

P.S. im log des Monitors standen keine auffälligen Einträge.

Antworten