1. Exit-Methode
Ich dachte ursprünglich, dass der Prozess sofort nach der Ausführung der Exit-Methode beendet werden würde, habe es mir aber anders überlegt, nachdem ich tatsächlich ein Beispiel zum Testen erstellt habe. Bitte schauen Sie sich das an
Beispielsweise wird Flag schließlich der Wert „C“ zugewiesen.
=============================================== ============================================
var
Flag: Zeichenfolge;
beginnen
versuchen
Flagge := 'A';
Ausfahrt;
Flagge := 'B';
Endlich
Flagge := 'C';
Ende;
Flag := 'D';
Ende;
=============================================== ============================================
Analyse: Unabhängig davon, wie die Try-Klausel endet, wird die Final-Klausel immer ausgeführt. (Vielen Dank, ylmg Netizen)
2. Ein kleines Problem, das das gesamte System zum Stillstand bringen kann
Beim Entwurf von Datenbanksystemen werden häufig Transaktionsoperationen verwendet, um die Datenintegrität sicherzustellen. Ein unsachgemäßer Entwurf kann jedoch leicht relativ große Auswirkungen haben. Das folgende Beispiel zeigt, dass die Datenintegrität zwar gewährleistet ist, das System jedoch möglicherweise vollständig nicht mehr funktioniert:
=============================================== ============================================
AdoConnection1.BeginTrans;
versuchen
...
if application.MessageBox('Sind Sie sicher, dass Sie löschen möchten?', 'Frage', MB_YESNO+MB_ICONQUESTION)<>IDYes then //(1)
beginnen
...
Ende;
Application.MessageBox('Vorgang fehlgeschlagen', 'Warnung', MB_OK);
AdoConnection1.CommitTrans;
außer
Application.MessageBox('Vorgang fehlgeschlagen', 'Warnung', MB_OK);
AdoConnection1.RollbackTrans;
Ende;
=============================================== ============================================
Analyse: Die Probleme im obigen Code werden alle durch Application.MessageBox in (1), (2) und (3) verursacht, aber es ist nicht die Application.MessageBox selbst, die das Problem verursacht, sondern das Programm hängt und erfordert Wenn der Benutzer zu diesem Zeitpunkt den Computer verlässt oder den Betrieb dieser Dialogfelder nicht bestätigt, befindet sich das gesamte System möglicherweise in einem Wartezustand, da dies nicht der Fall ist beendet.
Um dieses Problem zu vermeiden, gibt es zwei Prinzipien:
(1) Nachdem die Transaktion gestartet wurde, kann das Programm die Transaktion automatisch beenden, ohne dass der Benutzer eingreifen muss.
(2) Führen Sie den kürzesten Vorgang in der Transaktion aus.
3. Versuchen Sie ... außer ... die Struktur zu beenden
Das Folgende ist ein Beispiel zur Veranschaulichung der Try-Struktur oder ein Beispiel für die Verwendung von Transaktionsoperationen:
Der betreffende Code:
=============================================== ============================================
versuchen
...
AdoConnection1.BeginTrans;
...
AdoConnection1.CommitTrans;
außer
AdoConnection1.RollbackTrans;
Ende;
=============================================== ============================================
Analyse: Wenn nach dem Versuch eine Ausnahme im AdoConnection1.BeginTrans-Code auftritt, springt dieser zur Ausführung zu AdoConnection1.RollbackTrans, aber AdoConnection1 hat die Transaktion aufgrund eines Fehlers nicht gestartet, sodass während der Ausführung von AdoConnection1.RollbackTrans ein Fehler aufgetreten ist.
Richtiger Code: ============================================ = ==============================================
AdoConnection1.BeginTrans;
versuchen
...
...
AdoConnection1.CommitTrans;
außer
AdoConnection1.RollbackTrans;
Ende;
=============================================== ============================================
Kurz gesagt, die Struktur von try wird verwendet, um abnormale Vorgänge zu schützen. Wenn eine Ausnahme zwischen try ... außer auftritt, wird die Operation zwischen außer ... end ausgeführt. Beim Entwerfen des Try-Befehls müssen Sie auf die Rationalität achten der Architektur.
4. Um den Schutz eigener Angelegenheiten betrogen
Bei der Erstellung von Datenbankanwendungssoftware müssen wir häufig auf die folgenden Probleme stoßen: Beurteilen Sie die Originaldaten und nehmen Sie dann entsprechende Änderungen vor. Dieses Problem scheint relativ einfach zu sein, aber wenn Sie bedenken, dass andere Personen im Netzwerk dasselbe System verwenden, müssen Sie die Möglichkeit versehentlicher Änderungen in Betracht ziehen. Mein Kollege war nachlässig, obwohl er nach meiner Aufforderung über das Mehrbenutzerproblem nachdachte, schrieb er dennoch den problematischen Code:
=============================================== ============================================
var
adsTemp: TAdoDataSet;
isOk: boolean;
beginnen
adsTemp := TAdoDataSet.Create(self);
versuchen
adsTemp.Connection := AdoConnection1;
adsTemp.CommandText := 'Wählen Sie fid, fnumber aus tb1, wobei fid=120 ist';
adsTemp.Open;
isOk := adsTemp.FieldByName('fnumber').AsInteger>100;
Endlich
adsTemp.Free;
Ende;
Wenn nicht, dann ist es in Ordnung
Ausfahrt;
AdoConnection1.BeginTrans;
versuchen
AdoConnection1.Execute('update tb1 set ffull=ffull + 1 from tb1 where fid=120';
...
...
AdoConnection1.CommitTrans;
außer
AdoConnection1.RollbackTrans;
Ende;
Ende;
=============================================== ============================================
Analyse: Ich weiß nicht, ob Sie das Problem gesehen haben. Die Daten werden vor AdoConnection1.BeginTrans beurteilt, und dann wird AdoConnection1.Execute verwendet, um die Daten zu ändern, dann im Zeitraum nach der Beurteilung AdoConnection1.BeginTrans, tb1 Die Daten haben sich möglicherweise geändert und dieser Transaktionsschutz ist nutzlos.
Die richtige Methode besteht darin, dass es sich bei der Beurteilung und Änderung um dieselben Daten handeln muss. Im Folgenden sind zwei Beispiele für Methoden aufgeführt (der Unterschied besteht darin, dass der Ort, an dem die Transaktion gestartet wird, unterschiedlich ist):
Code 1 (nach Verwendung des Transaktionsschutzes werden dieselben Daten beurteilt und geändert):
=============================================== ============================================
var
adsTemp: TAdoDataSet;
isOk: boolean;
beginnen
AdoConnection1.BeginTrans;
versuchen
adsTemp := TAdoDataSet.Create(self);
versuchen
adsTemp.Connection := AdoConnection1;
adsTemp.CommandText := 'select fid, fnumber, ffull from tb1 where fid=120';
adsTemp.Open;
wenn adsTemp.FieldByName('fnumber').AsInteger>100 dann
beginnen
adsTemp.Edit;
adsTemp.FieldByName('ffull').AsInteger := adsTemp.FieldByName('ffull').AsInteger + 1;
adsTemp.Post;
Ende;
Endlich
adsTemp.Free;
Ende;
AdoConnection1.CommitTrans;
außer
AdoConnection1.RollbackTrans;
Ende;
Ende;
=============================================== ============================================
Code 2 (unter Verwendung der Ausnahmeerfassung tritt während des AdsTemp.Post eine Ausnahme auf, wenn die Beurteilung und die Änderung nicht dieselben Daten sind. Dies ist eine Funktion des ADODataSet-Objekts):
=============================================== ============================================
var
adsTemp: TAdoDataSet;
isOk: boolean;
beginnen
adsTemp := TAdoDataSet.Create(self);
versuchen
adsTemp.Connection := AdoConnection1;
adsTemp.CommandText := 'wählen Sie fid, fnumber, ffull aus TB1 aus, wobei fid=120 ist';
adsTemp.Open;
wenn adsTemp.FieldByName('fnumber').AsInteger>100 dann
beginnen
AdoConnection1.BeginTrans;
versuchen
adsTemp.Edit;
adsTemp.FieldByName('ffull').AsInteger := adsTemp.FieldByName('ffull').AsInteger + 1;
adsTemp.Post;
AdoConnection1.CommitTrans;
außer
AdoConnection1.RollbackTrans;
Ende;
Ende;
Endlich
adsTemp.Free;
Ende;
Ende;