【问题标题】:Streaming TClientDataSet using Datasnap in Delphi XE6在 Delphi XE6 中使用 Datasnap 流式传输 TClientDataSet
【发布时间】:2016-06-08 21:21:26
【问题描述】:

我正在尝试使用 Delphi XE6 中的 Datasnap 流式传输 TClientDataSet。但是,我在客户端代码上不断收到“缺少数据提供程序或数据包”错误。

//客户端

procedure TForm2.Button1Click(Sender: TObject);
var
 CDS: TClientDataSet;
 S: TStream;
begin
  CDS := TClientDataSet.Create(nil);
  try
    S:= ClientModule1.ServerMethods1Client.getCDSData;
    S.Seek(0,soFromBeginning);
    S.Position:= 0;
    CDS.LoadFromStream(S);
    CDS.Open; // Missing Data Provider or Data Packet
  finally
    CDS.Free;
  end;
end;

//服务器

function TServerMethods1.getCDSData: TStream;
var
  Writer: TBinaryWriter;
  CDS: TClientDataSet;
  I: Integer;
begin
  result := TMemoryStream.Create;
  CDS := TClientDataSet.Create(nil);
  with CDS.FieldDefs do
  begin
    Clear;
    Add('First', ftString, 20);
    Add('Last', ftString, 25);
  end;
  CDS.CreateDataSet;
  CDS.Open;
  CDS.AppendRecord(['John', 'Smith']);
  CDS.AppendRecord(['Jane', 'Doe']);
  try
    CDS.SaveToStream(result);
  finally
    CDS.Free;
  end;
end;

我也尝试将其作为 XML 流而不是二进制流

  CDS.SaveToStream(result, dfXML);

遇到同样的错误

“缺少数据提供者或数据包”

回答:

CDS.SaveToStream(result);
Result.Position := 0; //need this in server method "getCDSData"

【问题讨论】:

  • CDS.First; while not CDS.Eof do CDS.Next 循环的目的是什么,它什么也没做?
  • 如果我将 getCDSData 设置为 TForm 本地,则不会发生错误并且数据传输正常。所以我认为你需要看看你的服务器。您是否尝试在调试器下运行服务器,同时执行 getCDSData?
  • 你看过这个例子吗,它直接通过服务器方法返回一个TDataSet? sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/…
  • 嗨 MartynA,是的,我也测试过,你是对的,当所有代码都放在客户端单元中时,流似乎工作得很好。
  • ahhh,事实证明,在服务器端方法“getCDSData”中,我需要一个 Result.Position := 0 在 Save to Stream 之后。我会更新上面的代码

标签: delphi datasnap


【解决方案1】:
CDS.SaveToStream(result);
Result.Position := 0; 

【讨论】:

  • 我在客户端代码上遇到“缺少数据提供程序或数据包”错误我尝试了上面给出的解决方案仍然无法正常工作。对此的任何 cmet 将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2022-06-14
相关资源
最近更新 更多