2

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

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

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

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

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

Delphi 组件是否可能“现成”这样的东西?

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

4

4 回答 4

5

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

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

客户端数据集可能是一种“更轻松”的方法,因为它们仅在客户端管理数据,不需要数据库资源。当您在数据库内进行事务时,需要一些资源来跟踪它和更改的数据。交易时间应与要求一样长,但不能更长。

还要注意,事务可能意味着一些锁。锁管理可能因数据库而异,有些可能会升级锁,阻塞比需要更多的用户。始终使用足够数量的并发用户进行测试,以确保正确使用事务。

于 2011-10-18T16:00:58.753 回答
1

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

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

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

于 2011-10-18T16:55:01.183 回答
0

使用 DevArt,我管理将数据复制到 a TVitualTable(a 的 DevArt 版本TCLientDataSet),无论如何,像 AnyDAC 中那样简单的 SavePoint 功能不存在。

于 2011-10-28T10:07:43.207 回答
-1

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

于 2015-06-15T10:14:29.597 回答