Autor Beitrag
Dietmar1961
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 28.05.08 19:58 
Hallo Delphianer,
vielleicht kann mir einer von euch helfen.

Wenn ich beigefügte Prozedur laufen lassen, geht das genau ein mal gut.
ausblenden 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
ausblenden 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
ausblenden 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;
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mi 28.05.08 21:26 
ausblenden 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.

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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.