【问题标题】:Combine multiple dataset columns to one dataset将多个数据集列合并为一个数据集
【发布时间】:2011-02-21 12:55:16
【问题描述】:

我有多个要合并为一个的数据集。有一个可以与每一行关联的公共 ID 字段。在数据集上调用 Merge 将为数据集添加额外的行,但我想合并额外的列。在一个查询中执行此操作的字段太多,因此会使其无法管理。每个单独的查询都能够处理排序以确保数据放置在正确的行中。

例如,假设我有两个查询导致两个数据集:

SELECT ID, colA, colB
SELECT colC, colD

生成的数据集如下所示

ID colA colB colC colD
1  a    b    c    d
2  e    f    g    h

有什么方法可以做到这一点吗?

【问题讨论】:

标签: .net vb.net visual-studio datatable dataset


【解决方案1】:

这是一个示例,说明如何使用 ASP.NET 和 VB.NET 完成您想要的。我为你创建了一个“MergeColumns”和“MergeData”子。

   Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Create the dataset and put in the data.  Normally you will just get this from a database query'

        Dim ds1 As New Data.DataSet
        Dim ds2 As New Data.DataSet

        Dim dt1 = ds1.Tables.Add()
        dt1.Columns.Add("ID", GetType(Int32))
        dt1.Columns.Add("ColA", GetType(String))
        dt1.Columns.Add("ColB", GetType(String))

        Dim dt2 = ds2.Tables.Add()
        dt2.Columns.Add("ColC", GetType(String))
        dt2.Columns.Add("ColD", GetType(String))

        dt1.Rows.Add(1, "a", "b")
        dt2.Rows.Add("c", "d")
        dt1.Rows.Add(2, "e", "f")
        dt2.Rows.Add("g", "h")

        'Sample data created, now to merge the results like you want'
        Dim dsNew As New Data.DataSet
        Dim dtNew = dsNew.Tables.Add(0)

        MergeColumns(dtNew, dt1, dt2)
        MergeData(dtNew, dt1, dt2)

        'Display the results'
        dsNew.AcceptChanges()
        Response.Write(dsNew.GetXml)

    End Sub


    Private Sub MergeColumns(ByVal TargetTable As Data.DataTable, ByVal ParamArray SourceTables() As Data.DataTable)
        For Each dtSource In SourceTables
            'Make a clone of the table, then steal the columns from the clone'
            Dim dtClone = dtSource.Clone

            While dtClone.Columns.Count > 0
                Dim dc = dtClone.Columns(0)

                dtClone.Columns.Remove(dc)

                TargetTable.Columns.Add(dc)
            End While
        Next
    End Sub


    Private Sub MergeData(ByVal TargetTable As Data.DataTable, ByVal ParamArray SourceTables() As Data.DataTable)
        'Determine the number of rows the final table will have'
        Dim nMaxRowCount = 0
        For Each dt In SourceTables
            If dt.Rows.Count > nMaxRowCount Then
                nMaxRowCount = dt.Rows.Count
            End If
        Next

        For i = 0 To nMaxRowCount - 1
            'Create a new row using column data from each table.  Assumes the name is unique across tables.'
            Dim drTarget = TargetTable.NewRow
            For Each dcTarget As Data.DataColumn In TargetTable.Columns
                For Each dt In SourceTables
                    If i < dt.Rows.Count AndAlso dt.Columns.Contains(dcTarget.ColumnName) Then
                        drTarget(dcTarget) = dt.Rows(i)(dcTarget.ColumnName)
                    End If
                Next
            Next
            TargetTable.Rows.Add(drTarget)
        Next

    End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2013-11-13
    • 2023-04-08
    相关资源
    最近更新 更多