Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否可以拍摄数据集的快照?_Delphi_Dataset_Devart - Fatal编程技术网

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

Delphi 是否可以拍摄数据集的快照?,delphi,dataset,devart,Delphi,Dataset,Devart,在我的应用程序中,我只使用DBAware组件(少数地方除外) 我有一个场景,其中我创建了一个主数据集(例如客户)、详细数据集(例如订单)、子详细数据集(例如订单项)。通常,我允许用户进行更改(数据集处于浏览模式),然后发布。简单 无论如何,在编辑子数据集时,我想添加一种简单的撤消功能:打开一个表单来编辑数据集(即使用db componets,因此对表单的更改将更改数据集),如果用户取消操作,我希望恢复数据集在打开表单之前的状态 现在为了实现这一点,我可以考虑在TClientDataSet或类似组

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

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

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

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

MySubDetailDataSet.SaveSnapShot;
SubDetailForm.ShowModal;
if ModalResult = mrCancel then MySubDetailDataSet.RestoreSnapShot;
Delphi组件有可能“现成”吗


顺便说一句,我使用DevArt组件的SDAC,因此如果您知道一种仅适用于这些组件而不适用于Delphi标准组件的技术,那么欢迎使用

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

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

客户机数据集可能是一种“更轻”的方法,因为它们只在客户端管理数据,不需要数据库资源。当您处于数据库内的事务中时,需要一些资源来跟踪它和更改的数据。事务的长度应与所需的长度相同,但不能更长

还要注意,事务可能意味着某些锁。不同数据库的锁管理可能会有很大的不同,有些数据库可能会升级锁,从而阻止超过需要的更多用户。始终使用足够数量的并发用户进行测试,以确保正确使用事务。

在中,您可以执行以下操作:

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

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

使用DevArt,我可以将数据复制到
TVitualTable
(TCLientDataSet的DevArt版本),无论如何,没有任何DAC中那样简单的保存点功能。

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