DataTable RejectChanges 不会重置所有更改

Posted

技术标签:

【中文标题】DataTable RejectChanges 不会重置所有更改【英文标题】:DataTable RejectChanges does not reset all changes 【发布时间】:2013-07-12 12:18:23 【问题描述】:

我在强类型数据集中的 DataTable 中添加了几行,并使用 TableAdapterManager 将更改插入到我的数据库中。使用 TableAdapterManager 的 UpdateAll 函数会导致所有插入行的数据库回滚失败。不幸的是,DataTable.RejectChanges 不会“回滚”DataTable 中的相同行。 在对 DataTable.RejectChanges 方法的调用中,仅从 DataTable 中删除最后一行。我希望 DataSet 与数据库具有相同的状态。 不是 MSDN 文档中的 RejectChanges 会删除所有新的(未提交的)行吗?我做错了吗?

我的代码:

foreach (var item in List)

   DataSet.customerRow custRow = ds.customer.NewcustomerRow();
   custRow.name = item.Name;
   try
                            
       ds.customer.AddcustomerRow(custRow);   
   
   catch (Exception ex)
   
       ProcessException(ex, System.Reflection.MethodBase.GetCurrentMethod().Name);
       valid=false;
                      

if (valid)

    DataSetTableAdapters.TableAdapterManager adapterManager = new DataSetTableAdapters.TableAdapterManager();                    
    adapterManager.customerTableAdapter = new DataSetTableAdapters.customerTableAdapter();                    
    try
                            
        retryPolicy.ExecuteAction(() =>
            
            adapterManager.UpdateAll(ds);
            );
    
    catch (Exception ex)
                           
        ds.customer.RejectChanges();
    

else

    ds.customer.RejectChanges();                     
      

【问题讨论】:

看来我得设置adapterManager.BackupDataSetBeforeUpdate = true;然后通过调用 RejectChanges 将新行从 DataSet 中删除。是否存在性能问题?为什么我需要额外的步骤?有什么想法吗? 【参考方案1】:

解决办法是设置adapterManager.BackupDataSetBeforeUpdate = true;这会创建数据集的内部备份副本,以便在发生故障时“重用”。

MSDN: Hierarchical Update Overview

“备份副本仅在执行 TableAdapterManager.UpdateAll 方法期间位于内存中。因此,无法以编程方式访问此备份数据集,因为它要么替换原始数据集,要么一旦 TableAdapterManager 超出范围。 UpdateAll 方法已完成运行。”

【讨论】:

以上是关于DataTable RejectChanges 不会重置所有更改的主要内容,如果未能解决你的问题,请参考以下文章

怎么让datagridview不自动修改绑定的datatable

关于c#中的datatable,不知道如何清空里面的数据

怎么获取datatable指定行的数据,不指定列

为啥dataTable不显示空数据消息?

“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用

动态追加DataTable而不刷新页面