行状态,行版本

datarow.rowstate:

当新建一行的时候,状态为Detached,不属于任何表,把它添加到表中后,状态为Added,这时候你修改这条数据,他的状态还是Added,

  把它添加到表中后,状态为Added

0 如果    这时候你修改这条数据,他的状态还是Added,

1 如果   如果再去调用delete(),他的状态又变会Detached,而不是delete状态。

2 如果   这个时候调用 acceptchanges().它的状态为Unchanged。

3 如果  这个时候调用  RejectChanges()它的状态为Detached,注意,RejectChanges() 方法总是将其状态调整为上一次调用acceptchanges().之后的状态

           即:如果 RowState 是“已删除”或“已修改”,则该行恢复为其以前的值,RowState 变成“未更改”(Unchanged)。如果 RowState 是“已添加”,则该行将被移除。 

如果一个行的状态是Unchanged:

1 如果修改数据,状态为Modified,

2 如果从1中的状态在去调用RejectChanges(),当然变为Unchanged了;

3 如果从1的状态去调用acceptchanges(),当然也是Unchanged();

4如果从3的状态去调用 delete,则状态为Deleted,如果调用RejectChanges(),当然变为Unchanged了;

5 如果从Deleted状态调用delete(),则变为Detached。

从以上总结出rowstate的规律:

行版本详解:

一个Table主要布局:

restrict

original

current

Proposed

relation

对于dataset而言,行版本能够解决的问题是丢失修改,从数据库加载数据到DATASET中时,默认都有original,current两个版本,

没有Proposed版本,当要修改一行的数据的时候,调用beginedit().这时候会把current拷贝到Proposed版本中,然后修改数据是

在Proposed 中进行的,在给列赋值的时候会发生列校验,如果调用cancleedit(),会把Proposed版本删掉,调用endedit()的时候

会把Proposed版本拷贝到current版本中,注意,在从Proposed拷贝到current中会发生行校验,如果调用acceptchanges()这个

时候会把current版本覆盖到original版本中去,如果调用rejectchanges()会把original版本拷贝到current版本,再来说说,行版本

和行状态的转换关系:

判断是不是modified,如果original版本不等于current版本就表明修改过了

判断是unchanged,如果original版本等于current版本就表明是无变化的

判断是Added,如果只有current版本,没有original版本就表明是增加的

判断Deleted,只有origianl没有current版本,就表明是删除状态了。

在modied状态时候,如果调用acceptchanges(),C版本拷贝到O版本,如果调用rejectchanges,会把O拷贝到C

在刚创建一个新行的时候处于Detached,只有Proposed版本,调用add,会把P版本拷贝到C版本,如果调用reject会变成Detached状态,

在deleted 状态时候,调用acceptchages(),状态会变成Detached,

原文地址:https://www.cnblogs.com/qianyz/p/1850529.html