Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FIBPlus: BDE-AutoCommit nachbauen (https://www.delphipraxis.net/138303-fibplus-bde-autocommit-nachbauen.html)

hoika 7. Aug 2009 08:06

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

hoika 7. Aug 2009 09:05

Re: FIBPlus: BDE-AutoCommit nachbauen
 
Hallo,

klappt damit.


Heiko

Hansa 7. Aug 2009 10:38

Re: FIBPlus: BDE-AutoCommit nachbauen
 
Zitat:

Zitat von hoika
Mensch, ist das Wegkommen von der BDE schwer ;(

Mit Verlaub gesaagt : mir kommt es fast so vor, als versuche einer die BDE mit FIBplus nachzubauen. 8) :mrgreen: Wieso FIBQuery statt ein FIBDataSet ? Guck Dich nur mal im OI um : FIBQuery : 10 Ereignisse. FIBDataset : 59. Bei den Eigenschaften ist das Verhältnis 12:32 und siehe da : das FIBDataset hat auch ein AutoCommit. :zwinker:

Zitat:

Zitat von FIBPlus-Hilfe
AutoCommit Sets a mode of automatic committing of dataset changes.


hoika 7. Aug 2009 10:57

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:
with Query do
begin
 //
end;
aber auch

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:
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;
Klappt ja auch :cheers:


#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 17:46 Uhr.

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