【发布时间】:2014-02-15 13:41:09
【问题描述】:
假设如果两个相同的DataTables 被合并每行的状态将被保留,我错了吗?
看看这个简单的例子。它创建两个相同的表并将updated 表与original 表合并。但是original.GetChanges() 中的返回表不是Nothing 预期的那样。此外,original 表中每一行的状态都更改为Modified。
那么我错过了什么?我真的必须创建自己的合并方法来实现吗?
Public Sub Test()
Dim original As DataTable = Me.CreateTableWithData()
Dim updated As DataTable = Me.CreateTableWithData()
Dim preserveChanges As Boolean = True
Dim msAction As MissingSchemaAction = MissingSchemaAction.Ignore
original.Merge(updated, preserveChanges, msAction)
Dim changes As DataTable = original.GetChanges()
MessageBox.Show(String.Format("Count={0}", If((changes Is Nothing), 0, changes.Rows.Count)), Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
If (Not changes Is Nothing) Then changes.Dispose() : changes = Nothing
updated.Dispose() : updated = Nothing
original.Dispose() : original = Nothing
End Sub
Private Function CreateTableWithData() As DataTable
Dim table As New DataTable("TEST")
table.Columns.Add("ID", GetType(Integer))
table.Columns.Add("VALUE", GetType(String))
table.PrimaryKey = New DataColumn() {table.Columns(0)}
table.Rows.Add(1, "Value 1")
table.Rows.Add(2, "Value 2")
table.AcceptChanges()
Return table
End Function
输出:Count=2
编辑 - 解决方法
以下代码是这种奇怪(?)行为的解决方法。
Private Shared Sub Merge(target As DataTable, source As DataTable, preserveChanges As Boolean, msa As MissingSchemaAction)
target.Merge(source, preserveChanges, msa)
Dim row As DataRow
Dim column As DataColumn
Dim acceptChanges As Boolean
For Each row In target.Rows
If ((row.RowState = DataRowState.Modified) AndAlso ((row.HasVersion(DataRowVersion.Original)) AndAlso (row.HasVersion(DataRowVersion.Default)))) Then
acceptChanges = True
For Each column In target.Columns
If (Not Object.Equals(row.Item(column, DataRowVersion.Original), row.Item(column, DataRowVersion.Default))) Then
acceptChanges = False
Exit For
End If
Next
If (acceptChanges) Then
row.AcceptChanges()
End If
End If
Next
acceptChanges = Nothing
column = Nothing
row = Nothing
End Sub
【问题讨论】:
-
继续此操作,并且由于某种原因,如果您设置 preserveChanges=false 行不会在合并后设置为修改...但是,如果您指出 preserveChanges=true (您认为会保留更改)行设置为已修改。我无法重现您的问题,因为我在原始测试中设置 perserveChanges = false....将所有内容设置为“已修改”并保留更改=false 不理会它们)
-
如果您设置 perserveChanges=False 原始表中的任何更改都将被合并的数据覆盖,但不会将行状态设置为已修改。如果您设置 perserveChanges=True 则原始数据不会被传入数据覆盖并且行状态都设置为修改由于某种原因。