在Delphi DataSnap中获取多个嵌套数据集

时间:2016-11-25 07:08:54

标签: delphi datasnap tclientdataset midas-server

我有 Delphi 客户端 - 服务器应用程序,它使用 DataSnap 。 在客户端,我有一系列嵌套的客户端数据集(cdsMaster - > cds1 - > cds2 - > cds3)。

TDM = class(TDataModule)
  cdsMaster: TClientDataSet;
  cdsMaster_cds1: TDataSetField;
  cds1: TClientDataSet;
  cds1_cds2: TDataSetField;
  cds2: TClientDataSet;
  cds2_cds3: TDataSetField;
  cds3: TClientDataSet;
end;

在服务器端,我有一组类似的主数据关系数据集。

TCoDataModule = class(TRemoteDataModule, ICoDataModule)
  prvMaster: TDataSetProvider;
  dsMaster: TIBDataSet;
  ds1: TIBTable;
  ds2: TIBTable;
  ds3: TIBTable;
end;

首先,我需要获取cdsMaster的内容一次(没有详细信息),然后在单个数据包中按需获取完整详细信息cds1的所有嵌套内容,所选主记录的cds2cds3。实现这个的最佳方法是什么?

如果我为poFetchDetailsOnDemand禁用选项prvMaster,它会在connect上加载整个数据库。如果我启用它,它会逐个获取详细信息记录,从而导致巨大的流量开销和性能下降。

1 个答案:

答案 0 :(得分:0)

我个人会添加参数来指示要在主Clientdataset上检索的记录或记录范围,并禁用poFetchDetailsOnDemand,以便它返回主表上那些少数选定记录的完整详细信息。

通过这种方式,您无需逐个获取详细信息,也无法加载整个数据库,只需加载所需的主记录及其所有详细信息。

示例:将主clientdataset sql从 SELECT * FROM COSTUMER 更改为 SELECT * FROM COSTUMER WHERE ID =:ID

PS:如果您还需要完整的主记录列表而没有详细信息,则可以将它们加载到单独的clientdataset中。这样,您可以在网格上显示所有可能的主记录,当用户选择查看详细信息时,您打开第二个clientataset,它会加载完整的主记录(并且只记录该记录)及其所有详细信息。