65.9K
CodeProject 正在变化。 阅读更多。
Home

合并两个DataSet并消除重复行

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2008年8月14日

CPOL

1分钟阅读

viewsIcon

55649

如何合并两个 DataSet 并消除重复行。

引言

场景如下:我们有两个来自不同数据库服务器的 DataTable,并希望使用 C# / VB.NET 合并这两个 DataTable 中的数据。听起来很简单!!!是的,很简单 - 你总是可以使用 DataSet.DataTable(index).Merge(要合并的 DataTable)。但是,如果你需要删除两个 DataTable 中的重复项,那么 .NET 中就没有预定义的函数。但是你可以通过多种方式实现这一点,这只是其中一种。

背景

我的项目中有一个场景,需要从两个数据库中获取结果,并消除来自两个不同数据库表中的重复项。如果数据来自同一服务器,我们可以使用数据库存储过程中的 "Union" 操作获得所需的结果。但是从两个不同的服务器,我们必须使用 DataSet.DataTable.Merge(DataSet.DataTable),并且如果最终结果集中存在任何重复项,它将不会消除重复项。因此,我用 VB.NET / C# 编写了一个函数,该函数为我们提供了一个消除重复项的 DataSet/ DataTable

Using the Code

基本代码如下(它是 VB.NET,转换为 C# 非常简单)

Public Shared Function MergeResultSets() As DataSet 
    Dim ds As DataSet, checkCount As Integer = 0, rowPosition As String = ""
    Try
        ds = DAL.DataAcess.Sample(param1, param2)
        For i As Integer = 0 To ds.Tables(0).Rows.Count - 1 
            For j As Integer = 0 To ds.Tables(1).Rows.Count - 1
            If Equals(ds.Tables(0).Rows(i).ItemArray().Count,
                ds.Tables(1).Rows(j).ItemArray().Count) Then
                For k As Integer = 0 To ds.Tables(0).Rows(i).ItemArray().Count - 1
                If Equals(ds.Tables(0).Rows(i).ItemArray(k),
                    ds.Tables(1).Rows(j).ItemArray(k)) Then
                    checkCount = checkCount + 1
                End If
                If checkCount = ds.Tables(1).Rows(j).ItemArray().Count Then
                    rowPosition = rowPosition + j.ToString() + ","
                    checkCount = 0
                End If
                Next
                    checkCount = 0
                Else
                'Throw an exception or delete the row here itself
                End If
            Next
        Next
        Dim sa As Array = Split(rowPosition.TrimEnd(","), ",")
        For rp As Integer = 0 To sa.Length - 1
            ds.Tables(1).Rows(sa(rp)).Delete()
        Next
        ds.Tables(1).AcceptChanges()
        ds.Tables(0).Merge(ds.Tables(1))
        Return ds ' this has the two datatables merged as one dataset / datatable
                  ' without duplicate rows.
    Catch ex As Exception
        Return Nothing
    End Try
End Function
© . All rights reserved.