如何重新连接到同一UIBDatabase + UIBTransaction后的网络损失?(How t

2019-10-29 03:37发布

我们有一个比萨饼店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+小时。

Answer 1:

错误1:
小心输入了tpConsistency而不是tpConcurrency在1处ca.50的。
这LOCK-ED整个表,所以这是不可能的连接回

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

错误3:

该UIB代码是错误的uiblib.pas

  • FLockTimeoutLockTimeout变量必须是整数!
  • 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?