vcl フォーム クライアントを備えた datasnap サーバーがあります。クライアントから、サーバーがシャットダウンされ、既存のクライアント接続で再起動された場合、どのように処理できますか? このシナリオでは、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;
これは、複製が非常に簡単であることを知っている人々が定期的に遭遇していると思います。EIdSocketError (および同等のもの) をチェックして処理するために、各呼び出しの前に "Test Connection" 呼び出しまたは何か (メソッド TestConnection など) を最初に配置する必要がありますか? それとも、おそらく設計上の欠陥ですか?
ありがとう