2011-06-06 110 views
3

我有一个DB Express TSimpleDataset连接到Firebird数据库。我刚刚添加了数千行数据到数据集,现在是时候调用ApplyUpdates了。TCustomClientDataset可以在批处理模式下应用更新吗?

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

+0

ClientDataSets,或者说,DataSetProviders只有在没有打开的事务时才会启动事务('.SqlConnection.BeginTransaction')。尽管我有点困惑,但我认为'ApplyUpdates'只能启动'one'交易。 – 2011-06-06 19:01:49

+0

@Sertac:对此没有把握 - 我没有对它进行太多的研究 - 但我确实知道,如果我只是调用ApplyUpdates,它会逐个发送每个“INSERT”语句,这会增加大量的开销并严重降低了速度。我基本上试图在这里获得批量插入作业。 – 2011-06-06 19:09:05

+0

好吧,与交易无关然后..据我可以追踪,最终,“DataSetProvider”的'CustomResolver'的'UpdateTree'循环通过'Delta'为每条记录生成一个语句。我看不出有什么办法.. – 2011-06-06 19:29:56

回答

0

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

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

相关问题