![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: FireDAC
Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Ich habe ein Verständnisproblem. Ich füge mittels
Delphi-Quellcode:
und
Append()
Delphi-Quellcode:
eine neue Zeile in einer Tabelle ein. Davor sage ich
Post()
Delphi-Quellcode:
. Nehmen wir an, irgendwo kommt es zu einem Fehler, und ich möchte alle Änderungen rückgängig machen. Hierfür brauche ich
myConnection.StartTransaction()
Delphi-Quellcode:
. Leider trägt er die Zeile doch in die Tabelle ein.
myConnection.Rollback()
Wie kann ich das verhindern? So hätte ich mir die Transaktion auch sparen können- Sie ist völlig wirkungslos.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin FDConnection1.StartTransaction(); try FDTable1.Append(); FDTable1.FieldByName('someField').AsString := 'Hallo Welt'; FDTable1.Post(); if CheckBox1.Checked then raise EProgrammerNotFound.Create('derp'); FDConnection1.Commit(); except FDConnection1.Rollback(); raise; end; end; |
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Transaktionen beziehen sich meines Wissens nach nur auf SQL-Befehle wie
SQL-Code:
oder
INSERT INTO ...
SQL-Code:
. Append und Post werden wohl direkt in die Datenbank geschrieben. Ich benutze zwar kein FireDAC, aber ADO mit MSSQL. Und dort funktioniert es eigentlich schon.
DELETE FROM ...
|
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Möglicherweise läuft es aber nur in einem anderen Transaktionskontext.
|
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Ich bin kein Datenbank-Profi. Was bedeutet "anderer Kontext"? Ich hätte gedacht dass, wenn ein Append/Post implizit innen drin auch noch Transaktionsspaß hat, dieser von der äußeren (meiner expliziten) erfasst wird...
|
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Zitat:
Manuelle und automatische Transaktionssteuerung sollte man tunlichst nicht miteinander mischen.... |
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Aviator: Nein
Transactionen betreffen alle Vorgänge die Daten in einer Datenbank ändern anderer Kontext heist dass verschiedene Tables oder Querys verschiedenen Transactionen zugeordnet werden können , oder dass die Transaction beim Post implizit commited wurde und damit der Rollback ins leere läuft mfg Hannes |
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Hänge die Transaction-Methoden in die entsprechenden Ereignisse deiner Query / Table: BeforeInsert => Start Transaction, AfterPost / AfterCancel => End Transaction, etc.
Bei einer Exception rufst du dann nicht die Transaction-Methoden ab, sondern die Cancel-Methode deiner Query / Table. Grüße Mikhal Ergänzung: Nicht nur BeforeInsert auch BeforeEdit => Start Transaction |
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Datenbankseitig ist Append auch ein INSERT.
Bezüglich der TDataSet hat Insert und Append nur den einen Unterschied, dass Insert den neuen Record (Datensatz) an der aktuellen Position (RecNo) einfügt und Append hängt den Record am Ende an. Wenn man ganz viele Datensätze z.B. in ein Memory-Dataset einfügt, dann ist Append oftmals einfach nur etwas schneller, als Insert, da die Speicherverwaltung dort etwas optimaler läuft. (Trifft eventuell auch auf Cached-Updates zu) |
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Delphi-Quellcode:
Die Daten stehen nicht in der Datenbank, sondern nur in der Table-Komponente ;)
try
... except FDConnection1.Rollback(); FDTable1.Refresh(); raise; end; |
AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
Ich ... Ich ... Ich glaube, das war es. Ich prüfe noch einmal doppelt und dreifach, das kann doch nicht sein dass es jetzt SO einfach war :thumb:
Vielen Dank, da wäre ich sicher nicht drauf gekommen.8-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz