将一个数据集与vb.net中的另一个数据集进行比较

时间:2014-09-20 09:24:03

标签: vb.net

  

我的代码中有两个数据集。我需要比较第二个数据集   第一个数据集我的第一个数据集返回以下结果: -

FirstDs : -

MaxUpdatedPrepped       MaxUpdatedSent          MaxUpdatedStamped  

1900-01-01               1900-01-01               1900-01-01  

我的第二个数据集返回如下: -

SecondDS : -

MaxUpdatedPrepped       MaxUpdatedSent          MaxUpdatedStamped  

1900-01-01               1900-01-01               2014-11-11  

我需要比较结果和返回警报,如"不匹配"如果第一个数据集值与第二个数据集值不匹配。我尝试了很多,但我只能得到错误的答案

For i As Integer = 0 To DsMaxDates1.Tables(0).Rows.Count - 1
    Dim found As Boolean = False
    For j As Integer = 0 To ds.Tables(0).Rows.Count - 1
        If DsMaxDates1.Tables(0).Rows(i)(0).ToString = ds.Tables(0).Rows(j)(0).ToString Then
            found = True
        End If
    Next
    If found = False Then
        ASPNET_MsgBox("Another User Working in Same Account. Please Click Reset.")
    End If
Next

以上结果返回true而不是false。

1 个答案:

答案 0 :(得分:2)

除非绝对必要,否则永远不会更改数据类型。将日期视为Date,将整数视为Integer,将字符串视为String,将小数视为Decimal等。ToString方法主要用于您希望显示数据给用户。

话虽如此,您还没有比较数据集,您需要比较数据表。

返回True的原因是因为您只比较第一列。您需要比较所有列。如果您的表格不包含像字节数组这样的复杂数据类型,那么最简单的方法是将LINQEnumerable.SequenceEqual结合使用。

以下代码假定每个表包含相同数量的行和列。

''Uncomment to unleash the one-liner:
'Dim notEqual As Boolean = (From i As Integer In Enumerable.Range(0, DsMaxDates1.Tables(0).Rows.Count) Where (Not DsMaxDates1.Tables(0).Rows(i).ItemArray.SequenceEqual(ds.Tables(0).Rows(i).ItemArray)) Select True).FirstOrDefault()

Dim notEqual As Boolean = (
    From i As Integer In Enumerable.Range(0, DsMaxDates1.Tables(0).Rows.Count)
    Where (Not DsMaxDates1.Tables(0).Rows(i).ItemArray.SequenceEqual(ds.Tables(0).Rows(i).ItemArray))
    Select True
).FirstOrDefault()

If (notEqual) Then
    ASPNET_MsgBox("Another User Working in Same Account. Please Click Reset.")
End If

您可以通过创建可重复使用的扩展方法进一步扩展它:

Public Module Extensions

    <System.Runtime.CompilerServices.Extension()>
    Public Function SequenceEqual(table1 As DataTable, table2 As DataTable) As Boolean
        Return (((((Not table1 Is Nothing) AndAlso (Not table2 Is Nothing))) AndAlso ((table1.Rows.Count = table2.Rows.Count) AndAlso (table1.Columns.Count = table2.Columns.Count))) AndAlso ((table1.Rows.Count = 0) OrElse (Not (From i As Integer In Enumerable.Range(0, table1.Rows.Count) Where (Not table1.Rows(i).ItemArray.SequenceEqual(table2.Rows(i).ItemArray)) Select True).FirstOrDefault())))
    End Function

End Module

然后您可以按照以下步骤操作:

If (Not DsMaxDates1.Tables(0).SequenceEqual(ds.Tables(0))) Then
    ASPNET_MsgBox("Another User Working in Same Account. Please Click Reset.")
End If