Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: Meldung "0 record(s) updated. Only one record should have been updated"

  Alt 10. Sep 2020, 13:36
Schlüsselverletzung: (Constraint oder eindeutiger Index)

Irgendwer vergibt für ID im Primary Field (id) einen Werte, der schon in der Tabelle vorhanden ist.

Es hätten mit diesem Wert mehrere Datensätze aktuallisiert werden müssen, es dürfte aber nur ein Datensatz aktuallisiert werden, deshalb wird kein Datensatz aktuallisiert, sondern diese Fehlermeldung ausgegeben.

Nach welcher Logik wird denn die ID vergeben?

Automatisch von der Datenbank per AutoInc, Sequenz, ... oder macht das jeder Client für sich aus?

Desweiteren:
Delphi-Quellcode:
  ZQuery.SQL.Clear;
  ZQuery.SQL.append('SELECT * FROM tabelle where `Dings` = "' + stringvariable + '" ');
  ZQuery.Open;

  if ZQuery.RecordCount > 0 then
    begin
      ZQuery.Edit;
      ZQuery.fieldbyname('Feld').Asinteger := 12345;
      ZQuery.Post;
    end;
Wenn RecordCount > 0 können im Ergebnis 1 bis n Datensätz enthalten sein.
Beim Post muss nun was aktuallisiert werden, aber für Zeos bzw. die Datenbank reichen die Informationen im Datensatz nicht aus, um eindeutig einen Datensatz in der Datenbank zu identifizieren, der von der Änderung betroffen sein soll. Es wären mit den Datensatzinfos demnach <> 1 Datensätze zu ändern, also entweder 0 oder n, wobei n größer 1 ist.

Das passiert gerne dann, wenn man auf einem Client 1 einen Datensatz ändert und ein Client 2 den gleichen Datensatz zwischenzeitlich geändert hat. Der zwischenzeitlich von Client 2 geänderte Datensatz enthält nicht mehr die gleichen Informationen, wie der von Client 1 gerade zu bearbeitende / speichernde Datensatz. Deshalb scheitern Zeos und / oder Datenbank beim Speichern der Änderungen. Resultat: Deine Fehlermeldung aus dem Threadtitel.

Das passiert gerne, wenn die Transaktionssteuerung nicht so ganz sauber funktioniert (oder fehlt).

Es passiert aber auch gerne, wenn man keine eigene Transaktionssteuerung implementiert hat und in der TZConnection AutoCommit auf true steht.
Wer zuerst speichert gewinnt, der oder die Anderen bekommen Deine Fehlermeldung aus dem Threadtitel.

Weitere Ursachen möglich? Will ich mal nicht ausschließen.
  Mit Zitat antworten Zitat