Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vb.net中合并两个数据表_Vb.net - Fatal编程技术网

在vb.net中合并两个数据表

在vb.net中合并两个数据表,vb.net,Vb.net,我在vb.net中有两个数据表。每个存储过程都是从它自己的存储过程填充的。表A在第一列中包含项目编号。表B在第一列中还包含项目编号。表A可能有许多具有相同项目编号的记录,但表B中每个项目编号始终只有一条记录。我想将表B中的数据附加到表A中的每个匹配记录。我该如何做 表A可以如下所示: 工程量 12345100 12345200 12345300 表B可以如下所示: 项目、客户 12345,ABC公司 我想将两者合并,创建如下内容: 项目、数量、客户 12345100,ABC公司 12345200

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

表A可以如下所示:

工程量

12345100

12345200

12345300

表B可以如下所示:

项目、客户

12345,ABC公司

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

项目、数量、客户

12345100,ABC公司

12345200,ABC公司

12345300,ABC公司


请帮忙

我建议使用LINQ方法,LINQ有一个连接操作符可以处理这个问题

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

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

它是一个函数,通过传入两个表、两个数组(包含每个表所需的列名)以及用于联接表的键,可以按照您的示例合并数据

假设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

任何可计算的内容都可以在LINQ中使用

变量数量=DataTable1.a可计算; var客户=DataTable2.a可计算

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 
这是对克里斯·奇尔弗斯的进一步解释 从数量上看q_ 在q项目中加入c客户等于c项目_
选择Quantity=q,Customer=c

KeeperOfTheSoul:感谢您的回复。我需要知道如何连接vb.net中的表。KeeperOfTheSoul:谢谢您的回复。我需要知道如何连接vb.net中的表,尽管.LINQ可以用于普通的旧net对象和集合类,实际上,这是一种非常强大的方法,可以处理任何实现IEnumerableOf tRowFilter参数只需添加一小部分就可以了:dv.RowFilter=sKey&='&rowsKey.ToString&'@Paxsentry 10年后,最近的一次升级让我再次看到这篇文章,并看到了你的评论。如果键字段是字符串,那么您是对的,但是OP的数据中有数值。但是,我确实注意到,如果关键字列名中有空格,则筛选器可能会出现问题,因此如果我今天再次这样做,我将重写行-dv.RowFilter=$[{sKey}]={rowsKey}