Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何重新连接到同一UIB数据库+;网络丢失后的UIB传输?_Delphi_Networking_Wifi_Uib - Fatal编程技术网

Delphi 如何重新连接到同一UIB数据库+;网络丢失后的UIB传输?

Delphi 如何重新连接到同一UIB数据库+;网络丢失后的UIB传输?,delphi,networking,wifi,uib,Delphi,Networking,Wifi,Uib,我们为比萨店提供了Delphi7+UIB+Firebird 2.5应用程序,可在有线网络上稳定运行。 但在wifi上(使用Win8/Win10 TabletPC),如果连接中断,UIB数据库无法自动重新连接 (我们目前正在重建整个应用程序,以删除“IBX遗留问题”,但升级后,问题似乎更加严重!) 在典型连接丢失后,出现错误消息。是: Project ...exe raised exception class EUIBError with message 'connection rejected

我们为比萨店提供了Delphi7+UIB+Firebird 2.5应用程序,可在有线网络上稳定运行。
但在wifi上(使用Win8/Win10 TabletPC),如果连接中断,UIB数据库无法自动重新连接

(我们目前正在重建整个应用程序,以删除“IBX遗留问题”,但升级后,问题似乎更加严重!)

在典型连接丢失后,出现错误消息。是:

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
关闭当前连接,取消中止
也无法再次重新连接:

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毫秒后强制取消操作,但该事件从未触发

所以我想知道:

  • 有没有办法妥善处理这些案件
  • 没有其他人有这样的问题?(红色,仅在0溶液中找到。)
  • 当前UIB组件是否可从非稳定的下载?(由于许多SynEdit不兼容错误,很难在D7下编译!)
  • 为什么只有在我再次尝试重新连接后,
    .OnConnectionLoss
    事件才会触发
  • 是否可以重新连接到:
    再次进行相同的交易
    完成查询
    并正确提交和关闭?
    (因为我们可以从Firebird读取事务ID。)。。。因此,服务器不需要将其打开2个多小时

错误1:
在ca.50的1个位置意外键入了tpConsistency而不是tpConcurrency。
那把锁把整张桌子都锁上了,所以不可能再接回去

错误2:
建议设置
myTransaction.DefaultAction:=etmRollback

错误3:

UIB代码在
uiblib.pas
处出错。
  • FLockTimeout
    LockTimeout
    变量必须是整数
  • 固定参数代码:
函数CreateTRParams(选项:TTTransParams;常量锁读、锁写:字符串{$IFDEF FB20_UP};锁超时:整数{$ENDIF}):RawByteString;
...
开始
{$IFDEF FB20_UP}
如果LockTimeout=0,则
排除(选项,tpLockTimeout)
else begin/-1=无限,1..2048M=秒
排除(选项,tpnoWait);
包括(选项、tpWait);
包括(选项,tpLockTimeout);
结束;
{$ENDIF}
如果选项=[tpConcurrency,tpWait,tpWrite],则
结果:=''
其他的
开始
结果:=isc_tpb_版本3;
对于tp:=低(TTTransparam)到高(TTTransparam)do
如果(选项中的tp),则
开始
案例tp
tpLockRead:ParseStrOption(tpc[tp],AnsiString(LockRead));
tpLockWrite:ParseStrOption(tpc[tp],AnsiString(LockWrite));
{$IFDEF FB20_UP}
tpLockTimeout:

//旧代码:PAnsiChar(@LockTimeout)[0]+PAnsiChar(LockTimeout)[1];如果你正在重新做所有的事情,你应该认真考虑无状态连接,比如REST。正如我所写的:我们正在重构“新的iBX不间断连接”的方式“新的方式”。现在它一点也不稳定了。我连接只是为了检查更改。仅在收到FB事件后。使用线程安全变量存储在内存中的所有数据。@Jerrydoge我们已尝试开发一个REST api+移动应用程序,耗时4年,耗资数百万美元。都变成垃圾了。没有了。我们需要解决上述问题。如果我处在你的处境,我会问自己,我会怎么做?我要做的第一件事是更改数据库组件。在Delphi7中,您可以选择在Upscene Productions Firebird驱动程序中使用IBX或DBX。(您可以在wayback机器上找到它)您将无法重新连接以前丢失的同一事务,因为Firebird将检测到连接丢失并终止事务。您必须重新连接并打开新事务。据我所知,您正在使用长时间运行的事务,这是一个严重的设计缺陷。您的交易应该尽可能短。