Aktualisierungsfehler korrigieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Datensätze aktualisieren


Es gibt zwei Ereignisse, die es Ihnen ermöglichen, Fehler zu verarbeiten, die während der Aktualisierung auftreten:

  • Während des Aktualisierungsprozesses erzeugt der interne Provider immer dann ein OnUpdateError-Ereignis, wenn eine Aktualisierung ansteht, die er nicht verarbeiten kann. Falls Sie das Problem in einer OnUpdateError-Ereignisbehandlungsroutine beheben, zählt der Fehler nicht zu der maximalen Fehlerzahl, die der Methode ApplyUpdates übergeben werden. Dieses Ereignis tritt nur für Client-Datenmengen auf, die einen internen Provider verwenden. Wenn Sie TClientDataSet verwenden, können Sie stattdessen das Ereignis OnUpdateError der Provider-Komponente verwenden.
  • Nachdem die gesamte Aktualisierung abgeschlossen ist, erzeugt die Client-Datenmenge für jeden Datensatz, den der Provider nicht auf den Datenbankserver zurückschreiben konnte, ein Datasnap.DBClient.TClientDataSet.OnReconcileError-Ereignis.

Sie sollten immer eine Ereignisbehandlungsroutine für OnReconcileError oder OnUpdateError bereitstellen, auch wenn diese nichts anderes tut, als die zurückgegebenen Datensätze, die nicht zurückgeschrieben werden konnten, zu verwerfen. Die Ereignisbehandlungsroutinen für diese beiden Ereignissen haben dieselbe Funktionsweise. Sie verarbeiten die folgenden Parameter:

DataSet: Eine Client-Datenmenge, welche den aktualisierten Datensatz enthält, der nicht eingetragen werden konnte. Sie können Methoden dieser Datenmenge verwenden, um Informationen über den problematischen Datensatz zu ermitteln und ihn zu bearbeiten, um etwaige Fehler korrigieren zu können. Insbesondere sollten Sie die Eigenschaften CurValue, OldValue und NewValue der Felder des aktuellen Datensatzes verwenden, um die Ursache des Aktualisierungsproblems zu ermitteln. Sie dürfen jedoch in einer Ereignisbehandlungsroutine keine Methoden der Client-Datenmenge aufrufen, die den aktuellen Datensatz verändern.

E: Ein Objekt, welches das aufgetretene Problem beschreibt. Mithilfe dieser Exception können Sie eine Fehlermeldung extrahieren oder die Ursache des Aktualisierungsfehlers feststellen.

UpdateKind: Der Typ der Aktualisierung, welche den Fehler verursacht hat. UpdateKind kann ukModify (das Problem trat bei der Aktualisierung eines existierenden Datensatzes auf, der geändert wurde), ukInsert (das Problem trat beim Einfügen eines neuen Datensatzes auf) oder ukDelete (das Problem trat beim Löschen eines existierenden Datensatzes auf) sein.

Action: Ein var-Parameter, mit dem Sie festlegen, welche Aktion ausgeführt werden soll, nachdem die Ereignisbehandlungsroutine beendet ist. In Ihrer Ereignisbehandlungsroutine setzen Sie diesen Parameter auf eine der folgenden Einstellungen:

  • Der Datensatz wird übersprungen und bleibt im Änderungsprotokoll (rrSkip oder raSkip).
  • Der gesamte Korrekturprozess wird abgebrochen (rrAbort oder raAbort).
  • Die fehlgeschlagene Änderung wird in den entsprechenden Datensatz auf dem Server eingetragen (rrMerge oder raMerge). Dies ist nur möglich, wenn der Datensatz auf dem Server keine Felder geändert hat, die vom Benutzer im Datensatz der Client-Datenmenge geändert wurden.
  • Die aktuelle Aktualisierung im Änderungsprotokoll wird durch den Wert des Datensatzes in der Ereignisbehandlungsroutine ersetzt (der zuvor korrigiert wurde) (rrApply oder raCorrect)
  • Der Fehler wird vollständig ignoriert (rrIgnore). Diese Möglichkeit existiert nur in der OnUpdateError-Ereignisbehandlungsroutine und ist für den Fall vorgesehen, dass die Ereignisbehandlungsroutine die Aktualisierung auf den Datenbankserver zurückschreibt. Der aktualisierte Datensatz wird aus dem Änderungsprotokoll entfernt und in Data eingefügt, so als hätte der Provider die Aktualisierung vorgenommen.
  • Es gelten wieder die ursprünglichen Werte (raCancel). Diese Möglichkeit existiert nur in der OnReconcileError-Ereignisbehandlungsroutine.
  • Der Datensatzwert wird so aktualisiert, dass er mit dem Datensatz auf dem Server übereinstimmt (raRefresh). Diese Möglichkeit existiert nur in der OnReconcileError-Ereignisbehandlungsroutine.

Der folgende Code zeigt eine Ereignisbehandlungsroutine für OnReconcileError. Sie verwendet das entsprechende Dialogfeld aus der Unit RecError, die im Verzeichnis der Objektablage zu finden ist. (Das Dialogfeld ist nur verfügbar, wenn Sie Ihrer uses-Klausel RecError hinzufügen.)

procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind, var Action TReconcileAction);
begin
  Action := HandleReconcileError(DataSet, UpdateKind, E);
end;
void __fastcall TForm1::ClientDataSetReconcileError(TCustomClientDataSet *DataSet,
    EReconcileError *E, TUpdateKind UpdateKind, TReconcileAction &Action)
{
  Action = HandleReconcileError(this, DataSet, UpdateKind, E);
}


Siehe auch