【发布时间】:2013-09-14 05:22:52
【问题描述】:
我在 Delphi 中看到了很多 DataSnap 示例,但在 C++ Builder 中却很少,并且还没有弄清楚如何指定应将 TStream 返回给调用客户端。
我正在使用一个简单的配置,类似于我看到的教程。一个示例服务器方法是:
System::UnicodeString GetData(int PatientID, int& count, TStream* stream);
我从我的客户调用该方法没有问题。因为 count 作为引用传递,所以 DataSnap 服务器知道将其发送回客户端。生成Client Classes,在客户端的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() 调用中引发访问冲突。
有没有办法可以将指针传递给服务器方法并以某种方式标记它应该将流传递回调用客户端?
【问题讨论】:
-
var TStream在 Delphi 中是TStream*&在 C++ 中,就像创建的生成代码一样。TStream&将不起作用。 -
谢谢。我使用您的回复在我发布的答案中开发了服务器和客户端方法。
标签: c++builder datasnap