使用 DataTable.Clone() 保存和还原对数据库的更改

本文关键字:数据库 还原 Clone DataTable 保存 使用 | 更新日期: 2023-09-27 18:36:35

为了提供还原数据库表中发生的更改的能力,我在大量更改之前创建了 DataTable 的Clone()。 用户可以在决定取消更改之前浏览多个表单。 在该过程结束时,如果他们选择取消,我想将 Clone() 的数据更新回数据库。我不确定删除已添加的行然后重新添加原始 Clone()'d 行或更新计划更新的行是否有意义?似乎如果我要更新原始行,我将不得不循环访问以将克隆中的行复制到原始行? 还是有别的办法?

// Clone the original data
cloneDataTable = origDataTable.Clone();
cloneDataTable.ImportRow(dataRow);
// Later in the process, if I need to delete the row
dataRow.Delete();
tableAdapter.Update(dataRow);
// I was considering that I could add the cloned row back in this fashion
origDataTable.ImportRow(cloneDataTable.Rows[0]);
tableAdapter.Update(dataRow);

我可能混淆了这个问题,但基本上正在寻找一种简单有效的方法,在执行一系列插入/更新后将原始 Clone() 的数据恢复到数据库。
理想情况下,我想执行更新,因为数据库插入会导致我想避免的序列值递增。

感谢您的任何帮助,如有必要,请要求任何澄清。

使用 DataTable.Clone() 保存和还原对数据库的更改

实现此类撤消/取消功能的最佳方法是在事务范围内对数据库进行所有直接更改(假设您选择的数据库支持事务),然后根据用户是否希望永久更改来提交或回滚该事务。

使用 DataTable 实现自己的撤消机制不是一个好的计划。

使用事务,进行更改,如果有效,则完成事务

using(TransactionScope ts = new TransactionScope ())
{
//updates, inserts, etc
ts.Complete();
}

如果发生异常或错误,事务将回滚事务范围内的所有

内容

如果您使用的是 SQL Server,则对不起,英语不好!

由于过程的复杂性,我不得不设计自己的解决方案。 感谢那些建议创建交易会起作用的人,但这不是那么简单的解决方案,否则我不会问。问题是用户可以选择要取消的点,但必须全程跟踪和记录状态。 我最终做的是当用户请求保存状态时,我Clone() DataTable 并设置一个 cloned = true 标志。

稍后,如果选择取消,我会将旧与新Merge()

origDataTable.Merge(cloneDataTable);
tableAdapter.Update(origDataTable.Rows[0]);

我希望这对某人有所帮助。 它有点复杂,但适合此应用程序的需求,我喜欢能够维护自己的事务,因为我可以选择何时将状态保存到内存中、写入数据库和还原。当然,对于不同设计中的事务使用某些内置功能可能更容易,但它适用于此应用程序。谢谢你的建议。