如何从DataSnap服务器返回DataSet?

时间:2019-02-03 13:58:23

标签: delphi pascal firedac datasnap

大家好,大家读这篇!希望您能为我的问题提供帮助,但如果没有,谢谢您的尝试。我有DataSnap服务器和客户端。 DataSnap服务器方法可以将DataSet作为函数结果返回给客户端。我正在从带有TFDQuery组件的MySQL DB获取数据。有人请帮助我理解,如何从已经有数据的FDQuery组件中获取数据集?

TDataSet.Data是包含所有数据的OleVariant类型属性。但是FDQuery没有相同的属性。我需要从FDQuery中以OleVariant的形式返回数据集。

*从代码中删除了Try,Except,FreeAndNil,DisposeOf等以便更好地理解问题

//Client side
procedure TForm1.GetDataSetFromServer;
var
  Server: TServerMethods1Client;
  DS: TClientDataSet;
begin
  Server := TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);
  DS := TClientDataSet.Create(nil);   
  DS.Data := Server.GetDataSet; //Call remote server method
end;

//DataSnap server side
function TServerMethods1.GetDataSet: OleVariant;
begin
  FDQuery1.Close;
  FDQuery1.SQL.Text := 'SELECT * FROM Table1';
  FDQuery1.Open;
  //Now i need to return all data as function result
  result := ???
end;

需要任何有用的信息。提前致谢!祝你有美好的一天!

2 个答案:

答案 0 :(得分:2)

最简单的方法是AFAIK,是在服务器模块中添加一个TDataSetProvider,以及一个TClientDataSet(如果还没有的话)。

然后,您可以按如下所示修改服务器代码:

function GetDataSet: OleVariant;
begin
  if ClientDataSet1.Active then
    ClientDataSet1.Close;

  FDQuery1.Close;
  FDQuery1.SQL.Text := 'SELECT * FROM Table1';
  //  FDQuery1.Open; Leave this to the DataSetProvider/ClientDataSet

  //Now i need to return all data as function result
  //result := ???

  DataSetProvider1.DataSet := FDQuery1;
  ClientDataSet1.ProviderName := 'DataSetProvider1';
  ClientDataSet1.Open;
  Result := ClientDataSet1.Data;
end;

这样做的目的是TDataSetProvider具有将其DataSet数据(即FDQuery1的数据)打包为可以在ClientDataSet之间发送的格式的所有内部机制。将DataSetProvider集成到服务器中可以最大程度地减少客户端使用CDS数据所需的代码。

顺便说一句,我假设您的服务器模块具有将“ GetDataSet”导出为服务器方法所必需的代码。

答案 1 :(得分:0)

您也可以从服务器函数中返回TDataSet

function TServerMethods1.GetDataSet: TDataSet;
begin
  if ClientDataSet1.Active then
    ClientDataSet1.Close;

  FDQuery1.Close;
  FDQuery1.SQL.Text := 'SELECT * FROM Table1';

  DataSetProvider1.DataSet := FDQuery1;
  ClientDataSet1.ProviderName := 'DataSetProvider1';
  ClientDataSet1.Open;
  Result := ClientDataSet1;
end;

对于客户端,这现在取决于您使用的服务器类型。

如果它是DBX Datasnap Server,则必须在此处使用TsqlServerMethod(注意小写)“ sql”,以及TDataSetProviderTClientDataset的所有配置从该服务器检索数据。

如果它是REST Datasnap服务器,则可以在客户端执行此操作:

procedure TfrmClientMain.btnRefreshClick(Sender: TObject);
var
  Server: TServerMethods1Client;
  lDataSet: TDataSet;
  DSP: TDataSetProvider;
begin
  Server := TServerMethods1Client.Create(ClientModule1.DSRestConnection1);
  try
    CDS.Close; // a TClientDataSet has been placed on the form
    lDataSet := Server.GetDataSet();
    DSP := TDataSetProvider.Create(Self);
    try
      DSP.DataSet := lDataSet;
      CDS.SetProvider(DSP);
      CDS.Open;
    finally
      CDS.SetProvider(nil);
      DSP.Free;
    end;
 finally
   Server.Free;
 end;
end;