C# 数据集 DataRow.RowState 属性深入分析

1.RowState 介绍

RowState 是DataRow很重要的一个属性, 表示DataRow当前的状态. RowState 有 Added, Modified, Unchanged, Deleted, Detached 几种, 分别表示DataRow被添加, 修改, 无变化, 删除, 从表中脱离. 在调用一些方法或者进行某些操作之后, 这些状态可以相互转化.

DataAdapter可以根据 RowState 来决定如何影响数据库等存储位置. 如果DataRow的状态为 Added,DataAdapter将把DataRow添加到数据库等存储位置, 对于 Modified, Deleted 则将执行更新和删除操作. 其实, 最终的操作效果还是决定于DataAdapter的 SelectCommand, UpdateCommand 等DbCommand. 如果, 在 UpdateCommand 中写入 Delete 语句或者执行有删除操作的存储过程, 那么状态为 Modified 的DataRow最终将在数据库中删除而不是更新.(注: 下文中所说的 DataAdapter 操作均如此.)

2.从不同位置载入 DataRow 后 RowState 的状态

a. 从xml文件或者使用DataTable.Rows.Add(params object[])方法添加的DataRow的 RowState 为 Added.
使用上面方式增加的DataRow, 如果使用DataAdapter更新, 将执行 insert 操作, 例如: 添加到 sql server 数据库中.

b. 如果DataAdapter.AcceptChangesDuringFill 属性为true, 使用DataAdapter.Fill 方法填充的DataRow的 RowState 为 Unchanged, 否则, 为 Added, 默认 AcceptChangesDuringFill 为true.
例如: 默认情况下, 从 sql server 数据库读取的DataRow, 然后直接使用DataAdapter更新的话, 是不会有任何数据被修改的, 因为DataAdapter不对状态为 Unchanged 的DataRow执行任何操作.

3.修改, 更改, 删除后的 DataRow.RowState 转化

a. 对于状态为 Unchanged 或者 Modified 的DataRow, 修改数据后的状态为 Modified.
这表示DataRow需要将自己的数据通过DataAdapter更新回数据库等存储位置. 因为,DataRow中的数据可能已经和自己先前的版本不同.

b. 对于状态为 Added 的DataRow, 修改数据后仍然为 Added.
DataAdapter对状态为 Added 的DataRow将执行添加操作. 很明显, 即使修改DataRow仍然应该保持状态为 Added, 否则无法在DataAdapter更新的时候被添加到数据库等存储位置.

c. 如果DataAdapter.AcceptChangesDuringUpdate 属性为true, 使用DataAdapter.Update 更新后的DataRow的状态为 Unchanged, 否则,DataRow的状态保持不变, 默认 AcceptChangesDuringUpdate 为true.
默认情况下, 状态为 Unchanged 说明DataRow当前的数据没有经历过改变, 你可以认为和数据库中的数据一致, 但并非都如此.

d. 对于状态为 Unchanged 的DataRow, 调用 Delete 方法后状态为 Deleted.
DataAdapter对状态为 Deleted 的DataRow执行删除操作, 将数据库等存储位置的对应数据删除.

e. 对于状态为 Added 的DataRow, 调用 Delete 方法后状态为 Detached.
Added 状态的DataRow可能并不存在于数据库等存储位置, 因此状态转化为 Detached 而不是 Deleted,DataAdapter不会处理状态为 Detached 的DataRow.

f. 使用DataTable.Rows.Remove 方法移除DataRow后,DataRow状态为 Detached.

4.使用 AcceptChanges, RejectChanges, SetAdded, SetModified 方法后 DataRow.RowState 的转化

a. 状态为 Unchanged, Added, Modified 的DataRow, 使用DataRow.AcceptChanges 方法, 行状态将转化为 Unchanged.
以上三种状态的DataRow, 其目的相当于添加或者修改数据, 因此接受变化后这些DataRow存在于DataTable中, 并且状态为 Unchanged. 如果这时使用DataAdapter更新, 将不会对数据库等存储位置有任何的影响, 因为状态已经为 Unchanged, 这本应该在DataAdapter更新后转化的.

b. 状态为 Deleted 的DataRow, 使用DataRow.AcceptChanges 方法, 行状态转化为 Detached.
目的为删除数据的DataRow, 接受变化后就从DataTable中脱离, 因此状态变为 Detached.

c. 状态为 Detached 的DataRow, 不能使用DataRow.AcceptChanges 方法.

d. 状态为 Unchanged, Modified, Deleted 的DataRow, 使用DataRow.RejectChanges 方法, 行状态将转化为 Unchanged.
以上三种状态的DataRow, 其目的相当于删除或者修改数据, 因此拒绝变化后这些DataRow存在于DataTable中, 并且状态为 Unchanged. 如果这时使用DataAdapter更新, 其情况将类似于 a.

e. 状态为 Added, Detached 的DataRow, 使用DataRow.RejectChanges 方法, 行状态将转化为 Detached.
状态为 Added 的DataRow目的在于添加, 因此拒绝后从DataTable脱离, 状态为 Detached.

f. 对状态为 Unchanged 的DataRow, 可以使用DataRow.SetAdded,DataRow.SetModified 方法使行状态转化为 Added 或者 Modified.
SetAdded, SetModified 方法对状态不是 Unchanged 的DataRow使用将抛出异常.

5.使用 ImportRow, Copy 方法后 DataRow.RowState 的转化

a. 使用DataTable.ImportRow 方法导入DataRow后, 导入的DataRow和原DataRow的行状态一致.
ImportRow 方法采用复制的方式导入DataRow, 状态为 Detached 的DataRow, 无法导入到DataTable, 但不会产生异常.

b. 使用DataTable.Copy 或者DataSet.Copy 方法,DataRow的状态保持不变.

6.访问不同 RowState 的 DataRow 中的数据

a. 对于状态为 Added, Unchanged, Modified 的DataRow, 可以方便的通过DataRow[<列名>]访问数据.

b. 状态为 Deleted 的DataRow需要使用DataRow[<列名>, DataRowVersion.Original]来访问.
对于已经调用 Delete 方法的DataRow, 需要指定访问数据的 Original 版本.

c. 状态为 Detched 的DataRow, 似乎没有方法访问其中的数据.
DataRow已经从DataTable中移除, 这可能使其中的数据无法访问.

7.获取 DataTable 中不同 RowState 的 DataRow

a. 可以通过DataTable.GetChanges(DataRowState)得到DataTable中不同 RowState 的DataRow的副本.
GetChanges 方法将返回一个新的DataTable, 其中包含了指定行状态的DataRow的副本, 修改这些副本不会影响原DataTable中的DataRow. 如果使用不带参数的 GetChanges 方法将返回包含行状态为 Added, Modified, Deleted 的DataRow副本的DataTable. 可以使用位或运算符 | 组合获取多种状态的DataRow. 另外, 状态为 Detached 的DataRow似乎是无法通过 GetChanges 方法获取的.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值