如何从 DataSnap 服务器 return DataSet?

How to return DataSet from DataSnap server?

大家好!我希望你能帮助我解决我的问题,但如果不能,谢谢你的尝试。我有 DataSnap 服务器和客户端。 DataSnap 服务器方法可以 return 将数据集作为函数结果发送给客户端。我使用 TFDQuery 组件从 MySQL DB 获取数据。有人请帮助我理解,如何从已有数据的 FDQuery 组件中获取数据集?

TDataSet.Data 是包含所有数据的 OleVariant 类型 属性。但是 FDQuery 没有相同的 属性。我需要 return 来自 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;

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

据我所知,执行此操作的最简单方法是向服务器模块添加一个 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 数据所需的代码。

顺便说一句,我假设您的服务器模块具有 'export' GetDataSet 作为服务器方法所需的代码。

您还可以从服务器函数执行 return a 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;