Pourquoi parfois je reçois une exception «Objet de transaction invalide»?
Question
Quelque chose ne va pas avec ce code?
Parfois, je reçois un " Objet de transaction invalide " non géré. exception:
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;
Cette exception est générée par l'utilisateur. Je suppose donc qu'elle a été soulevée par RollbackFreeAndNil, car tout le reste se trouve à l'intérieur d'un try..except.
Dois-je envelopper RollbackFreeAndNil avec un autre essai ... sauf? Quel gâchis.
J'utilise Delphi 2009, DBX avec Firebird 2.1 et le pilote Devart.
La solution 2
Le problème est que SQLConnection.BeginTransaction renvoie la valeur nil si SQLConnection n’est pas connecté à la base de données. Et puis j'obtiens l'exception de l'objet transaction invalide.
Je ne m'y attendais jamais. Il faut essayer de connecter ou de lever une exception. Rendre le néant n'a pas de sens pour moi.
Autres conseils
Que se passerait-il si CommitFreeAndNil levait une exception?
RollbackFreeAndNil serait appelé. La TD serait-elle valide alors?
Vous êtes en train de manger l'exception, et donc la preuve. Ne fais pas ça re-lancer:
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;
Parfois, vous exécutez des procédures varius avec un composant comme cxdbmemo et vous vous trompez. Vous devez supprimer ce composant (ou quelque chose comme cela) et effectuer votre transaction normalement.
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);