如何在整个应用程序中恢复/重试损坏的TADOConnection?

zig*_*zig 6 database delphi adodb delphi-7

我有一个全局数据模块TADOConnection(默认KeepConnection设置为true).我现有的应用程序中有许多使用此全局的数据集和查询TADOConnection.

我想知道是否有一些智能方法可以在短暂的网络断开连接时恢复/重试ado连接?(这种情况有时发生在连接不稳定的客户端).

它很容易重现我需要的东西.只需TADOConnection在启动时打开.打开一些TADODataSet,然后禁用并启用"本地连接".如果您尝试刷新数据集,EOleException则会引发异常

"连接失败"

要么

"[DBNETLIB] [ConnectionWrite(send()).]常规网络错误.检查网络文档"

如果我重新启动应用程序一切都很好.

TADOConnection网络断开时不会触发任何事件.并且TADOConnection.Connected仍然存在true

当然,我可以用一个try/catch每一个TDataSet.OpenExecute但是我正在寻找我的大应用程序的一些"集中式"的解决方案.所以在"连接失败"的情况下,我可以知道哪个数据集正在尝试打开,然后重试.

Gia*_*mbo 0

这个想法可能是捕获连接错误,然后通过重试来管理它。建议:

该函数返回异常描述

function GetStrException(ExceptObject: TObject; ExceptAddr: Pointer):String;
var
  Buffer: array[0..1023] of Char;
begin
    ExceptionErrorMessage(ExceptObject, ExceptAddr, Buffer, SizeOf(Buffer));
    Result:=Buffer;
end;
Run Code Online (Sandbox Code Playgroud)

这是一个简单的想法,需要测试!

procedure TForm1.Button2Click(Sender: TObject);
var
 s,error:String;
begin
 //a select as an example
 S := 'SELECT COUNT(*) FROM MyTable';
 TRY
   WITH ADOQuery1 DO BEGIN SQL.Clear; SQL.Add(s);OPEN;END;
   Memo1.Lines.ADD(ADOQuery1.Fields[0].AsString);
 EXCEPT
   error:=(GetStrException(ExceptObject,ExceptAddr));
   //using MySql my error case is when the connection is lost, so the error is "Server has gone away"
   if pos(error,'has gone away')>0 then
     begin
       Showmessage('Connection Error, please try again');
       try
          sleep(1000)
          AdoConnection1.close;
          AdoConnection1.open;
       except
         Showmessage('The connection Error persists, please contact the support');
       end;
     end;
 END;
end;
Run Code Online (Sandbox Code Playgroud)

一个好的解决方案是集中插入/更新和选择过程,然后捕获错误并尝试调整情况一两次,然后再向用户显示消息