我有一个master-detail项目,它使用一对或TAdoQueries来检索 Master和Detail行,以及通过它们连接的一对TClientDataSets TDataSetProviders,它表现出一些不寻常的行为。
两个源表中都有几行k行。在详细AdoQuery上我做了
select * from Details
而不是
select * from Details where MasterID = :MasterID
因为MasterID =:MasterID使得打开CDS非常慢,因为当打开Master CDS时,它会导致从服务器逐个检索Detail行,这需要几秒钟。
相反,CDS Master& amp;详细信息在"客户端"侧 通过其MasterDataSource,IndexFieldNames& amp;将CDS Detail链接到CDS Master。 Params [0],其名称设置为Master ID字段名称MasterID。 (我想CDS的常规用户将完全熟悉 这种设置主 - 细节关系的方法。)
这很好用,除了我注意到滚动CDS Master时到达某些特定Master行时会有明显的延迟。
一些调查显示:
有问题的行在“详细信息”表格中没有对应的行。
对于Master中的那些行,CDS详细信息上的MasterChanged事件 导致全部从详细AdoQuery中检索行。因此 延迟我注意到了,但更糟糕的是,这些行被附加到详细信息CDS中 数据。最终结果是做的主行 对应细节,细节CDS累积了Master的副本 详细信息行作为已访问但没有的主行数 对应的详细信息行(因为每次访问没有详细信息的主行时,整个详细信息AdoQuery数据的另一个副本将附加到CDS详细信息的数据中。
所以,我的问题是,是否有人认识到这种行为并知道可以做些什么 避免它吗? Fwiw,如果我添加以下代码
,则不会出现此问题type
TMyCDS = class(TClientDataSet);
procedure TForm1.LocalDetailBeforeGetRecords(Sender: TObject; var OwnerData:
OLEVariant);
begin
if VarIsEmpty(LocalDetail.Params[0].Value) then
TMyCDS(LocalDetail).ProviderEOF := True;
但我无法想到我错过了配置步骤 使这段代码不必要。
Fwiw,我已经尝试过XE8的Midas.Dll版本,回到D7和问题 与所有人一起发生。