ClientDataSet / Provider怪癖还是配置?

时间:2015-07-11 13:19:38

标签: delphi master-detail tclientdataset

我有一个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详细信息的数据中。

顺便说一下,对于这个相当冗长的描述感到抱歉,但我已经尝试过准备 一个SSCCE,它使用代码中填充的一对CDS代替AdoQueries。 但不幸的是,它并没有显示问题行为。

所以,我的问题是,是否有人认识到这种行为并知道可以做些什么 避免它吗? 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和问题 与所有人一起发生。

0 个答案:

没有答案