Entwickler-Ecke

Datenbanken - Problem ADO edit-post / MySQL 'Zeile nicht gefunden'


Dietmar1961 - Mi 28.05.08 19:58
Titel: Problem ADO edit-post / MySQL 'Zeile nicht gefunden'
Hallo Delphianer,
vielleicht kann mir einer von euch helfen.

Wenn ich beigefügte Prozedur laufen lassen, geht das genau ein mal gut.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure Test;
var i: integer;
begin
  if qry = nil then
  begin
    qry := TADOQuery.Create(self);
    qry.Connection := ADOConnection1;
  end
  else
    qry.Close;
  qry.SQL.text := 'select * from test';
  qry.Open;
  i := 0;
  while not qry.eof do
  try
    inc(i);
    qry.Edit;
    qry.FieldByName('Test2').AsInteger := i;
    qry.Post;
  finally
    qry.Next
  end;
end

Bei jedem weiteren Aufruf kommt die Fehlermeldung

Die zum Aktualisieren angegebene Zeile wurde nicht gefunden.
Einige Werte wurden seit dem letzten Lesen ggf. geändert.


Ich habe ein wenig rumexperimentiert und habe folgendes festgestellt.
Wenn ich in dem gleichen Programm auf die selbe Tabelle ein Update mache, in der Form

Delphi-Quelltext
1:
2:
qry2.SQL.Text := 'update Test set Test2 = ' + IntToStr(i) + ' where idTest=' + qry.FieldByName('idTest').AsString;
qry2.ExecSQL;

kann ich den Datensatz wieder mit obiger Variante ändern, aber nur diesen!

Auch ein neuer Start des Programmes ändert daran nichts, sobald ich einen Satz mit edit -- post geändert habe, bleibt dieser für weitere Manipulationen solange gesperrt, bis er mit einem SQL-Command wieder geändert wurde.

meine aktuelle config:
Windows XP
Delphi 2007
MySQL 5.1
Verbindung mit MySQL ODBC 5.1 Driver oder MySQL ODBC 3.51 Driver (beides probiert)

Die Tabelle Test hat zwei Felder sowie einen Primärschlüssel
Sie sieht wie folgt aus

SQL-Anweisung
1:
2:
3:
4:
5:
CREATE TABLE  `test`.`test` (
  `idTest` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `Test2` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`idTest`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci ROW_FORMAT=FIXED;

SQL-Anweisung
1:
                    

Ich weiß langsam nicht mehr, wo ich noch suchen soll, vielleicht hat ja einer von Euch eine Idee.
Schon mal ein Riesen Dankeschön vorab


ZeitGeist87 - Mi 28.05.08 21:26


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Die Methode Post schreibt einen geänderten Datensatz in die Datenbank.

Delphi-Syntax:

procedure Post; override;

C++ Syntax:

virtual void __fastcall Post(void);

Beschreibung

Rufen Sie Post auf, um einen geänderten Datensatz in die Datenbank zu übernehmen. Datenmengenmethoden, die den Status der Datenmenge ändern wie Edit, Insert und Append oder die den Datensatzzeiger bewegen wie First, Next und Prior
, rufen Post automatisch auf.


alzaimar - Do 29.05.08 06:44

[ ] Deine Tabelle hat keinen PK, d.h. irgendeine Spalte, in der für jeden Record ein eindeutiger Wert steht.
[ ] In einem Trigger der zu verändernden Tabelle werden weitere Tabellen verändert.


Bernhard Geyer - Do 29.05.08 07:38

Muss es für MySQL ADO und ODBC sein? Das ist kompliziertes mögliche Konstelation mit der höchsten Problemwahrscheinlichkeit.

Falls es nix kosten darf nimm doch ZEOS und geh dann direkt über die libmysql.dll


Dietmar1961 - Fr 30.05.08 20:23

vielen Dank für Eure Tipps.

Mein Problem ist, das ich mit den gleichen Programmen nicht nur auf MySQL sondern auch auf die DB2 (AS400) zugreifen können muß.

Werde mir mal die Zeos Kompos ansehen.


Bernhard Geyer - Sa 31.05.08 09:41

user profile iconDietmar1961 hat folgendes geschrieben:
Mein Problem ist, das ich mit den gleichen Programmen nicht nur auf MySQL sondern auch auf die DB2 (AS400) zugreifen können muß.

Na und? Ein Bridge-Pattern aufgesetzt und man kann für jedes DBMS die beste Zugriffskomponente verwenden.


Bernhard Geyer - Sa 31.05.08 09:42

user profile iconBernhard Geyer hat folgendes geschrieben:
user profile iconDietmar1961 hat folgendes geschrieben:
Mein Problem ist, das ich mit den gleichen Programmen nicht nur auf MySQL sondern auch auf die DB2 (AS400) zugreifen können muß.

Na und? Ein Bridge-Pattern aufgesetzt und man kann für jedes DBMS die beste Zugriffskomponente verwenden.

Da ja jedes DBMS seine eigene SQL-Syntax hast wirst du eh nicht darum herumkommen hier eine unterscheidung einbauen zu müssen. Und besser an Zentraler Stelle als verteilt in den Units.