我在IBX中使用的是Delphi(2009,没关系),我正在尝试执行简单的代码:
TestSQL.ExecQuery;
在此代码之前,我已经检查了TestSQL.Transaction.InTransaction
是True
(在调试器监视中也可以看到)。尽管如此,还是引发了异常:
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
?解决办法是什么?我的测试代码是更长代码的一部分,但我想知道如何分解事务状态的内部状态?
答案 0 :(得分:2)
我找到了解决方法-TestSQL.Database
与TestSQL.Transaction.DefaultDatabase
意外地不同。而这在如此奇怪的错误消息中得以体现。 IBX允许所有这些数据库都不同是很奇怪的。