为了能够还原数据库表中发生的更改,我在大量更改之前创建了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()数据恢复回数据库。
理想情况下,我想执行更新,因为数据库插入导致序列值增加,我想避免。
感谢您的帮助,如有必要请提出任何澄清。
答案 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]);
我希望这有助于某人。它有点复杂,但适合这个应用程序的需要,我喜欢有能力维护自己的事务,因为我可以选择何时将状态保存到内存,写入数据库,还原。 当然,对于不同设计中的事务,这可能更容易使用一些内置功能,但它适用于此应用程序。 谢谢你的建议。