我正在使用datasnap技术,我将客户端作为服务器应用程序。 服务器从数据库获取数据并放入流中,然后在客户端获取。 我一直在客户端代码上收到“丢失数据提供程序或数据包”错误。
服务器端代码:
function GetFiles(ClientID: integer): TStream;
var
CDS: TClientDataSet;
begin
try
Result := TMemoryStream.Create;
CDS := TClientDataSet.Create(nil);
with adsFiles do // ads is adodataset and dspFiles is the dataset provider which has its dataset property set to adsFiles
begin
Close;
Parameters.ParamByName('ClientID').Value := ClientID;
Open;
CDS.Data := dspFiles.Data;
CDS.Open;
CDS.SaveToStream(Result);
Result.Position := 0;
end;
finally
CDS.Free;
end;
客户端代码:
procedure ExportData;
var
StreamData: TStream;
begin
StreamData := SvrMethodClass.GetFiles(AClientID);
StreamData.Seek(0,soFromBeginning);
StreamData.Position:= 0;
cdsClientFiles.LoadFromStream(StreamData); // getting the error message "Missing Data Provider or Data Packet"
cdsClientFiles.Open;
end;
客户端我已经删除了一个clientdataset组件并试图将数据加载到此数据集中,在该数据集中出现问题,任何指示我出错的地方都会非常感激。感谢
类似的问题:Streaming TClientDataSet using Datasnap in Delphi XE6 检查了解决方案,但没有成功
答案 0 :(得分:1)
我花了很多时间来研究将数据作为来自datasnap服务器的流返回的问题 - 参见例如Can't retrieve TStreams bigger than around 260.000 bytes from a Datasnap Server,但无法为流数据提供令人满意的解决方案。
然而,实验表明字符串数据不会出现类似的问题(我测试的字符串高达数百兆字节)。所以,我建议你尝试从Datasnap服务器发送二进制/ blob数据作为Base64编码的字符串。
当然,如果您的ADO或CDS数据的字符串表示足以满足您的需求,那么实现这一目标的一种方法是在服务器方法中执行adsFile.SaveToFile(..., pfXML)
或CDS.SaveToFile(... dfXML)
,然后将生成的文件作为字符串返回。