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

时间:2011-10-18 15:53:38

标签: delphi dataset devart

在我的应用程序中,我只使用DBAware组件(除了少数几个地方)。

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

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

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

MySubDetailDataSet.SaveSnapShot;
SubDetailForm.ShowModal;
if ModalResult = mrCancel then MySubDetailDataSet.RestoreSnapShot;

使用Delphi组件可以“现成”吗?

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

4 个答案:

答案 0 :(得分:5)

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

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

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

还要注意事务可能意味着某些锁定。锁管理在数据库与数据库之间可能存在很大差异,有些可能会升级锁,阻止更多用户。始终使用足够数量的并发用户进行测试,以确保正确使用事务。

答案 1 :(得分:1)

AnyDAC中你可以这样做:

var
 iPrevSP: Integer;
...
iPrevSP := MySubDetailDataSet.SavePoint; 
SubDetailForm.ShowModal; 
if ModalResult = mrCancel then 
  MySubDetailDataSet.SavePoint := iPrevSP; 

使用TClientDataSet,kbmMemTable可以访问类似的技术。可能不是答案,因为您正在使用DevArt产品。

答案 2 :(得分:0)

使用DevArt,我将数据复制到TVitualTable(一个TCLientDataSet的DevArt版本),无论如何,SavePoint功能就像AnyDAC一样简单。

答案 3 :(得分:-1)

您可以使用TClientDataset并从文件或流中加载它并将原始数据保存在内部,每次要回滚时,都会从原始数据重新加载。

相关问题