有关DataTable 的 Merge 操作

因为WPF项目需要,经常要对DataTable 的操作及回滚,因操作存在于多个窗口及方法间,不适用TransactionScope。

于是想到DataTable的Merge操作。

1):首先创建一个DataTable以便测试
  1. 1        static DataTable CreateTestTable()
  2. 2        {
  3. 3            var dt = new DataTable();
  4. 4            var dc = new DataColumn("ID", typeof(int));
  5. 5            dt.Columns.Add(dc);
  6. 6            dt.PrimaryKey = new DataColumn[] { dc };
  7. 7            for (var i = 0; i < 10; i++)
  8. 8            {
  9. 9                var dr = dt.NewRow();
  10. 10                dr[dc] = i;
  11.                     dt.Rows.Add(dr);
  12. 11            }
  13. 12            return dt;
  14. 13        }
复制代码
很显然,所有的DataRow插入时,RowState 为 Added

因为要回滚,不太适合在原来的DataTable上操作,因此决定创建DataTable的深拷贝。

2):创建DataTable的深拷贝
  1. 1  static DataTable CreateDeepCopyOfDataTable(DataTable oldTable)
  2. 2        {
  3. 3            var ms = new MemoryStream();
  4. 4            BinaryFormatter bf = new BinaryFormatter();
  5. 5            bf.Serialize(ms, oldTable);
  6. 6            ms.Seek(0, SeekOrigin.Begin);
  7. 7            var newTable = bf.Deserialize(ms) as DataTable;
  8. 8            ms.Close();
  9. 9            return newTable;
  10. 10        }
复制代码
我们创建一份原有数据的Copy

所有的操作都作用在新产生的DataTable上,现在不用考虑回滚的问题了,因为新表与旧表没有任何关系了。

当我们要保存操作时,这时候可以用到Merge了,(如果表没有主键,此方法行不通)

让我们看一下行合并时RowState的变化(经自己测试)


原表RowState
oldTable
拷贝RowState
newTable
合并后的oldTable 
RowState
oldTable.Merge(newTable);
Added
Added,Modified,UnChanged
Added
Added
Deleted
Deleted
Modified
Added,Modified,UnChanged
Modified
Modified
DeletedDeleted
UnChanged
Added,Modified,UnChanged
Modified
UnChanged
Deleted
Deleted



现在的问题是当我们Delete(Row.Delete();)掉DataTable中的一行时,如果这一行原先的状态为Added时,他的状态会变成Detached,表示这一行已经从DataTable.Rows中删掉了,相当于DataTable.Rows.Remove(row);而DataRow.Delete() 只是改变DataRow 的RowState.并没有将DataRow 从DataTable的Rows集合中去除。

这个时候,假如原表中有一行为Added.而拷贝的表中这一行执行了Delete之后,这一行的RowState会变成Detached,当合并时,原表里的这一行因为找不到任何匹配的主键,所以不会发行变化,从而导致合并后的数据不正确。

解决方法很简单,在拷贝的表执行Row.Delete的时候,将其RowState设为UnChanged.(调用AcceptChagnes方法)然后再执行Row.Delete();

本文并非要给出一个好的方法来实现DataTable 的回滚,而是分析对DataRow操作时,其RowState的变化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值