2016-11-25 94 views
0

我有Delphi客户端 - 服务器应用程序使用DataSnap。 在客户端,我有一个嵌套的客户端数据集链(cdsMaster - >cds1 - >cds2 - >cds3)。在Delphi DataSnap中获取多个嵌套数据集

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

在服务器端,我有一组与master-detail关系相似的数据集。

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

首先,我需要一次读取的cdsMaster含量(无详细信息),然后在单个数据包(选定主记录的cds1所有嵌套内容,cds2cds3)需求获取全部细节。实现这个最好的方法是什么?

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

回答

0

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

这样你不会一个接一个地读取细节,也不会加载整个数据库,只加载所需的主记录和所有的细节。

示例:从COSTUMER从类似SELECT *改变你师父的ClientDataSet SQL喜欢的东西SELECT * FROM COSTUMER WHERE ID =:ID

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