0

为了提供恢复已在数据库表中发生的更改的能力,我在Clone()大量更改之前创建了一个 DataTable。在决定取消更改之前,用户可以查看多个表单。在流程结束时,如果他们选择取消,我想将 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() 数据恢复回数据库。
理想情况下,我想执行更新,因为数据库插入会导致我想避免的序列值增加。

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

4

3 回答 3

0

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

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

于 2012-06-07T03:11:24.407 回答
0

使用事务,进行更改,并在可行的情况下完成事务

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

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

如果您使用的是 SQL Server,请原谅英语不好!

于 2012-06-07T03:17:38.840 回答
0

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

稍后如果选择取消,我会Merge()从旧到新。

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

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

于 2012-06-07T14:34:44.500 回答