2

这里有些困惑,以下代码会导致 DataTable 发生更改,而我不希望它这样做。DataTable 内部是否没有实际的单个值更改管理?还是我错过了什么?

var table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Rows.Add("Sample Name");
table.AcceptChanges();

table.Rows[0].SetField("Name", "Sample Name");

var changes = table.GetChanges();

// expecting null, actually returns changes

我本来希望该表在内部使用一些预先构建的逻辑来确定新值是否确实与当前值不同。

为什么会这样?

4

2 回答 2

3

当您修改行的内容时,它会更新DataRow.RowState属性,该属性可以包含UnChanged,AddedModified。稍后DataTable.GetChanges根据该行状态过滤掉行。它与价值无关

DataTable.GetChanges - MSDN

获取 DataTable 的副本,其中包含自上次加载或自调用 AcceptChanges 以来对其所做的所有更改,并由 DataRowState 过滤。

另见:

行状态和行版本 - MSDN

ADO.NET 使用行状态和版本管理表中的行。行状态表示行的状态;行版本在修改行时维护存储在行中的值,包括当前值、原始值和默认值。例如,您对某行中的某列进行了修改后,该行的行状态为 Modified,以及两个行版本:Current 包含当前行值,Original 包含之前的行值列已修改。

于 2013-09-11T18:19:43.873 回答
1

这显然是一个设计功能,因为即使SetField()使用完全相同的对象调用扩展方法,然后检查字段值DataRowVersion.OriginalDataRowVersion.Current您也会发现它们仍然引用相等。没有描述不同行为的文档。

于 2013-09-11T19:28:02.550 回答