Warum manchmal erhalte ich eine „Invalid Transaktionsobjekt“ Ausnahme?
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.
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);