![](/img/trans.png)
[英]How to return a dataset with nested datasets from datasnap server to client?
[英]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”,以及帶有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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.