![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: FIBPlus
FIBPlus: BDE-AutoCommit nachbauen
Hallo,
jeder TFIBQuery muss ja eine Transaktion zugeordnet werden. Sonst kommt zu Recht eine Exception. Das würde aber einen noch mehr Umstellung bei mir bedeuten. Jetzt gibt es ja OnBeforeExecute/OnAfterExecute und qoAutoCommit. Da könnte ich doch ne allgemeine Transaktion dranbasteln, oder ? Ist das ein denkbarer Weg ? Mensch, ist das Wegkommen von der BDE schwer ;( Heiko |
Re: FIBPlus: BDE-AutoCommit nachbauen
Hallo,
klappt damit. Heiko |
Re: FIBPlus: BDE-AutoCommit nachbauen
Zitat:
Zitat:
|
Re: FIBPlus: BDE-AutoCommit nachbauen
Hallo Hansa,
;) klar geht es darum, die BDE nachzubauen. sonst muss ich zu viel am Code ändern ! AutoCommit war falsch ausgedrückt, das hat auch TpFIBQuery. Was ich meinte, war das automatische StartTransaction (qoStartTransaction). Die Anzahl der Ereignisse sind mir doch Schnuppe ;) Zuerst mal muss ein lauffähiges Programm her, was zur Not noch mit der BDE "rück"-compilierbar ist. Einem existierenden BDE-Kunden ist es doch Brust, ob das Teil über die BDE oder sonstwas läuft. Die Korrektheit ist wichtig. Deswegen kann ich nicht ewig wegen den Transaktionen am Code rumfummeln. In meinem BDE-Code steht ne Menge
Delphi-Quellcode:
aber auch
with Query do
begin // end;
Delphi-Quellcode:
DB.StartTransaction;
try with QueryA do begin end; with QueryB do begin end; finally DB.Commit; end; Beides muss mit FIBPlus funktionieren, ohne das ich hier noch gross was mit Transaktionen am Hut haben muss. Hier übrigens mein Ansatz dazu.
Delphi-Quellcode:
Klappt ja auch :cheers:
type
TMyQuery = class(TpFibQuery) public bAutoTransaction: Boolean; constructor Create(AOwner: TComponent); override; procedure PrepareAutoCommit(Sender: TObject); procedure UnPrepareAutoCommit(Sender: TObject); end; constructor TMyQuery.Create(AOwner: TComponent); begin inherited Create(AOwner); BeforeExecute := PrepareAutoCommit; AfterExecute := UnPrepareAutoCommit; end; procedure TMyQuery.PrepareAutoCommit(Sender: TObject); begin Assert(Self.Database<>NIL, 'theQuery.Database=NIL'); Assert(Self.Transaction<>NIL, 'theQuery.Transaction=NIL'); if Self.Database=NIL then Exit; if Self.Transaction=NIL then Exit; if Self.Transaction.InTransaction=False then begin Self.Options:= Self.Options + [qoStartTransaction]; bAutoTransaction:= True; end; end; procedure TMyQuery.UnPrepareAutoCommit(Sender: TObject); begin if Self.bAutoTransaction then begin if Self.Transaction.InTransaction then begin Self.Transaction.Commit; end; Self.Options:= Self.Options - [qoStartTransaction]; Self.bAutoTransaction:= False; end; end; #Update#: Ein gleichzeitiges Setzen von qoStartTransaction und qoAutoCommit bringt übrigens nichts. Dann funktionieren die expliziten (manuellen) Transaktionen nicht. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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