博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有关DataTable 的 Merge 操作
阅读量:6389 次
发布时间:2019-06-23

本文共 1799 字,大约阅读时间需要 5 分钟。

      因为WPF项目需要,经常要对DataTable 的操作及回滚,因操作存在于多个窗口及方法间,不适用TransactionScope。
于是想到DataTable的Merge操作。
1):首先创建一个DataTable以便测试
 1 
        
static
 DataTable CreateTestTable()
 2 
        {
 3 
            var dt 
=
 
new
 DataTable();
 4 
            var dc 
=
 
new
 DataColumn(
"
ID
"
typeof
(
int
));
 5 
            dt.Columns.Add(dc);
 6 
            dt.PrimaryKey 
=
 
new
 DataColumn[] { dc };
 7 
            
for
 (var i 
=
 
0
; i 
<
 
10
; i
++
)
 8 
            {
 9 
                var dr 
=
 dt.NewRow();
10 
                dr[dc] 
=
 i;
                    dt.Rows.Add(dr);
11 
            }
12 
            
return
 dt;
13 
        }
很显然,所有的DataRow插入时,RowState 为 Added
因为要回滚,不太适合在原来的DataTable上操作,因此决定创建DataTable的深拷贝。
2):创建DataTable的深拷贝
 1 
  
static
 DataTable CreateDeepCopyOfDataTable(DataTable oldTable)
 2 
        {
 3 
            var ms 
=
 
new
 MemoryStream();
 4 
            BinaryFormatter bf 
=
 
new
 BinaryFormatter();
 5 
            bf.Serialize(ms, oldTable);
 6 
            ms.Seek(
0
, SeekOrigin.Begin);
 7 
            var newTable 
=
 bf.Deserialize(ms) 
as
 DataTable;
 8 
            ms.Close();
 9 
            
return
 newTable;
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

Deleted Deleted

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的变化。

转载于:https://www.cnblogs.com/CsharpFarmer/archive/2009/08/21/1551537.html

你可能感兴趣的文章
Mqtt ----心跳机制
查看>>
180404
查看>>
远程连接身份验证错误,又找不到加密Oracle修正
查看>>
C++三种内存分配方式
查看>>
谷歌为URL缩短服务goo.gl开放API
查看>>
关于delphi 窑洞的关闭
查看>>
测试基础 – 软件测试计划
查看>>
os-cocos2d游戏开发基础-进度条-开发笔记
查看>>
[Hibernate]在VS2010中应用NHibernate 3.2与MySQL
查看>>
Velocity与JSP技术比较
查看>>
硬盘重装Ubuntu12.04的感受
查看>>
jQuery 2.0.3 源码分析 Deferred(最细的实现剖析,带图)
查看>>
Android json操作之取得一个对象
查看>>
Android的历史与花边
查看>>
myeclipse6.0下载及注冊码
查看>>
Android开发之大位图二次採样压缩处理(源码分享)
查看>>
Count Complete Tree Nodes
查看>>
Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持
查看>>
深入理解PHP内核(四)概览-PHP脚本的执行
查看>>
[RxJS] Displaying Initial Data with StartWith
查看>>