TCustomClientDataset可以批处理模式应用更新吗?

时间:2011-06-06 17:42:14

标签: delphi dbexpress

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

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

1 个答案:

答案 0 :(得分:1)

不知道是否可以使用TSimpleDataset(从未使用它),但是如果你使用TClientDataset + TDatasetProvider +<把你的数据库数据集放在这里>肯定可以。您可以编写 BeforeUpdateRecord 来自行处理申请流程。基本上,它允许您绕过标准的应用过程,使用对记录所做的更改来访问数据集 delta ,然后使用您自己的代码和组件将更改应用于数据库。例如,您可以调用存储过程来修改数据,依此类推。

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