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.Open或Execute但是我正在寻找我的大应用程序的一些"集中式"的解决方案.所以在"连接失败"的情况下,我可以知道哪个数据集正在尝试打开,然后重试.
这个想法可能是捕获连接错误,然后通过重试来管理它。建议:
该函数返回异常描述
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)
一个好的解决方案是集中插入/更新和选择过程,然后捕获错误并尝试调整情况一两次,然后再向用户显示消息