Delphi IBX TIBSQL.ExecQuery是否具有奇怪的事务要求(FStreamedActive因素)?

时间:2018-08-31 11:19:44

标签: delphi firebird

我在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?解决办法是什么?我的测试代码是更长代码的一部分,但我想知道如何分解事务状态的内部状态?

1 个答案:

答案 0 :(得分:2)

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