3

我有一个TTable(实际上是一个 UniDac TUniTable),它具有表字段以及来自另一个表(Mysql)的 2 个查找字段。我已经设置了正确的索引并且表加载非常快。问题是当我手动编辑一个字段时

Table1.FieldByName('discount_value').AsInteger := 10;

每次即使没有Post()执行此命令,它也会非常缓慢。如果我删除 2 个查找字段,一切都很好 - 它超级快。

看起来,即使在 Post() 执行之前,查找字段也会以某种方式加载到每个记录编辑中。

有什么方法可以防止这种情况或以某种方式检索查找字段一次然后缓存而不一次又一次加载?

4

2 回答 2

2

您可以试验TField.LookupCache属性,该属性控制查找字段的值是否被缓存。

确定每次数据集中的当前记录更改时是否缓存或动态查找查找字段的值。

将 LookupCache 设置为 true 以在 LookupDataSet 不太可能更改且不同查找值的数量很少时缓存查找字段的值。缓存查找值可以提高性能,因为在打开 DataSet 时会预加载每组 LookupKeyFields 值的查找值。当 DataSet 中的当前记录发生变化时,字段对象可以在缓存中定位其 Value,而不是访问 LookupDataSet。如果 LookupDataSet 位于访问速度较慢的网络上,这种性能改进尤其显着。

上面链接的文档中提供了更多信息,包括有关一些性能注意事项和在运行时手动刷新 LookupList 的信息。

于 2015-06-03T18:01:05.993 回答
0

在 Embarcadero WiKi 中,AutoCalcFields必须设置为False才能计算,然后才打开记录。

http://docwiki.embarcadero.com/Libraries/XE6/en/Data.DB.TDataSet.AutoCalcFields

AutoCalcFields为 False 时,会重新计算查找字段,并且仅在以下情况下才会发生 OnCalcFields 事件:
* 打开数据集。
* 数据集进入 dsEdit 状态。
* 从数据库中检索一条记录。

于 2015-06-03T17:57:07.340 回答