获取“缺少数据提供程序或数据包”错误 - 在clientdataset中将数据更改为流

时间:2017-11-02 10:07:26

标签: delphi delphi-xe datasnap

我正在使用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 检查了解决方案,但没有成功

1 个答案:

答案 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),然后将生成的文件作为字符串返回。