Reputation: 2819
Is there something wrong with this code?
Sometimes I get an unhandled "Invalid transaction object" exception in it:
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;
This exception is being raised to the user, so I assume it's raised by RollbackFreeAndNil, since all rest is inside a try..except.
Should I wrap RollbackFreeAndNil with another try..except? What a mess.
I'm using Delphi 2009, DBX with Firebird 2.1 and Devart's driver.
Upvotes: 1
Views: 3096
Reputation: 1
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
Upvotes: 0
Reputation: 11
some times is that you execute varius procedures with a component like cxdbmemo and give you thats error. You have to remove that component (or somthing like this) and do your transaction normal.
Upvotes: 1
Reputation: 2819
The problem is that SQLConnection.BeginTransaction returns nil if SQLConnection is not Connected to the database. And then I get the exception of invalid transaction object.
I never expected that. It should try to connect or raise an exception. Returning nil doesn't make sense to me.
Upvotes: 3
Reputation: 126547
What would happen if CommitFreeAndNil threw an exception?
RollbackFreeAndNil would be called. Would TD be valid then?
You're eating the exception, and hence the evidence. Don't do that; re-throw:
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;
Upvotes: 4