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
“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用