【问题标题】:How to merge (join) datatables in .net where rows span multiple datatables如何在.net中合并(连接)数据表,其中行跨越多个数据表
【发布时间】:2015-04-10 19:00:59
【问题描述】:

我有多个要连接在一起的数据表。行跨越表而不是列。

这意味着 datatable1 可以包含第 1、2、3 列,而 datatable2 可以包含第 4、5、6 列。

我想将两者合并,以便 datatable1 具有第 1、2、3、4、5、6 列。

我觉得我已经阅读了很多示例,但仍然无法正常工作。

Private Sub mergeDataTables()
    Dim primaryKeyValue As Integer
    Dim tableIndex As Integer = 0
    For Each t As System.Data.DataTable In dataSet.Tables
        Dim pkColumn As New System.Data.DataColumn
        primaryKeyValue = 0

        'add column to house primary key and move it to the far left of the table
        pkColumn = t.Columns.Add()
        pkColumn.SetOrdinal(0)

        'populate the primary key column with unique values
        For Each r As System.Data.DataRow In t.Rows
            r(0) = primaryKeyValue
            primaryKeyValue += 1
        Next

        'set the primary key column as a primary key
        t.PrimaryKey = {t.Columns(0)}


        If tableIndex > 0 Then
            For col = 1 To t.Columns.Count - 1
                'assign unique column names to all columns but primary key column
                t.Columns(col).ColumnName = String.Format("{0}{1}", GetExcelColumnName(tableIndex), col) 'using getexcelcolumname for no other reason that to get a unique column name 1 = a 2 = b etc
            Next
            dataSet.Tables(0).Merge(t)
        End If

        tableIndex += 1
    Next
End Sub

【问题讨论】:

  • 尝试在 Google 上搜索“.net join two tables”。
  • @rheitzman 我有,这就是我得到上面代码的方式。但是它并没有产生预期的结果,所以我认为我做错了什么,有人可以帮助我发现。
  • @rheitzman 您是否看到了我在 Google 搜索中会遗漏的内容?
  • 我认为您要做的是 JOIN 而不是合并。您可能能够检索两个表的完整副本,创建本地 DataTables,并使用逻辑或 LINQ 根据来自表中的键值将记录连接在一起,其中 JOIN 定义了记录之间的关系。如果这是一个一次性/小型项目,您可以考虑使用 MS Access,它可以轻松访问不同数据库中的数据并对外部表的链接执行查询。

标签: .net vb.net datatable merge dataset


【解决方案1】:

试试这个 - 您需要传入包含源表的 DataSet 作为参数,并且表中的列不能具有相同的名称:

    Private Sub mergeDataTables(ds As DataSet)

    Dim mergedTable As New DataTable("MergedData")

    mergedTable.Columns.Add("ID", System.Type.GetType(System.Int32))

    'Create the combined fields for the table
    For Each t As System.Data.DataTable In ds.Tables
        For Each col As DataColumn In t.Columns
            Dim newCol As New DataColumn(col.ColumnName, col.DataType)
            mergedTable.Columns.Add(newCol)
        Next
    Next

    Dim rowId As Integer = 0

    For Each row As DataRow In ds.Tables(0).Rows

        Dim newRow As DataRow = mergedTable.NewRow

        For Each col As DataColumn In mergedTable.Columns

            If col.ColumnName = "ID" Then
                newRow(col.ColumnName) = rowId
            Else
                For Each t As DataTable In ds.Tables

                    'This table has the column we need here
                    If t.Columns.Contains(col.ColumnName) Then
                        'Retrieve the corresponding data from the same row in the source table
                        newRow(col.ColumnName) = t.Rows(rowId)(col.ColumnName)
                        Exit For
                    End If
                Next
            End If

        Next

        mergedTable.Rows.Add(newRow)
        rowId += 1
    Next

End Sub

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多