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

时间:2012-06-07 02:41:18

标签: c# .net datatable strongly-typed-dataset

为了能够还原数据库表中发生的更改,我在大量更改之前创建了Clone() DataTable。在决定取消更改之前,用户可以通过多种形式。在过程结束时,如果他们选择取消,我想将Clone()'d数据更新回数据库。 我不确定删除已添加的行是否有意义,然后添加回原始的Clone()行,或者更新计划更新的行? 似乎如果我要更新原始行,我将不得不循环以将行从克隆复制到原始行?或者还有另一种方式吗?

// 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()数据恢复回数据库。
理想情况下,我想执行更新,因为数据库插入导致序列值增加,我想避免。

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

3 个答案:

答案 0 :(得分:0)

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

使用DataTable实现roll-your-own撤消机制不是一个好计划。

答案 1 :(得分:0)

使用交易,进行更改并完成交易(如果有效)

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

如果发生异常或错误,事务将在transactionScope内部回滚

如果你使用的是SQL Server 抱歉英文不好!

答案 2 :(得分:0)

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

稍后如果选择取消,我会将Merge()旧版本添加到新版本。

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

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