我有一个带有 vcl 表单客户端的数据快照服务器。从客户端,如果服务器已关闭并使用现有客户端连接重新启动,我该如何处理?这种情况会引发 10053 EIdSocketError 异常。
为了复制,我同时运行服务器和客户端,调用服务器(我使用通过 DataSnap 代理生成器公开的方法),它成功了。然后我关闭服务器(例如关闭应用程序)并重新启动它。然后我尝试再次调用服务器。
例如: 客户来电
sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnection1.DBXConnection);
try
ds := sm.SearchPolicyByPolicy(40, WCRef, '', 3);
dspPolicyGroup.DataSet := ds;
if cdsPolicyGroup.Active then
cdsPolicyGroup.Refresh
else
cdsPolicyGroup.Open;
finally
sm.Free;
end;
dspPolicyGroup 是 TDataSetProvider 而 cdsPolicyGroup 是 TClientDataSet(我只是在本地使用它来“存储”我的 TDataSet 结果)。
服务器
function TsvrPolicySearch.SearchPolicyByPolicy(AClientId: Integer; WCRefNum, ClientRef: string; SearchMethod: Integer): TDataSet;
begin
spPolicyByWCRef.Close;
spPolicyByWCRef.ParamByName('p_client').AsInteger := AClientId;
spPolicyByWCRef.ParamByName('p_search_method').AsInteger := SearchMethod;
spPolicyByWCRef.ParamByName('p_wc_refno').AsString := WCRefNum;
spPolicyByWCRef.Open;
Result := spPolicyByWCRef;
end;
我认为人们经常会遇到这种情况,因为它很容易复制。我是否应该在每次调用之前先进行“测试连接”调用或其他东西(例如方法 TestConnection)以检查 EIdSocketError(和等效项)并进行处理?或者它可能更像是一个设计缺陷?
谢谢