Warum manchmal erhalte ich eine „Invalid Transaktionsobjekt“ Ausnahme?

StackOverflow https://stackoverflow.com/questions/420022

  •  05-07-2019
  •  | 
  •  

Frage

Gibt es etwas falsch mit diesem Code?
Manchmal habe ich eine nicht behandelte „Ungültige Transaktionsobjekt“ Ausnahme in ihm:

procedure BlaBla;
var
  TD: TDBXTransaction;
begin
  TD := SQLConnection.BeginTransaction;
  try
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.CommitFreeAndNil(TD);
  except
    SQLConnection.RollbackFreeAndNil(TD);
  end;
end;

Diese Ausnahme für den Benutzer angehoben wird, so dass ich nehme an, es durch RollbackFreeAndNil erhöht ist, da alle übrigen in einem try..except ist.

Soll ich wickeln RollbackFreeAndNil mit einem anderen try..except? Was für ein Durcheinander.

Ich bin mit Delphi 2009, DBX mit Firebird 2.1 und Devart des Fahrers.

War es hilfreich?

Lösung 2

Das Problem ist, dass SqlConnection.BeginTransaction Null zurückgibt, wenn SQLConnection- nicht mit der Datenbank verbunden ist. Und dann bekomme ich die Ausnahme ungültigen Transaktionsobjekts.

Ich hätte nie erwartet, dass. Es sollte versuchen, eine Ausnahme zu verbinden oder zu erhöhen. Null zurückkehrend macht keinen Sinn für mich.

Andere Tipps

Was würde passieren, wenn CommitFreeAndNil eine Ausnahme ausgelöst hat?

RollbackFreeAndNil würde aufgerufen werden. TD würde dann gültig sein?

Sie essen die Ausnahme, und damit den Beweis. Tun Sie das nicht; Wiederwurf:

procedure BlaBla;
var
  TD: TDBXTransaction;
begin
  TD := SQLConnection.BeginTransaction;
  try
    SQLConnection.ExecuteDirect('some sql command');
    SQLConnection.ExecuteDirect('some sql command');
  except
    SQLConnection.RollbackFreeAndNil(TD);
    raise;
  end;
  SQLConnection.CommitFreeAndNil(TD);
end;

einige Zeit ist, dass Sie varius Verfahren mit einer Komponente wie cxdbmemo und geben Sie thats Fehler auszuführen. Sie müssen diese Komponente (oder somthing wie diese) entfernen und tun Sie Ihre Transaktion normal.

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top