我在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
?解决办法是什么?我的测试代码是更长代码的一部分,但我想知道如何分解事务状态的内部状态? 最佳答案
我找到了解决方案-TestSQL.Database
与TestSQL.Transaction.DefaultDatabase
意外地不同。而这在如此奇怪的错误消息中得以体现。 IBX允许所有这些数据库都不同是很奇怪的。