gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:49:49 25 4
gpt4 key购买 nike

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

我想知道在短时间网络断开的情况下是否有一些聪明的方法来恢复/重试 ado 连接? (这种情况有时会发生在连接不太稳定的客户身上)。

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

"Connection failure"

"[DBNETLIB][ConnectionWrite (send()).]General network error. Check your network documentation"

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

TADOConnection 在网络断开时不会触发任何事件。并且 TADOConnection.Connected 保持 true

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

最佳答案

No 在网络断开时从不触发。但是您可以在每个命令之前检查连接。因此,如果 AdoConnection 断开连接,您可以在此之后重新连接并执行您的命令。

如果你想要集中式解决方案并且你有 1 个连接,你可以这样做;

Const
ConnectionTestString=' '; //Yes, it's work on Sql Server. If doesnt your db, you can use 'Select 1'

程序;

Procedure TDM.GetCommandResult_Conn(CText:String;Connection : TAdoConnection);
var Ado_Ds_Tmp:TAdoCommand;
Begin
Ado_Ds_Tmp:=TAdoCommand.Create(self);
try
Ado_Ds_Tmp.Connection:=Connection;
Ado_Ds_Tmp.ParamCheck := False;
Ado_Ds_Tmp.CommandText:=CText;
try
Ado_Ds_Tmp.Execute;
except
DM.RaiseExceptionCreate('Error ! Command, ('+StrToList(CText, ' ')[0]+')');
end;
finally
Ado_Ds_Tmp.Destroy;
end;
end;

procedure TDM.ADOConnection1WillExecute(Connection: TADOConnection;
var CommandText: WideString; var CursorType: TCursorType;
var LockType: TADOLockType; var CommandType: TCommandType;
var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
const Command: _Command; const Recordset: _Recordset);
var
ErrorLogFileName : string;
ErrorFile : TextFile;
ErrorData : string;
Msg : String;
begin
try
if (CommandText<>ConnectionTestString) then begin
DM.GetCommandResult_Conn(ConnectionTestString, Connection);
end;
except
try
try
Connection.Connected := False;
except
end;
try
Connection.ConnectionString := AdoConnectionString;
Connection.Mode:=cmShareDenyNone;
finally
try
Connection.Connected := True;
// If you wanna log for frequency
ErrorLogFileName := ChangeFileExt(Application.ExeName,'.error.log');
AssignFile(ErrorFile, ErrorLogFileName);
if FileExists(ErrorLogFileName) then
Append(ErrorFile)
else
Rewrite(ErrorFile);
try
ErrorData := Format('%s : %s : %s (%s / %s)',[DateTimeToStr(Now), 'Disconnected but we reconnect.', '', 'UserName : '+DBUser, 'Client : '+GetComputerNetName]);
WriteLn(ErrorFile,ErrorData);
finally
CloseFile(ErrorFile)
end;
except
DM.RaiseExceptionCreate('ReConnection Failed!');
end;
end;
except
end;
end;
end;

有什么问题吗?

关于database - 如何在应用程序中恢复/重试损坏的 TADOConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31024521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com