大家好,大家读这篇!希望您能为我的问题提供帮助,但如果没有,谢谢您的尝试。我有DataSnap服务器和客户端。 DataSnap服务器方法可以将DataSet作为函数结果返回给客户端。我正在从带有TFDQuery组件的MySQL DB获取数据。有人请帮助我理解,如何从已经有数据的FDQuery组件中获取数据集?
TDataSet.Data是包含所有数据的OleVariant类型属性。但是FDQuery没有相同的属性。我需要从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;
需要任何有用的信息。提前致谢!祝你有美好的一天!
答案 0 :(得分:2)
最简单的方法是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
”导出为服务器方法所必需的代码。
答案 1 :(得分:0)
您也可以从服务器函数中返回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”,以及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;