作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
各位阅读本文的人大家好!我希望你能帮助我解决我的问题,但如果没有,谢谢你的尝试。我有 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;
需要任何有用的信息。提前致谢!祝你有美好的一天!
最佳答案
据我所知,执行此操作的最简单方法是将 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
作为服务器方法所需的代码。
关于delphi - 如何从DataSnap服务器返回DataSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54503614/
我是一名优秀的程序员,十分优秀!