Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DataTable.Clone()保存和还原对数据库的更改_C#_.net_Datatable_Strongly Typed Dataset - Fatal编程技术网

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

C# 使用DataTable.Clone()保存和还原对数据库的更改,c#,.net,datatable,strongly-typed-dataset,C#,.net,Datatable,Strongly Typed Dataset,为了提供恢复数据库表中发生的更改的能力,我在大量更改之前创建了DataTable的克隆。在决定取消更改之前,用户可以查看许多表单。在过程结束时,如果他们选择取消,我希望将克隆数据更新回数据库。 我不确定删除已添加的行,然后再添加回原始克隆行,或者更新计划更新的行是否有意义? 似乎如果我要更新原始行,我必须循环将行从克隆复制到原始行?还是有别的办法 // Clone the original data cloneDataTable = origDataTable.Clone(); cloneDat

为了提供恢复数据库表中发生的更改的能力,我在大量更改之前创建了DataTable的克隆。在决定取消更改之前,用户可以查看许多表单。在过程结束时,如果他们选择取消,我希望将克隆数据更新回数据库。 我不确定删除已添加的行,然后再添加回原始克隆行,或者更新计划更新的行是否有意义? 似乎如果我要更新原始行,我必须循环将行从克隆复制到原始行?还是有别的办法

// 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);
我可能混淆了这个问题,但我基本上是在寻找一种简单有效的方法,在执行一系列插入/更新之后,将原始克隆数据恢复回数据库。 理想情况下,我希望执行更新,因为数据库插入会导致我希望避免的序列值递增


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

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


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

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

using(TransactionScope ts = new TransactionScope ())
{
//updates, inserts, etc
ts.Complete();
}
如果发生异常或错误,事务将回滚transactionScope内部的所有事务

如果您使用的是SQL Server,则会出现此问题
对不起,英语不好

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

稍后,如果选择了取消,我会将旧的合并到新的

origDataTable.Merge(cloneDataTable);
tableAdapter.Update(origDataTable.Rows[0]);
我希望这对某人有帮助。它有点复杂,但适合此应用程序的需要,我喜欢能够维护自己的事务,因为我可以选择何时将状态保存到内存、写入数据库和恢复。 诚然,在不同的设计中使用某些内置功能进行事务处理可能更容易,但它适用于此应用程序。
谢谢你的建议。

设计就是这样。每个表单在整个流程中提交更改,因此我现在没有选择。您仍然有选择。即使您在不同的时间以不同的形式对数据库进行更改,您仍然可以在单个事务的范围内进行所有这些更改。您不能像Elviejo建议的那样使用using block语法,但这只是一个小小的方便。您试图做的事情正是事务的用途;我觉得有必要再次强调,使用DataTables滚动您自己的机制不是一个好主意。您正在浪费15分钟的工作来启用事务的使用。。。。。。因此,您可以花更多的时间让这种数据表方法无法很好地工作。更新发生在一组表单、类和帖子上,等等。我实际上无法将其封装在这种结构中。如何将数据表存储在内存中,并在最终使用时进行插入和更新?然后,您必须使用一个事务,然后进行所有插入、更新等操作。您需要一个有效的方法,修改数据库,然后再次修改以回滚根本没有效率,对于许多事情,如创建连接,每个操作执行两次do和rollback。。我认为,如果可能的话,根据事务调整代码将是最好的选择