Delphi で多くの DataSnap の例を見てきましたが、C++ Builder での例は少なく、呼び出し元のクライアントに TStream を返すように指定する方法がわかりませんでした。
私が見たチュートリアルと同様に、単純な構成を使用しています。サーバーメソッドの例は次のとおりです。
System::UnicodeString GetData(int PatientID, int& count, TStream* stream);
クライアントからそのメソッドを呼び出すのに問題はありません。count は参照として渡されるため、DataSnap サーバーはそれをクライアントに送り返すことを知っています。クライアントの TSQLConnection でクライアント クラスを生成し、サーバーに接続して、以下を生成します。
System::UnicodeString __fastcall TServerMethods1Client::GetData(int PatientID, int &count, TStream* stream)
{
if (FGetDataCommand == NULL)
{
FGetDataCommand = FDBXConnection->CreateCommand();
FGetDataCommand->CommandType = TDBXCommandTypes_DSServerMethod;
FGetDataCommand->Text = "TServerMethods1.GetData";
FGetDataCommand->Prepare();
}
FGetDataCommand->Parameters->Parameter[0]->Value->SetInt32(PatientID);
FGetDataCommand->Parameters->Parameter[1]->Value->SetInt32(count);
FGetDataCommand->Parameters->Parameter[2]->Value->SetStream(stream, FInstanceOwner);
FGetDataCommand->ExecuteUpdate();
count = FGetDataCommand->Parameters->Parameter[1]->Value->GetInt32();
System::UnicodeString result = FGetDataCommand->Parameters->Parameter[3]->Value->GetWideString();
return result;
}
生成されたコードが返されたパラメーターからカウントを設定していることがわかります。これは、サーバーがそれを送り返していることを示しています。ただし、ストリームはサーバーに送信されるだけで、クライアントには戻されません。
Delphi では、var を使用して、参照を呼び出し元に戻す必要があることを示します。ただし、TStream で参照を使用しても機能しません。
この定義について:
System::UnicodeString GetData(int PatientID, int& count, TStream& stream);
私はこの生成されたコードを取得します:
System::UnicodeString __fastcall TServerMethods1Client::GetData(int PatientID, int &count, TStream* &stream)
{
if (FGetDataCommand == NULL)
{
FGetDataCommand = FDBXConnection->CreateCommand();
FGetDataCommand->CommandType = TDBXCommandTypes_DSServerMethod;
FGetDataCommand->Text = "TServerMethods1.GetData";
FGetDataCommand->Prepare();
}
FGetDataCommand->Parameters->Parameter[0]->Value->SetInt32(PatientID);
FGetDataCommand->Parameters->Parameter[1]->Value->SetInt32(count);
FGetDataCommand->Parameters->Parameter[2]->Value->SetStream(stream, FInstanceOwner);
FGetDataCommand->ExecuteUpdate();
count = FGetDataCommand->Parameters->Parameter[1]->Value->GetInt32();
stream = FGetDataCommand->Parameters->Parameter[2]->Value->GetStream(FInstanceOwner);
System::UnicodeString result = FGetDataCommand->Parameters->Parameter[3]->Value->GetWideString();
return result;
}
ExecuteUpdate() 呼び出しでアクセス違反をスローします。
サーバーメソッドにポインターを渡し、ストリームを呼び出し元のクライアントに戻す必要があることを何らかの方法でマークする方法はありますか?