【问题标题】:Can TCustomClientDataset apply updates in a batch mode?TCustomClientDataset 能否以批处理模式应用更新?
【发布时间】:2011-06-06 17:42:14
【问题描述】:

我有一个连接到 Firebird 数据库的 DB Express TSimpleDataset。我刚刚向数据集添加了数千行数据,现在该调用 ApplyUpdates。

不幸的是,这会导致数千次数据库命中,因为它会尝试分别INSERT 每一行。这有点令人失望。我真正希望看到的是数据集生成一个包含数千个INSERT 语句的单个事务,并立即发送整个事务。如果必须,我可以自己设置,但首先我想知道数据集或 DBX 框架中是否有任何内置方法。

【问题讨论】:

  • ClientDataSets,或者更确切地说,DataSetProviders 仅在没有打开的事务时才开始事务 (.SqlConnection.BeginTransaction)。不过我有点困惑,我认为“ApplyUpdates”只启动了“一个”交易。
  • @Sertac: 不确定——我没有仔细研究过——但我知道如果我只是调用 ApplyUpdates,它最终会发送每个 INSERT 声明单独,这会增加大量开销并严重减慢速度。我基本上是想在这里获得批量插入工作。
  • 好的,那么与事务无关..据我所知,最终,“DataSetProvider”的“CustomResolver”的“UpdateTree”循环通过“Delta”生成语句每条记录。我看不出有什么出路..

标签: delphi dbexpress


【解决方案1】:

不知道 TSimpleDataset 是否可能(从未使用过),但如果您使用 TClientDataset + TDatasetProvider + ,您肯定可以。您可以编写一个 BeforeUpdateRecord 来自己处理申请过程。基本上,它允许您绕过标准的应用流程,访问数据集delta,并对记录进行更改,然后使用您自己的代码和组件将更改应用到数据库。比如你可以调用存储过程来修改数据等等。

但是,事务和所谓的“数组 DML”、“批量插入”等是有区别的。即使您使用单个事务(并且“应用”AFAIK 发生在单个事务中),在事务中您可能仍需要发送“n”个 INSERT。一些数据库支持发送带有要插入的参数数组的单个 INSERT(或更新、删除)的方式,从而减少要使用的单个语句的数量 - 但这可能是特定于数据库的,AFAIK dbExpress/Datasnap 不支持它 - 您仍然可以使用 BeforeUpdateRecord 事件来利用特定的数据库功能。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2011-11-17
    • 2011-09-10
    相关资源
    最近更新 更多