合并两个DataSet并消除重复行
如何合并两个 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