【问题标题】:Add fields to a clientdataset or access it dynamically?向客户端数据集添加字段或动态访问它?
【发布时间】:2016-10-29 10:24:31
【问题描述】:

如果并且可以执行 Cds.FieldByName('field').Value,向 TClientDataset 添加字段有什么意义?

有参考是不是更快? 是不是“更清楚”了?

【问题讨论】:

    标签: delphi tclientdataset


    【解决方案1】:

    问题

    DataSet.FieldByName('field').Value
    

    是一种表演。每次执行此操作时,都会对数据集的字段集合进行串行搜索,以找到具有所需名称的字段。此搜索未以任何方式优化,例如通过使用二进制搜索或散列算法。因此,如果有许多字段和/或您在迭代数据集中的记录时进行此访问,则可能会对性能产生重大影响。

    这是使用对象检查器定义“持久”TFields 的一个原因,但不是唯一一个原因。您可以通过使用编译器已知的符号名称来获取对特定 TField 的引用,这只会在编译时发生一次。所以是的,它比FieldByName 快。看你是否觉得它更清楚了。

    使用持久 TFields 的其他原因包括可以轻松设置计算字段,更重要的是,计算字段不需要通过 FieldByNameOnCalcFields 事件中访问.使用FieldByName 与持久字段的性能损失当然是乘以OnCalcField 事件中引用的字段数,并且OnCalcFields 至少为数据集中的每条记录调用一次,即使您不这样做在您自己的代码中迭代数据集记录。

    上述情况适用于所有 TDataSet 后代,而不仅仅是 TClientDataSets。

    【讨论】:

    • 除了好的答案。有很多属性和事件处理程序可以在设计时为持久字段配置而不会污染源(尽管有些人可能更喜欢后一种显式方式)
    猜你喜欢
    • 2014-02-24
    • 2011-06-23
    • 1970-01-01
    • 2018-02-14
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2015-08-18
    相关资源
    最近更新 更多