Vb.net 在VB中合并两个数据表(相同模式)并仅获取不匹配的行

Vb.net 在VB中合并两个数据表(相同模式)并仅获取不匹配的行,vb.net,Vb.net,我有两个数据表。我想合并它们,只想从两个数据表中获得不匹配的行。有人能帮忙吗 目前我正在使用以下代码,但没有返回任何内容: Actual_Table = myDataSet_Actual.Tables("Actuals") Planned_Table = myDataset_Planned.Tables("Planned") Planned_Table.AcceptChanges() Planned_Table.Merge(Actual_Table, False) change = Plan

我有两个数据表。我想合并它们,只想从两个数据表中获得不匹配的行。有人能帮忙吗

目前我正在使用以下代码,但没有返回任何内容:

Actual_Table = myDataSet_Actual.Tables("Actuals")
Planned_Table = myDataset_Planned.Tables("Planned")

Planned_Table.AcceptChanges()
Planned_Table.Merge(Actual_Table, False)

change = Planned_Table.GetChanges(DataRowState.Added)
DGV1.DataSource = change ' DGV1= Data grid view
我希望这能帮助你:

在本例中,它会在控制台中写入比较结果,但我想您可以做到这一点;)

祝你好运

EDIT:实际上,如果您的
DataTable
s具有相同的行数,并且您正在一对一地比较这些行,那么您应该将每个
语句的
更改为一个
For
语句。比如:

For i As Integer = 0 To RowNo - 1
    'compare datatable1_row(i) with datatable2_row(i) and do the magic
Next
我希望这能帮助你:

在本例中,它会在控制台中写入比较结果,但我想您可以做到这一点;)

祝你好运

EDIT:实际上,如果您的
DataTable
s具有相同的行数,并且您正在一对一地比较这些行,那么您应该将每个
语句的
更改为一个
For
语句。比如:

For i As Integer = 0 To RowNo - 1
    'compare datatable1_row(i) with datatable2_row(i) and do the magic
Next
TL;博士 您可以使用以下代码执行此操作,但请继续阅读以了解更多详细信息:

change=Planned\u Table.a可计算_
.Except(实际值\u Table.AsEnumerable,DataRowComparer.Default)\u
.CopyToDataTable
这里有几点需要注意: 正如本SO中所指出的,
DataTable.Merge
不会更改行状态,因此查找具有
DataRowState.Added
的行将始终显示为空

另外,
Merge
将第二个表中的每一行添加到第一个表中,因此即使RowState已更改,第二个表中的所有内容也会显示出来

最后,假设我们只将第二个数据表中的唯一值添加到第一个数据表中,我们只会返回第二个数据集中的元素,而不是第一个数据集中的元素。也许这就是你想要的,但我将描述这两种选择,以防你真的想要其中任何一种

我们需要的工具 如其他SO问题和中所述,我们可以使用以下任何一项找到正确的条目集:

您可以在MSDN中进一步研究其中的每一项,但正如问题中提到的仅供参考,
Union
Concat
都将在另一个枚举上附加一个枚举,但Union将删除重复项(检查
DataRow
s的相等性时,必须传入重载的
IEqualityComparer
=
DataRowComparer.Default

此外,我们还需要枚举一个DataTable,因此要做到这一点,我们需要从
DataTableExtensions
命名空间调用该方法

解决方案设置 我们看的是相同的代码,这里有一些基本的数据表,我们可以在这些数据表上执行集合操作

Dim dt、dataTable1、dataTable2作为新DataTable
使用dt.列
.Add(“ID”,GetType(整数))
.Add(“名称”,GetType(字符串))
以
dataTable1=dt.Clone
dataTable2=dt.Clone
使用dataTable1.Rows
.添加(1,“Tod”)
.Add(2,“Jim”)
以
使用dataTable2.Rows
.Add(2,“Jim”)
.Add(3,“韩”)
以
解决方案集 因此,如果您只需要第二个表中没有出现在第一个表中的新项,那么您需要一个
右外部联接

如果需要两个集合之间不同的所有数据,则需要排除
内部联接的
完全外部联接

您可以在此Jeff Atwood中阅读有关不同集合以及创建它们的联接的更多信息

代码 如果需要第一个选项,可以通过调用第二个
Datatable
上的
Except
并传入第一个来获取第二个集合中的元素

Dim just2 As DataTable
just2 = dataTable2.AsEnumerable _
                  .Except(dataTable1.AsEnumerable, DataRowComparer.Default) _
                  .CopyToDataTable()
输出将是:

| ID | Name |
| 3  | Han  |
如果要在每个集合中使用唯一的值,则必须调用distinct两次,然后将这两个值合并。我们不需要将
DataRowComparer
传递到
Union
方法,因为我们已保证两个表中没有重复项

Dim just1 As IEnumerable(Of DataRow)
Dim just2 As IEnumerable(Of DataRow)
Dim union As DataTable

'get rows that are only in table1
just1 = dataTable1.AsEnumerable.Except(dataTable2.AsEnumerable, DataRowComparer.Default)

'get rows that are only in table2
just2 = dataTable2.AsEnumerable.Except(dataTable1.AsEnumerable, DataRowComparer.Default)

'get all unique rows
union = just1.Union(just2).CopyToDataTable
因为我们不需要单独的元素集,所以不需要调用
CopyToDataTable
,这样我们就可以使用
AsEnumerable

工会的产出将是:

| ID | Name |
| 1  | Tod  |
| 3  | Han  |
太长,读不下去了 您可以使用以下代码执行此操作,但请继续阅读以了解更多详细信息:

change=Planned\u Table.a可计算_
.Except(实际值\u Table.AsEnumerable,DataRowComparer.Default)\u
.CopyToDataTable
这里有几点需要注意: 正如本SO中所指出的,
DataTable.Merge
不会更改行状态,因此查找具有
DataRowState.Added
的行将始终显示为空

另外,
Merge
将第二个表中的每一行添加到第一个表中,因此即使RowState已更改,第二个表中的所有内容也会显示出来

最后,假设我们只将第二个数据表中的唯一值添加到第一个数据表中,我们只会返回第二个数据表中的元素,而不是第一个数据表中的元素。也许这正是您想要的,但如果您真的想要任何一个,我将描述这两个选项

我们需要的工具 如其他SO问题和中所述,我们可以使用以下任何一项找到正确的条目集:

您可以在MSDN中进一步研究其中的每一项,但正如问题中提到的仅供参考,
Union
Concat
都将在另一个枚举上附加一个枚举,但Union将删除重复项(检查
DataRow
s的相等性时,必须传入重载的
IEqualityComparer
=
DataRowComparer.Default

此外,我们还需要枚举一个DataTable,因此要做到这一点,我们需要从
DataTableE调用该方法