为什么有时我会得到“无效的事务对象”异常?

时间:2009-01-07 11:48:50

标签: delphi dbx

此代码有问题吗?
有时我会在其中得到一个未处理的“无效的事务对象”异常:

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;

此异常正在提升给用户,所以我认为它是由RollbackFreeAndNil引发的,因为所有其余部分都在try..except中。

我应该用另一个try..except包装RollbackFreeAndNil吗?真是一团糟。

我正在使用Delphi 2009,DBX和Firebird 2.1以及Devart的驱动程序。

4 个答案:

答案 0 :(得分:4)

如果CommitFreeAndNil引发异常会怎样?

将调用RollbackFreeAndNil。 TD会有效吗?

你正在吃异常,因此有证据。不要那样做;再掷:

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;

答案 1 :(得分:3)

问题是如果SQLConnection未连接到数据库,则SQLConnection.BeginTransaction返回nil。然后我得到了无效事务对象的异常。

我没想到。它应该尝试连接或引发异常。返回零对我没有意义。

答案 2 :(得分:1)

有时候你用cxdbmemo这样的组件执行varius程序并给你带来错误。你必须删除该组件(或类似的东西)并使你的交易正常。

答案 3 :(得分:0)

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);