Hallo,
ich habe ein Problem mit den Datenbank Komponenten. Sowohl die von Delphi, als auch selber geschriebene lösen beim ADODataset.Post einen Fehler aus.<br>
Folgenden Aufbau hat mein Program:<br>
MySQL 4.19 - MyODBC - TADOConnection - TBetterADODataSet - TDataSource<br>
(bei TADODataSet statt TBetterADODataSet gibt's den selben Fehler)<br>
am DataSource hängt nun z.B. ein DBNavigatior und ein DBEdit, welches mit einem Feld in der Tabelle verknüpft ist. (Typ eigentlich egal; nehmen wir z.B. varchar(64) )
Natürlich existiert auch ein Primärschlüssen in der Tabelle!<br>
Soweit so gut. Funktioniert bis hierher. Ich kann Werte einfügen, bearbeiten, löschen und was man halt so damit machen kann.<br>
Beim Bearbeiten gibt es allerdings folgenden reproduzierbaren Fehler:<br>
1. Ändere ich frisch aus der DB geladenen Wert im DBEdit z.B. von 'Test' auf 'Test2'
2. und verlasse das Feld (ohne Post auzulösen oder der DBNavigator sonst irgendwie zu benutzen),
3. um das DBEdit nun erneut anzuklicken und den Wert wieder zurück auf 'Test' zu ändern,<br>
gibt es folgenden Fehler:
Nummer: 0x80040E38
Beschreibung: Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert.
Ursprung: Microsoft Cursor Engine()<br>
Dabei habe ich ja den Wert ja eigentlich gar nicht geändert.<br>
Und auch das SQL-Statement aus den LOGs schaut gut aus:
UPDATE `testdb`.`adressen` SET `name`='Test' WHERE `IndexNr`=1 AND `Suchname`='Test'
Ändert man Update_Criteria auf adCriteriaKey sieht es so aus:
UPDATE `testdb`.`adressen` SET `name`='Test' WHERE `IndexNr`=1
aber selbst da wird die Exception geworfen!<br>
Man kann das ganze zwar etwas umgehen, indem man eigene Komponenten schreibt, und dort DataLink.UpdateRecord nicht bei CM_EXIT auslöst, und im UpdateData Event vom DataLink den Field.Value Wert nur neu setzt, wenn sich der Wert wirklich verändert hat. Damit hat man aber nun das Problem, wenn z.B. 2 verschiedene DBEdits auf die gleiche Spalte zeigen, und man einen Wert im einen DBEdit ändert, dieser nach Verlassen des Edits nicht an das andere DBEdit propagiert wird.
Das Problem tritt also scheinbar genau dann auf, wenn in DataLink.Field.Value ein neuer Wert geladen wird, der aber gleich dem alten ist.<br>
Kann mir dabei vielleicht jemand von euch weiterhelfen?
Wäre super nett. Bin nämlich bereits am verzweifeln.<br>
Danke, Chris
ich habe ein Problem mit den Datenbank Komponenten. Sowohl die von Delphi, als auch selber geschriebene lösen beim ADODataset.Post einen Fehler aus.<br>
Folgenden Aufbau hat mein Program:<br>
MySQL 4.19 - MyODBC - TADOConnection - TBetterADODataSet - TDataSource<br>
(bei TADODataSet statt TBetterADODataSet gibt's den selben Fehler)<br>
am DataSource hängt nun z.B. ein DBNavigatior und ein DBEdit, welches mit einem Feld in der Tabelle verknüpft ist. (Typ eigentlich egal; nehmen wir z.B. varchar(64) )
Natürlich existiert auch ein Primärschlüssen in der Tabelle!<br>
Soweit so gut. Funktioniert bis hierher. Ich kann Werte einfügen, bearbeiten, löschen und was man halt so damit machen kann.<br>
Beim Bearbeiten gibt es allerdings folgenden reproduzierbaren Fehler:<br>
1. Ändere ich frisch aus der DB geladenen Wert im DBEdit z.B. von 'Test' auf 'Test2'
2. und verlasse das Feld (ohne Post auzulösen oder der DBNavigator sonst irgendwie zu benutzen),
3. um das DBEdit nun erneut anzuklicken und den Wert wieder zurück auf 'Test' zu ändern,<br>
gibt es folgenden Fehler:
Nummer: 0x80040E38
Beschreibung: Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert.
Ursprung: Microsoft Cursor Engine()<br>
Dabei habe ich ja den Wert ja eigentlich gar nicht geändert.<br>
Und auch das SQL-Statement aus den LOGs schaut gut aus:
UPDATE `testdb`.`adressen` SET `name`='Test' WHERE `IndexNr`=1 AND `Suchname`='Test'
Ändert man Update_Criteria auf adCriteriaKey sieht es so aus:
UPDATE `testdb`.`adressen` SET `name`='Test' WHERE `IndexNr`=1
aber selbst da wird die Exception geworfen!<br>
Man kann das ganze zwar etwas umgehen, indem man eigene Komponenten schreibt, und dort DataLink.UpdateRecord nicht bei CM_EXIT auslöst, und im UpdateData Event vom DataLink den Field.Value Wert nur neu setzt, wenn sich der Wert wirklich verändert hat. Damit hat man aber nun das Problem, wenn z.B. 2 verschiedene DBEdits auf die gleiche Spalte zeigen, und man einen Wert im einen DBEdit ändert, dieser nach Verlassen des Edits nicht an das andere DBEdit propagiert wird.
Das Problem tritt also scheinbar genau dann auf, wenn in DataLink.Field.Value ein neuer Wert geladen wird, der aber gleich dem alten ist.<br>
Kann mir dabei vielleicht jemand von euch weiterhelfen?
Wäre super nett. Bin nämlich bereits am verzweifeln.<br>
Danke, Chris
Comment