【发布时间】:2018-04-14 19:32:32
【问题描述】:
我正在使用 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;
客户端我已经删除了一个客户端数据集组件,并尝试将数据加载到引发问题的这个数据集中,任何能指出我哪里出错的帮助将不胜感激。谢谢
类似问题:Streaming TClientDataSet using Datasnap in Delphi XE6 检查了解决方案,但没有成功
【问题讨论】:
-
阅读你链接的q上的cmets,然后做一些调试,不能重现你的问题的读者不太可能帮到你,所以提供一个MCVE。同时,-1。
-
顺便说一句,您没有检查
ads是否返回任何行。这是故意的吗? -
@MartynA 我检查了服务器端我可以看到它返回行,我什至尝试将数据保存到 xml,它是 204MB。
-
顺便说一句,通过 Datasnap 检索流似乎存在一个长期存在的问题。参见,例如,stackoverflow.com/questions/41854631/…
-
@MartynA 感谢您指出这一点。在 cdsClientFiles.LoadFromStream(StreamData) 之前在客户端添加以下行之后,我能够解决问题 cdsClientFiles.CreateDataSet; cdsClientFiles.关闭;但无法获得更大的数据..