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

Delphi 如何从DataSnap服务器返回数据集?,delphi,pascal,firedac,datasnap,Delphi,Pascal,Firedac,Datasnap,各位读者好!我希望你能帮助我解决我的问题,但如果没有,谢谢你的尝试。我有DataSnap服务器和客户端。DataSnap服务器方法可以将DataSet作为函数结果返回给客户端。我使用TFDQuery组件从MySQL数据库获取数据。有人请帮助我理解,如何从FDQuery组件中获取已经有数据的数据集 数据是包含所有数据的OleVariant类型属性。但是FDQuery没有相同的属性。我需要从FDQuery返回一个数据集作为函数中的OleVariant *尝试从代码中删除、Exception、Free

各位读者好!我希望你能帮助我解决我的问题,但如果没有,谢谢你的尝试。我有DataSnap服务器和客户端。DataSnap服务器方法可以将DataSet作为函数结果返回给客户端。我使用TFDQuery组件从MySQL数据库获取数据。有人请帮助我理解,如何从FDQuery组件中获取已经有数据的数据集

数据是包含所有数据的OleVariant类型属性。但是FDQuery没有相同的属性。我需要从FDQuery返回一个数据集作为函数中的OleVariant

*尝试从代码中删除、Exception、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;

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

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拥有将其数据集的数据(即FDQuery1的数据)打包成可以在ClientDataSet之间发送的形式所需的所有内部机制。将DataSetProvider合并到服务器中可以最大限度地减少客户端使用CDS数据所需的代码


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

您也可以从服务器函数返回
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',以及带有
TClientDataset
TDataSetProvider
,所有这些都经过预配置以从该服务器检索数据

如果是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;

谢谢你,nolaspeaker,这个提示非常有用。