数据集的缓冲模式(Cached mode)是将数据库服务器的数据缓冲在客户端内存中进行处理,不再依赖服务器。只有当数据需要提交数据库服务器进行保存时,才将变更数据一次性提交数据库服务器。
数据集缓冲模式的最大优点是减少了对数据库服务器的资源消耗,甚至可以在网络断开的情况下,对数据进行处理然后在网络连接后,提交数据库保存。与传统的2层架构数据库软件相比,有巨大的抗网络故障能力。包PB在内的绝大多数2层架构软件,一旦网络临时中断,导致数据库连接中断,客户端所有未能保存的修改将被丢弃,而在ODAC中这个问题不再存在。
开启数据集缓冲模式非常简单,即设置数据集的CachedUpdates属性为True,如下:
//启动本地缓存模式
TDataSet.CachedUpdates := True;
开启数据集的缓冲模式后,需要代码显性进行以下操作:
1、查看数据集是否有数据变动,当数据集的UpdatesPending属性为True时表示有数据变动。
2、查看数据集当前记录的变动状态,读取数据集的UpdateStatus属性,
3、将数据集缓冲区中的数据提交数据库保存,调用方法ApplyUpdates,在调用该方法前,需要代码显性调用数据库连接组件的事务开启函数,并在提交成功后提交事务,或提交失败后回滚事务。
4、当ApplyUpdates成功后,还需要调用方法CommitUpdates清除缓冲区。这一点与TClientDataSet不同,需要手工清除缓冲区。
5、当ApplyUpdates失败后,需要调用方法RestoreUpdates恢复已经提交的数据状态标志,以便下一次能够正确提交。
6、使用OnUpdateRecord事件来手工处理需要更新的数据,一旦填写了该事件的代码,ODAC将不再自动处理记录,这一点与TDataSetProvider的事件处理不同。
7、使用OnUpdateError事件来处理更新过程中的错误。
典型代码如下:
procedure ApplyButtonClick(Sender: TObject);
begin
with MyQuery do
begin
Session.StartTransaction; //启动数据库事务
try
ApplyUpdates; //修改数据提交数据库
Session.Commit; //没有报错则提交数据库事务
CommitUpdates; //成功提交后清空缓冲区
except
RestoreUpdates; //提交失败,恢复缓冲区数据更新标志
Session.Rollback;//回滚数据库事务
raise; //重新触发异常,显示错误信息
end;
end;
end;