Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kontrollierter Programmabruch (https://www.delphipraxis.net/121361-kontrollierter-programmabruch.html)

Privateer3000 26. Sep 2008 07:37


Kontrollierter Programmabruch
 
Hallöchen,

ich möchte mein Programm gezielt anhalten sobald Fehler auftreten.
Da manche Methoden aber sehr komplex sind, stellt sich für mich die
Frage wie man dies richtig anstellt.
Ein Beispiel :
1.Daten aus DB holen
2.Berechnungen machen
3.Daten in DB schreiben
4.Andere Daten holen aus DB
5.mit berechnungen zusammen fassen
6.Daten wieder DB schreiben
7.Ausdruck erstellen (Report)
8.Ausdrucken
9. Daten in DB schreiben

Wenn nun irgendwo ein Fehler auftritt soll am besten
die procedure abbrechen und wenn möglich vorangegange
wieder rückgängig gemacht werden.

Wie macht ihr das?

grenzgaenger 26. Sep 2008 08:14

Re: Kontrollierter Programmabruch
 
wie wäre es mit Delphi-Referenz durchsuchenTransaktionen ?

Privateer3000 26. Sep 2008 08:50

Re: Kontrollierter Programmabruch
 
scheint genau das zu sein was ich suche
gibts da Anwendungsbeispiele für ADO, ausser die
in der OH?
soweit müsste das ja so gehen

transaktionsid erzeugen
transaktion starten
SQL.text ausführen
ergebnis abfragen???
wenn fehler - reagieren?!
transaktion stoppen

ist das richtig?

grenzgaenger 26. Sep 2008 08:56

Re: Kontrollierter Programmabruch
 
fast:
  • eine DB instance erzeugen
  • StartTransaction
  • do whatever you like
  • when OK, .ComitWork
  • wenn fehler .rollback

wenn das vernünftig laufe soll, brauchst du eine ordentliche datenbank :-) . aber das ist der ansatz.

sx2008 26. Sep 2008 08:59

Re: Kontrollierter Programmabruch
 
Du musst genau diese Struktur einhalten:
Delphi-Quellcode:
ADOConnection.BeginTrans;
try
  // hier dein ganzer Code
  .....
  ADOConnection.CommitTrans;
except
  ADOConnection.RollbackTrans;
  raise;
end;

Privateer3000 26. Sep 2008 10:28

Re: Kontrollierter Programmabruch
 
Zitat:

Zitat von grenzgaenger
fast:


wenn das vernünftig laufe soll, brauchst du eine ordentliche datenbank :-) . aber das ist der ansatz.

ich nutze ADO/mdb sollte das gehen?
welche Daten betrifft das rollback?
zwischen begin und commit, also auch mehrere dazwischen?

Vielen Dank für eure Tipps!

DeddyH 26. Sep 2008 10:32

Re: Kontrollierter Programmabruch
 
Commit und Rollback betreffen alle Daten der laufenden Transaktion.

grenzgaenger 26. Sep 2008 10:39

Re: Kontrollierter Programmabruch
 
mit access geht es nur eingeschränkt, denn z.b. wenn der recher ausfällt, kann die db nicht mehr auf den verbindungsabbruch reagieren, und so weiter. deswegen, eingeschränkt.

aber prinzipiell läuft das so ab, (beginntransaction), setzt den startpunkt, nun können alle möglichen datenmodifikationen vorgenommen werden. wenn alles i.o. dann werden die daten mit commit in die datenbank geschrieben, sind irgndwelche fehler aufgetreten (z. b. programm ist abgebrochen, etc. pp.) so wird die transaction bis zum zeitpunkt begintransaction zurückgesetzt. das ist wichtig, damit die daten konsistent bleiben. diese drei befehle gehören seit anbeginn der zeit zum sprachumfang von SQL und jede datenbank welche sql implementiert sollte das eigentlich können. aber wie gesagt, es gibt auch natürliche einschränkungen... und mit 'ner localen DB wirst du nie die sicherheit erreichen wie mit einer eigenen serverinstance, welche auch noch redundant ausgelegt ist. ist aber immer noch besser als darauf zu verzichten oder versuchen es selbst programmieren zu wollen (z. b. mit file of ... und strukturierten typen ;-) )

Privateer3000 26. Sep 2008 11:24

Re: Kontrollierter Programmabruch
 
Danke für eure Ausführungen.

Wenn nun die nächste sqlanweisung die vorangegangene bedingt
,also erfolgreich sein muss, wie steuert man dies?
alle anweisungen in den selben try-Block? und erst wenn alle
transaktionen erfolgreich waren ist die gesamte Methode abgeschlossen...

grenzgaenger 26. Sep 2008 11:34

Re: Kontrollierter Programmabruch
 
nach dem starttransaction, kannst du einfach in die DB buttern, so wie du lustig bist, erst am schluss entscheidest du, ob die transaction es wert ist in die datenbank geschrieben zu werden (commit) oder nicht (rollback). dabei könnt es auch schon mal vorkommen, dass beim commit mehrere MB zurückgeschrieben oder zurückgesetzt werden, je nach anwendungsfall.

dein try block für die DB ist
Delphi-Quellcode:
db.starttransaction
    do_something...
    db.commit
  except: db.rollback
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz