在我的应用程序中,我只使用 DBAware 组件(少数地方除外)。
我有一个场景,我创建了一个主数据集(例如客户)、详细数据集(例如订单)、子详细数据集(例如订单项目)。通常我允许用户进行更改(数据集处于浏览模式)然后我发布。简单。
无论如何,在编辑子数据集时,我想添加一种简单的撤消功能:如果用户取消操作我想恢复打开表单之前的数据集。
现在为了实现这个,我可以考虑在 TClientDataSet
或类似组件中制作数据集的副本,但是还有其他技术吗?就像使用 Delphi 可以简单地创建数据的“快照”一样。使用伪代码:
MySubDetailDataSet.SaveSnapShot;
SubDetailForm.ShowModal;
if ModalResult = mrCancel then MySubDetailDataSet.RestoreSnapShot;
Delphi 组件是否有可能“现成”的东西?
顺便说一句,我使用来自 DevArt 组件的 SDAC,所以如果您知道一种仅适用于这些组件而不适用于 Delphi 标准组件的技术,欢迎您!
最佳答案
在客户端数据集中,更改存储在增量中 - 您可以调用 CancelUpdates 来清除增量并恢复到原始数据集。还有其他更精细的方法。请参阅帮助中的“撤消更改”。
如果您使用的是 RDBMS 并且正确地处于事务中,则可以回滚事务。一些数据库提供保存点以回滚到给定的保存点而不是回滚整个事务,但这是特定于数据库的。事务通常按 session 进行,而不是按单个表或查询进行。您必须确保在给定事务中只执行您可能需要回滚的更改。
客户端数据集可能是一种“更轻便”的方法,因为它们仅在客户端管理数据并且不需要数据库资源。当您在数据库中处理事务时,需要一些资源来跟踪它和更改的数据。交易的时间应该与要求的一样长,但不能更长。
另请注意,事务可能意味着某些锁。锁管理可能因数据库而异,有些可能会升级锁,阻止比需要更多的用户。始终使用足够数量的并发用户进行测试,以确保正确使用事务。
关于delphi - 是否可以拍摄数据集的快照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7810119/