如何从DataSnap服务器返回的数据集?

问题描述 投票:1回答:2

大家谁读这!我希望你能帮助我与我的问题,但如果没有,谢谢你试试。我有DataSnap服务器和客户端。 DataSnap服务器方法可以返回到客户端的数据集作为函数的结果。我是从MySQL数据库与TFDQuery组件中获取数据。有人请帮我明白了,我怎么可以从已有的数据FDQuery组件的数据集?

TDataSet.Data是包含所有数据OleVariant类型属性。但FDQuery不具有相同的属性。我需要从FDQuery作为OleVariant在函数返回的数据集。

*尝试,除非,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;

需要能够有帮助的任何信息。提前致谢!祝你今天愉快!

delphi pascal firedac datasnap
2个回答
2
投票

要做到这一点最简单的办法,据我所知,是添加一个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拥有所有必要的内部机械的形式,可以ClientDataSets之间被发送到打包其数据集的数据(即FDQuery1的数据)。结合在服务器DataSetProvider的最小化的代码必要在客户端以消耗CDS数据。

顺便说一句,我假设你的服务器模块有“出口” GetDataSet作为服务器方法所需的代码。


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服务器,你将不得不使用一个TsqlServerMethod(注意小写)“SQL”在这里,并用TDataSetProvider一个TClientDataset,所有预先配置为从服务器获取数据。

如果是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;
© www.soinside.com 2019 - 2024. All rights reserved.