是否可以拍摄数据集的快照?

LaB*_*cca 2 delphi dataset devart

在我的应用程序中,我只使用DBAware组件(除了一些地方).

我有一个场景,我创建一个主数据集(例如客户),详细数据集(例如订单),子目录数据集(例如订单项).通常我允许用户进行更改(数据集处于浏览模式),然后我发布.简单.

无论如何编辑子数据集我想添加一种简单的撤消功能:一个打开一个表单来编辑数据集(即使用db componets,因此对表单的更改将改变数据集),如果用户取消操作我会喜欢在打开表单之前恢复数据集.

现在为了实现这一点,我可以考虑在一个TClientDataSet或类似的组件中制作数据集的副本,但还有其他技术吗?就像Delphi一样可以轻松地创建数据的"快照".使用伪代码:

MySubDetailDataSet.SaveSnapShot;
SubDetailForm.ShowModal;
if ModalResult = mrCancel then MySubDetailDataSet.RestoreSnapShot;
Run Code Online (Sandbox Code Playgroud)

这样的东西可能是"现成的"Delphi组件吗?

顺便说一句,我使用DevArt组件的SDAC,所以如果你知道一种技术只适用于那些组件而不是Delphi标准组件,那么欢迎!

小智 5

在客户端数据集中,更改存储在增量中 - 您可以调用CancelUpdates来清除增量并恢复为原始数据集.还有其他更细粒度的方法.请参阅帮助中的"撤消更改".

如果您正在使用RDBMS并且在事务中正确,则可以回滚事务.某些数据库提供保存点以回滚到给定的保存点,而不是回滚整个事务,但这是特定于数据库的.事务通常是每个会话,而不是每个表或查询.您必须确保在给定的事务中只执行您可能需要回滚的更改.

客户端数据集可能是一种"更轻松"的方法,因为它们仅管理客户端数据而不需要数据库资源.当您处于数据库内的事务中时,需要一些资源来跟踪它并更改数据.交易应该尽可能长,但不能更长.

还要注意,交易可能意味着某些锁定.锁定管理在数据库与数据库之间可能会有很大不同,有些可能会升级锁定,阻止的用户数量超过需要.始终使用足够数量的并发用户进行测试,以确保正确使用事务.