【问题标题】:Merging 2 data tables in vb.net在 vb.net 中合并 2 个数据表
【发布时间】:2009-08-11 19:21:43
【问题描述】:

我在 vb.net 中有 2 个数据表。每个都是从它自己的存储过程中填充的。表 A 在第一列中包含一个项目编号。表 B 还包含第一列中的项目编号。表 A 可能有许多具有相同项目编号的记录,但表 B 中的每个项目编号总是只有一条记录。我想将表 B 中的数据附加到表 A 中的每个匹配记录中。我该怎么做?

表 A 可能如下所示:

项目#,数量

12345, 100

12345, 200

12345, 300

表 B 可能如下所示:

项目#,客户

12345,ABC 公司

我想将两者合并以创建如下内容:

项目#、数量、客户

12345, 100, ABC Inc.

12345, 200, ABC Inc.

12345, 300, ABC Inc.

请帮忙!

【问题讨论】:

  • KeeperOfTheSoul:感谢您的回复。我需要知道如何在 vb.net 中加入表格。

标签: vb.net


【解决方案1】:

这可能会对您有所帮助,并且可能是半通用的,足以应用于其他情况。

这是一个函数,它将通过传入两个表、两个包含每个表所需的列名的数组以及用于连接表的键来合并数据(根据您的示例)。

假设 tblA 是驱动表,并查找到 tblB。

   Sub Main()

      Dim tbl As DataTable

      Dim colsA() As String = {"ProjectNo", "Quantity"}
      Dim colsB() As String = {"Customer"}
      Dim sKey As String = "ProjectNo"

      tbl = MergeData(tblA, tblB, colsA, colsB, sKey)

   End Sub

   Private Function MergeData(ByVal tblA As DataTable, ByVal tblB As DataTable, _
                              ByVal colsA() As String, ByVal colsB() As String, _
                              ByVal sKey As String) As DataTable

      Dim tbl As DataTable
      Dim col As DataColumn
      Dim sColumnName As String
      Dim row As DataRow
      Dim newRow As DataRow
      Dim dv As DataView

      tbl = New DataTable
      dv = tblB.DefaultView

      For Each sColumnName In colsA
         col = tblA.Columns(sColumnName)
         tbl.Columns.Add(New DataColumn(col.ColumnName, col.DataType))
      Next
      For Each sColumnName In colsB
         col = tblB.Columns(sColumnName)
         tbl.Columns.Add(New DataColumn(col.ColumnName, col.DataType))
      Next

      For Each row In tblA.Rows
         newRow = tbl.NewRow
         For Each sColumnName In colsA
            newRow(sColumnName) = row(sColumnName)
         Next

         dv.RowFilter = (sKey & " = " & row(sKey).ToString)
         If dv.Count = 1 Then
            For Each sColumnName In colsB
               newRow(sColumnName) = dv(0).Item(sColumnName)
            Next
         End If
         tbl.Rows.Add(newRow)
      Next

      Return tbl

   End Function

【讨论】:

  • RowFilter 参数需要在单引号中添加一点点:dv.RowFilter = (sKey & " = '" & row(sKey).ToString() & "'")
  • @Paxsentry 10 年后,最近的一次投票让我再次看到这篇文章,并看到了你的评论。如果关键字段是一个字符串,你会是对的,但是在 OP 的数据中他有数值。但是,我确实注意到如果键列名称中有空格,则过滤器存在潜在问题,因此如果我今天再次这样做,我将重写该行 - dv.RowFilter = $"[{sKey}] = {行(sKey)}"
【解决方案2】:

我建议使用 LINQ 方法,LINQ 有一个可以处理此问题的连接运算符。

From q In quantities _
Join c In customers On q.project Equals c.project _
Select Quantity = q, Customer = c

【讨论】:

  • KeeperOfTheSoul:感谢您的回复。不过,我需要知道如何在 vb.net 中加入表格。
  • LINQ 可以与普通的旧网络对象和集合类一起使用,它实际上是一种非常强大的方式来处理任何实现 IEnumerable(Of T)
【解决方案3】:

任何 AsEnumerable 都可以在 LINQ 中使用

var 数量 = DataTable1().AsEnumerable(); var customers = DataTable2().AsEnumerable();

var result = from dtquanRow in quantities
        join dtcustomers in customers
        on dtquanRow.Field<string>("project") equals dtcustomers.Field<string>("project")

        select new
        {
            project = dtquanRow.Field<string>("project"),
            Quantity = dtquanRow.Field<string>("Quantity"),
           Customer = dtquanRow.Field<string>("Customer")
        };
moredetailed query and table to linq conversion 

对 Chris Chilvers 的进一步解释
从 q 数量 _ 加入 c 在客户上 q.project 等于 c.project _ 选择数量 = q,客户 = c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多