为什么有时候我会得到一个“无效的交易对象”例外?

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

  •  05-07-2019
  •  | 
  •  

此代码有问题吗?
有时我得到一个未处理的“无效的交易对象”例外:

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的驱动程序。

有帮助吗?

解决方案 2

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

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

其他提示

如果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;

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

SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top