我们有一个比萨饼店Delphi7的+ UIB +火鸟2.5应用程序,工作稳定的岩石上的有线网络。
但在无线网络(与于Win8 / Win10 TabletPCs,工作)如果连接断开,UIBDatabase不能自动重新连接本身。
(目前,我们正在重建整个应用程序,取消“IBX剩饭”,但升级后UIB到最新版本 ,问题似乎更糟!)
一个tipical连接丢失,错误味精后。 是:
Project ...exe raised exception class EUIBError with message 'connection rejected by remote interface
Connection not established
GDS Code: 335544421 - SQL Code: -923 - Error Code: 101'. Process stopped.
即使我尝试关闭与当前连接.IsConnected:=False
或.CancelAbort
它不能再重新连接任何更多:
Project ...exe raised exception class EUIBError with message 'invalid statement handle
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements
GDS Code: 335544485 - SQL Code: -901 - Error Code: 165'. Process stopped. Use Step or Run to continue.
所以,无论我们做什么, 我们无法重新连接!
最坏的情况是,当TabletPC的进入睡眠模式 ,因为连接肯定是坏了,但是组件认为它仍然在线。 它需要8秒最小为它意识到不能执行查询。
我们试图启动一个TTimer前,迫使2000毫秒后取消操作,但该事件永远不会被解雇。
所以我想知道:
- 有没有办法来妥善处理这些情况?
- 任何人都不具有这样的问题呢? (红每一相关的主题在这里 ,发现只有1相似 0的解决方案。)
- 是当前UIB组件下载从这里不是稳定 ? (已经”很难D7下编译,因为许多SynEdit不兼容的错误!)
- 为什么
.OnConnectionLoss
触发的事件,我再次尝试重新连接后,才 ? - 是否有可能重新连接到:
再次相同的事务 ,
完成查询
并承诺:正常关闭?
(因为我们可以看到从火鸟事务ID)。......所以,服务器将不会需要持有它打开2+小时。
错误1:
小心输入了tpConsistency而不是tpConcurrency在1处ca.50的。
这LOCK-ED整个表,所以这是不可能的连接回
错误2:
它建议设置myTransaction.DefaultAction := etmRollback;
错误3:
该UIB代码是错误的uiblib.pas
。
-
FLockTimeout
和LockTimeout
变量必须是整数! - FIXED参数设置代码:
function CreateTRParams(Options: TTransParams; const LockRead, LockWrite: string{$IFDEF FB20_UP}; LockTimeout: integer{$ENDIF}): RawByteString;
...
begin
{$IFDEF FB20_UP}
if LockTimeout = 0 then
Exclude(Options, tpLockTimeout)
else begin // -1 = infinite, 1..2048M = seconds
Exclude(Options, tpnoWait);
Include(Options, tpWait );
Include(Options, tpLockTimeout);
end;
{$ENDIF}
if Options = [tpConcurrency,tpWait,tpWrite] then
result := ''
else
begin
Result := isc_tpb_version3;
for tp := Low(TTransParam) to High(TTransParam) do
if (tp in Options) then
begin
case tp of
tpLockRead : ParseStrOption(tpc[tp], AnsiString(LockRead));
tpLockWrite : ParseStrOption(tpc[tp], AnsiString(LockWrite));
{$IFDEF FB20_UP}
tpLockTimeout :
//old code: PAnsiChar(@LockTimeout)[0] + PAnsiChar(LockTimeout)[1]; << [1] causing AV error
case LockTimeout of
-1 : Result := Result + tpc[tp] + #4#127#255#255#255;
// 0 : Result := Result + tpc[tp] + #1#0; // this would be invalid
1..255: Result := Result + tpc[tp] + #1 + AnsiChar(Byte( LockTimeout and $FF));
else //256..32k
Result := Result + tpc[tp] + #2 + AnsiChar(Byte((LockTimeout div $FF) and $FF)) + AnsiChar(Byte(LockTimeout and $FF));
end;
{$ENDIF}
else
Result := Result + tpc[tp];
end;
end;
end;
end;
特征请求4
没有找到任何解决办法重新连接到丢失后的同一事务。
文章来源: How to reconnect to the same UIBDatabase + UIBTransaction after network-loss?