Fehlerbehandlung bei zwischengespeicherten Aktualisierungen
Nach oben zu Aktualisierungen mit der BDE zwischenspeichern - Index
Hinweis: Die Borland Database Engine (BDE) ist veraltet und wird nicht mehr weiterentwickelt. Die BDE wird Unicode beispielsweise nie unterstützen. Sie sollten mit der BDE keine neuen Entwicklungen vornehmen. Überprüfen Sie, ob Sie Ihre vorhandenen Datenbankanwendungen nicht von der BDE nach dbExpress migrieren können.
Die Borland Database Engine (BDE) prüft speziell auf Konflikte, die bei Aktualisierungen durch den Benutzer auftreten, sowie andere Bedingungen beim Versuch, Aktualisierungen anzuwenden. Sie meldet mögliche Fehler zurück. Das Ereignis Bde.DBTables.TBDEDataSet.OnUpdateError der Datenmengenkomponente ermöglicht es Ihnen, Fehler abzufangen und darauf zu reagieren. Sie sollten eine Behandlungsroutine für dieses Ereignis bereitstellen, falls Sie zwischengespeicherte Aktualisierungen verwenden. Andernfalls schlägt die ganze Aktualisierung fehl, falls während der Operation ein Fehler auftritt.
Hier eine Quelltextschablone für eine OnUpdateError-Ereignisbehandlungsroutine:
procedure TForm1.DataSetUpdateError(DataSet: TDataSet; E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin { ... hier erfolgt die Verarbeitung von Aktualisierungsfehlern ... } end;
void __fastcall TForm1::DataSetUpdateError(TDataSet *DataSet, EDatabaseError *E, TUpdateKind UpdateKind, TUpdateAction &UpdateAction) { // Hier auf Fehler reagieren... }
DataSet verweist auf die Datenmenge, auf die die Aktualisierungen angewendet werden. Sie können diese Datenmenge nutzen, um während der Fehlerverarbeitung auf neue und alte Werte zuzugreifen. Die ursprünglichen Werte für die Felder der einzelnen Datensätze werden in der schreibgeschützten TField-Eigenschaft OldValue gespeichert. Geänderte Werte werden in der zugehörigen TField-Eigenschaft NewValue gespeichert. Diese Werte stellen die einzige Möglichkeit dar, Aktualisierungswerte in der Ereignisbehandlungsroutine auszuwerten und zu ändern.
Warnung: Rufen Sie keine Datenmengenmethoden auf, die den aktuellen Datensatz verändern (wie beispielsweise Next und Prior). Auf diese Weise gelangt die Ereignisbehandlungsroutine in eine Endlosschleife.
Der Parameter E hat normalerweise den Typ EDBEngineError. Aus diesem Exception-Typ können Sie eine Fehlermeldung extrahieren, die Sie Benutzern in Ihrer Fehlerbehandlungsroutine anzeigen. Der folgende Quelltext könnte z.B. verwendet werden, um die Fehlermeldung in der Titelleiste eines Dialogfelds anzuzeigen:
ErrorLabel.Caption := E.Message;
ErrorLabel->Caption = E->Message;
Dieser Parameter ist auch praktisch, um die tatsächliche Ursache des Aktualisierungsfehlers zu ermitteln. Sie können spezifische Fehlercodes aus EDBEngineError extrahieren und, abhängig davon, eine geeignete Maßnahme durchführen.
Der Parameter UpdateKind beschreibt den Aktualisierungstyp, der den Fehler verursacht hat. Wenn Ihre Fehlerbehandlungsroutine keine speziellen Maßnahmen in Abhängigkeit von der Art der durchgeführten Aktualisierungen ergreift, brauchen Sie diesen Parameter in Ihrem Quelltext nicht.
Die folgende Tabelle listet die möglichen Werte für UpdateKind auf:
UpdateKind-Werte
Wert | Bedeutung |
---|---|
ukModify |
Die Bearbeitung eines bereits existierenden Datensatzes hat einen Fehler verursacht. |
ukInsert |
Das Einfügen eines neuen Datensatzes hat einen Fehler verursacht. |
ukDelete |
Das Löschen eines bereits existierenden Datensatzes hat einen Fehler verursacht. |
UpdateAction
teilt der BDE mit, wie der Aktualisierungsprozess fortgesetzt werden soll, nachdem Ihre Ereignisbehandlungsroutine beendet ist. Beim ersten Aufruf der Behandlungsroutine für den Aktualisierungsfehler ist der Wert für diesen Parameter immer auf uaFail gesetzt. Abhängig von der Fehlerbedingung für den Datensatz, der den Fehler verursacht hat, und Ihrer Korrekturmaßnahme, setzen Sie UpdateAction
normalerweise auf einen anderen Wert, bevor Sie die Behandlungsroutine beenden:
- Falls Ihre Fehlerbehandlungsroutine die Fehlerbedingung korrigieren kann, durch die die Routine aufgerufen wurde, setzen Sie
UpdateAction
auf eine geeignete Aktion, die beim Verlassen der Routine ausgeführt werden soll. Für korrigierte Fehlerbedingungen setzen SieUpdateAction
auf uaRetry, um die Aktualisierung erneut auf den Datensatz anzuwenden. - Ist UpdateAction auf uaSkip gesetzt, wird die Aktualisierung der Zeile, die den Fehler verursacht hat, übersprungen, und die Aktualisierung für den Datensatz bleibt im Zwischenspeicher, nachdem alle anderen Aktualisierungen vorgenommen wurden.
- Sowohl uaFail als auch uaAbort bewirken, dass die gesamte Aktualisierung beendet wird. uaFail löst eine Exception aus und zeigt eine Fehlermeldung an. uaAbort löst eine stumme Exception aus (es wird keine Fehlermeldung angezeigt).
Der folgende Quelltext zeigt die Ereignisbehandlungsroutine für OnUpdateError, die prüft, ob der Aktualisierungsfehler durch eine Schlüsselverletzung verursacht wurde. Ist dies der Fall, setzt sie den Parameter UpdateAction
auf uaSkip:
{ Fügen Sie Ihrer uses-Klausel für dieses Beispiel 'Bde' hinzu } if (E is EDBEngineError) then with EDBEngineError(E) do begin if Errors[ErrorCount - 1].ErrorCode = DBIERR_KEYVIOL then UpdateAction := uaSkip { Schlüsselverletzung, diesen Datensatz einfach überspringen } else UpdateAction := uaAbort; { die Fehlerursache ist nicht bekannt, Aktualisierung wird abgebrochen } end;
// Für dieses Beispiel muss BDE.hpp in Ihre Unit-Datei euinbezogen werden void __fastcall TForm1::DataSetUpdateError(TDataSet *DataSet, EDatabaseError *E, TUpdateKind UpdateKind, TUpdateAction &UpdateAction) { UpdateAction = uaFail // für die Aktualisierung initialisieren if (E->ClassNameIs("EDBEngineError")) { EDBEngineError *pDBE = (EDBEngineError *)E; if (pDBE->Errors[pDBE->ErrorCount - 1]->ErrorCode == DBIERR_KEYVIOL) UpdateAction = uaSkip; // Schlüsselverletzung, diesen Datensatz einfach überspringen } }
Hinweis: Tritt während der Anwendung zwischengespeicherter Aktualisierungen ein Fehler auf, wird eine Exception ausgelöst und eine Fehlermeldung angezeigt. Wenn ApplyUpdates nicht aus einem try...except-Konstrukt heraus aufgerufen wird, kann eine Fehlermeldung an den Benutzer, die von Ihrer Ereignisbehandlungsroutine für OnUpdateError aus angezeigt wird, Ihre Anwendung veranlassen, dieselbe Fehlermeldung zweimal anzuzeigen. Um zu verhindern, dass eine Fehlermeldung doppelt erscheint, setzen Sie
UpdateAction
auf uaAbort, um die Anzeige systemerzeugter Fehlermeldungen zu deaktivieren.