我在IBX中使用Delphi(2009,没关系),并且试图执行简单的代码:

TestSQL.ExecQuery;


在此代码之前,我已经检查了(并且也可以在调试器手表中看到)TestSQL.Transaction.InTransactionTrue。然而,引发了异常:

EIBInterBaseError with message 'invalid transaction handle (expecting explicit transaction start)'


因此,除了执行代码之外,没有其他解决方案:

TestSQL.Transaction.StartTransaction;
TestSQL.ExecQuery;


现在引发另一个异常:

EIBClientError with message 'Transaction is active'


完成死胡同? Delphi有代码:

procedure TIBTransaction.CheckInTransaction;
begin
  if FStreamedActive and (not InTransaction) then
    Loaded;
  if (FHandle = nil) then
    IBError(ibxeNotInTransaction, [nil]);
end;


这意味着交易需求不仅由InTransaction决定,而且还由私有变量FStreamedActive决定。那么-事务控制的方式更复杂吗?我如何影响FStreamedActive?解决办法是什么?我的测试代码是更长代码的一部分,但我想知道如何分解事务状态的内部状态?

最佳答案

我找到了解决方案-TestSQL.DatabaseTestSQL.Transaction.DefaultDatabase意外地不同。而这在如此奇怪的错误消息中得以体现。 IBX允许所有这些数据库都不同是很奇怪的。

10-06 14:53