0

我在强类型数据集中的 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();                     
}      
4

1 回答 1

0

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

MSDN:分层更新概述

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

于 2013-07-31T06:30:30.593 回答