【问题标题】:Using DataTable.Clone() to save and revert changes to a database使用 DataTable.Clone() 保存和恢复对数据库的更改
【发布时间】:2012-06-07 02:41:18
【问题描述】:

为了能够恢复数据库表中发生的更改,我在大量更改之前创建了 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() 数据恢复回数据库。
理想情况下,我想执行更新,因为数据库插入会导致序列值增加,我想避免。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 设计就是这样。每个表单都会在整个过程中提交更改,因此我当时别无选择。
    • 你还有选择的余地。即使您在不同时间以不同形式向数据库写入更改,您仍然可以在单个事务的范围内进行所有这些更改(您不能使用 using 块语法与 ElVieejo 建议的那样,但无论如何,这只是一个小小的便利。你想做的事情是正是事务的用途;我觉得有必要重新强调滚动你自己的机制这使用 DataTables 不是一个好主意。您浪费了 15 分钟的工作(以启用事务)...
    • ... 这样您就可以花更多时间让这种 DataTable 方法无法正常工作。
    【解决方案2】:

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

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

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

    如果您使用的是 SQL Server 抱歉英语不好!

    【讨论】:

    • 更新发生在一组表单、类和帖子等上。我实际上无法将它包装在这种结构中。
    • 如何在内存中保存数据表,并在最终使用时进行插入和更新?然后你必须使用一个事务,然后进行所有的插入、更新等。您要求一种有效的方法,并修改数据库,然后再次修改为“回滚”根本没有效率,对于创建连接等许多事情,每个操作执行两次(执行和回滚).. 我认为调整您的代码交易将是最好的选择(如果可能的话)
    【解决方案3】:

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

    稍后如果选择取消,我将旧的Merge() 进行新的操作。

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多