【问题标题】:Getting "Missing Data Provider or Data Packet" error - Exhange data as stream within clientdataset出现“缺少数据提供者或数据包”错误 - 将数据交换为客户端数据集中的流
【发布时间】: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.关闭;但无法获得更大的数据..

标签: delphi delphi-xe datasnap


【解决方案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),然后返回结果文件作为一个字符串。

【讨论】:

  • 我接受这个答案,但是这会导致服务器端内存不足。我能够在数据集级别从服务器端获取任务,其中将主键的引用保留在一个数据集中,然后在每次迭代时导出一个带有来自另一个数据集的 blob 数据的文件。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多