我有 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
的所有嵌套内容,所选主记录的cds2
,cds3
。实现这个的最佳方法是什么?
如果我为poFetchDetailsOnDemand
禁用选项prvMaster
,它会在connect上加载整个数据库。如果我启用它,它会逐个获取详细信息记录,从而导致巨大的流量开销和性能下降。
答案 0 :(得分:0)
我个人会添加参数来指示要在主Clientdataset上检索的记录或记录范围,并禁用poFetchDetailsOnDemand,以便它返回主表上那些少数选定记录的完整详细信息。
通过这种方式,您无需逐个获取详细信息,也无法加载整个数据库,只需加载所需的主记录及其所有详细信息。
示例:将主clientdataset sql从 SELECT * FROM COSTUMER 更改为 SELECT * FROM COSTUMER WHERE ID =:ID
PS:如果您还需要完整的主记录列表而没有详细信息,则可以将它们加载到单独的clientdataset中。这样,您可以在网格上显示所有可能的主记录,当用户选择查看详细信息时,您打开第二个clientataset,它会加载完整的主记录(并且只记录该记录)及其所有详细信息。