RowState.Added 和 DataRowVersion.Original 有啥区别

Posted

技术标签:

【中文标题】RowState.Added 和 DataRowVersion.Original 有啥区别【英文标题】:What is the difference between RowState.Added and DataRowVersion.OriginalRowState.Added 和 DataRowVersion.Original 有什么区别 【发布时间】:2018-02-13 17:22:48 【问题描述】:

我有一个具有 3 个条件的函数:

    如果DataRow rowstate == Added 如果!DataRow HasVersion(DataRowVersion.Original) 如果DataRow rowstate == modified

我的问题是第二个,有人能解释一下吗? 它与第一个条件有何不同?

【问题讨论】:

那么……你想让别人帮你做作业吗?你为什么不google一下Added是什么意思,HasVersion做什么,DataRowVersion.Original返回什么? 我搜索并不太明白 HasVersion(DataRowVesrion.Original) 与第一个条件相比是什么意思。在我看来,他们做同样的事情,但只是假设太重要了,所以我来到了这里。觉得没有必要解释整个故事。 我编辑了这个问题,所以你可能明白我在问什么问题 【参考方案1】:

说明

    当 DataRow 新添加到 表调用AcceptChanges() 后,RowState 将设置为 “不变” DataRow 具有 DataRowVersion “原始”,当它包含它时 原始值。在 DataRow 或 DataTable 上调用 AcceptChanges() 时,DataRowVersion 将设置为“原始”。您可以说原始意味着所有更改都已被接受。 DataRow 在编辑后的 ​​RowState 为“Modified”。

示例程序

我创建了一个小示例程序,它显示了操作中的变化,以阐明差异。

class Program 
    static void Main(string[] args) 
        var table = new DataTable("MyTable");
        table.Columns.Add(new DataColumn("MyColumn"));
        var row = table.NewRow();
        Console.WriteLine($"Rowstate: row.RowState"); //Prints Detached

        table.Rows.Add(row);
        Console.WriteLine($"Rowstate: row.RowState"); //Prints Added

        table.AcceptChanges();
        Console.WriteLine($"Rowstate: row.RowState"); //Prints Unchanged

        row.BeginEdit();
        row[0] = "NewValue";
        row.EndEdit();
        Console.WriteLine($"Rowstate: row.RowState"); //Prints Modified

        if (row.HasVersion(DataRowVersion.Current))  // Does the row contain uncommited values?
            Console.WriteLine($"DataRowVersion: DataRowVersion.Current"); //Prints Current
        

        table.AcceptChanges(); //Commit all DataRowChanges
        if (row.HasVersion(DataRowVersion.Original)) 
            Console.WriteLine($"DataRowVersion: DataRowVersion.Original"); //Prints Current
        

        Console.ReadLine();
    

进一步阅读

关于DataRowStates 的msdn 文档实际上解释得很好。它提供了关于每个状态的简短说明以及一些示例代码。 DataRowVersions 也是如此。你绝对应该看看这两篇文章。

数据行版本

引用自链接的 MSDN 文章:

调用 DataRow 对象的 BeginEdit 方法后,如果更改 值,Current 和 Proposed 值变为可用。

调用DataRow对象的CancelEdit方法后,Proposed值被删除。

调用 DataRow 对象的 EndEdit 方法后,Proposed 值变为 Current 值。

调用 DataRow 对象的 AcceptChanges 方法后,原始值与当前值相同。

调用 DataTable 对象的 AcceptChanges 方法后,Original 值与 Current 值相同。

调用DataRow对象的RejectChanges方法后,Proposed值被丢弃,版本变为Current。

【讨论】:

所以基本上第二个条件意味着不是 DataRowState.Added 的每个案例? DataRowVersion.Original 基本上意味着没有进行任何更改,或者所有更改都被接受。【参考方案2】:

行状态(已添加、已删除 ..) 行版本(原始,当前,建议)

使用Row Version来决定的更新方法 将哪些更改应用于数据库。 如果我们在 TableAdapter 上调用 AcceptChanges 方法 在调用更新方法之前: 当前版本将是原始版本 所以你不应该在调用 Update 之前调用 ACCEPTCHANGES 方法 方法

【讨论】:

以上是关于RowState.Added 和 DataRowVersion.Original 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()