比较两个数据表,如果有不同则显示MessageBox

时间:2019-06-20 14:41:25

标签: vb.net

我有两个数据表,其中一个在应用程序启动时填充,另一个在单击按钮时填充。如何检查(最快方式)第二个数据表中是否有任何更改?

我已经尝试过了,但是不起作用:

For Each row1 As DataRow In dtt.Rows
  For Each row2 As DataRow In dtt1.Rows
    Dim array1 = row1.ItemArray
    Dim array2 = row2.ItemArray

    If array1.SequenceEqual(array2) Then
    Else
    End If
  Next
Next

1 个答案:

答案 0 :(得分:0)

问题在于您的循环是嵌套的。这意味着内部的For Each对dtt1的每一行循环遍历dtt的每一行。这不是您想要的。您要并行循环两个表。您可以通过使用For Each语句在内部使用的枚举器来做到这一点

Dim tablesAreDifferent As Boolean = False
If dtt.Rows.Count = dtt1.Rows.Count Then
    Dim enumerator1 = dtt.Rows.GetEnumerator()
    Dim enumerator2 = dtt1.Rows.GetEnumerator()

    Do While enumerator1.MoveNext() AndAlso enumerator2.MoveNext()
        Dim array1 = enumerator1.Current.ItemArray
        Dim array2 = enumerator2.Current.ItemArray
        If Not array1.SequenceEqual(array2) Then
            tablesAreDifferent = True
            Exit Do
        End If
    Loop
Else
    tablesAreDifferent = True
End If
If tablesAreDifferent Then
    'Display message
Else
    '...
End If

枚举器的工作方式如下:它们具有一个内部游标,该游标最初位于第一行之前。在通过Current属性访问一行之前,必须使用MoveNext函数将其移至该行。如果成功,则此函数返回布尔值True,即,只要有可用行,就可以返回。

由于现在我们有一个循环语句,并且在每个循环处前进enumerator1enumerator2的光标,所以我们可以比较对应的行。


请注意,Rows集合实现了IEnumerable,因此GetEnumerator返回的枚举数不是强类型的。即Current键入为Object。相反,如果您写

Dim enumerator1 = dtt.Rows.Cast(Of DataRow).GetEnumerator()
Dim enumerator2 = dtt1.Rows.Cast(Of DataRow).GetEnumerator()

然后,您将获得类型为IEnumerator(Of DataRow)的枚举数,它们将返回强类型的DataRow