簡體   English   中英

如何從DataSnap服務器返回DataSet?

[英]How to return DataSet from DataSnap server?

大家好,大家讀這篇! 希望您能為我的問題提供幫助,但如果沒有,謝謝您的嘗試。 我有DataSnap服務器和客戶端。 DataSnap服務器方法可以將DataSet作為函數結果返回給客戶端。 我正在從帶有TFDQuery組件的MySQL DB獲取數據。 請有人幫我理解,如何從已經有數據的FDQuery組件中獲取數據集?

TDataSet.Data是包含所有數據的OleVariant類型屬性。 但是FDQuery沒有相同的屬性。 我需要從FDQuery中以OleVariant的形式返回數據集。

*嘗試將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;

需要任何有用的信息。 提前致謝! 祝你今天愉快!

最簡單的方法是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作為服務器方法所必需的代碼。

您也可以從服務器函數返回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使用TsqlServerMethod (注意小寫)“ sql”,以及帶有TClientDatasetTDataSetProvider ,所有這些都已預先配置為從該服務器檢索數據。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM