ウィザードを使用してスタンドアロンのDatasnap TCP/IPサーバーを作成しました。私はサンプルメソッドを選択しました(エコーストリングと逆ストリング)。私はサーバーを保存して実行しました。次に、クライアントアプリケーションを作成し、ファイルnew-otherを使用して、ClientClassesユニットとともにClientModuleをそのクライアントプロジェクトに追加しました。メインフォーム上。私はボタンを追加しました。ボタンのOnClickイベントハンドラでは、私は次のコードを追加:Delphi 10 Seattle Datasnapエラー:「操作が失敗しました。接続が閉じました。
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientModule1.SQLConnection1.Connected then
begin
Button1.Text := 'Open';
ClientModule1.SQLConnection1.Close;
end
else
begin
Button1.Text := 'Close';
// ClientModule1.SQLConnection1.Open;
ClientModule1.ServerMethods1Client.ReverseString('myteststring');
end;
end;
ここでの目的は、クライアントがサーバーにログインしてからログアウト定期的にではなく、接続を維持している状況をシミュレートすることです。これは、モバイルにデプロイされたアプリで特に重要です。
ServerMethods1クライアントへの最初の呼び出しで接続が開かれるため、Connection.Openをコメントアウトしたことが分かります。生成されたコードは次のとおりです。
function TClientModule1.GetServerMethods1Client: TServerMethods1Client;
begin
if FServerMethods1Client = nil then
begin
SQLConnection1.Open;
FServerMethods1Client := TServerMethods1Client.Create(SQLConnection1.DBXConnection, FInstanceOwner);
end;
Result := FServerMethods1Client;
end;
ここで問題が発生します。ボタンを最初にクリックすると、接続が開き、メソッドが呼び出されます。ボタンを2回クリックすると、接続が閉じられます。 3回目のクリックで、TDBXCommandコードで「操作が失敗しました。接続がクローズしました」という例外が発生します。回避策として
、私はこれを試してみました:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientModule1.SQLConnection1.Connected then
begin
Button1.Text := 'Open';
ClientModule1.SQLConnection1.Close;
ClientModule1.ServerMethods1Client := nil;
end
else
begin
Button1.Text := 'Close';
// ClientModule1.SQLConnection1.Open;
ClientModule1.ServerMethods1Client.ReverseString('myteststring');
end;
end;
これはソートのClientModule1のFServerMethods1Clientインスタンスがリセットされているので、それは最初の実行でやったようなので、作成したコードを再度実行し、問題を解決しません。
他の唯一の問題は、(私はEurekalogを使用しています)メモリリークを作成することです。
私は間違っていますか?アプリを再起動せずにDatasnapサーバとの接続/切断を繰り返し行うには、どのような方法が適していますか?
これはうまくいきますが、毎回新しいインスタンスを作成して破棄するのではなく、接続が開いている間はクライアントプロキシインスタンスを割り当てたほうが効率的です。メモリ割り当て/管理は、特に代替案(繰り返し実行しない)と比較して高価です。 –
あなたがあなた自身の質問に答えて、あなたが本当に提供した情報が元の質問に対する答えではないとき、答えとしてマークしたのは混乱しています。 –
あなたは完全な答えを提供しても大丈夫です。それまでの間は、自分の答えで十分ですが、そうではありませんか? – nolaspeaker