Einzelnen Beitrag anzeigen

hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: FIBPlus: BDE-AutoCommit nachbauen

  Alt 7. Aug 2009, 10:57
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


#Update#:
Ein gleichzeitiges Setzen von qoStartTransaction
und qoAutoCommit bringt übrigens nichts.
Dann funktionieren die expliziten (manuellen) Transaktionen nicht.


Heiko
Heiko
  Mit Zitat antworten Zitat