大家谁读这!我希望你能帮助我与我的问题,但如果没有,谢谢你试试。我有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;
需要能够有帮助的任何信息。提前致谢!祝你今天愉快!
要做到这一点最简单的办法,据我所知,是添加一个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
作为服务器方法所需的代码。
你也可以做回从服务器功能的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;