2009-08-11 71 views
0

私はvb.netに2つのDataTableを持っています。それぞれは、それ自身のストアドプロシージャから実装されます。表Aには、最初の列にプロジェクト番号が記載されています。また、表Bには、最初の列にプロジェクト番号が記載されています。表Aは、同じプロジェクト番号を持つ多くのレコードを持つことができますが、表Bは常にプロジェクト番号ごとに1つのレコードしか持っていません。表Bのデータを表Aのすべての一致するレコードに追加したいと思います。これはどのように行うのですか?vb.netで2つのデータテーブルをマージする

表Aは、次のようになり:

プロジェクト#、QUANTITY

12345、100

12345、200

12345、300

表Bの可能性次のようになります。

プロジェクト#、CUSTOMER

12345、ABC株式会社

私はこのような何かを作成するために2つを統合したいと思います:

プロジェクト#、数量、顧客

12345 、100、ABC Inc.

12345,20012 ABC Inc.

12345,300、ABC Inc.

助けてください!

+0

KeeperOfTheSoul: おかげで応答のために。私はvb.netのテーブルに参加する方法を知る必要があります。 – stewdaddy5000

答えて

3

これはあなたを助けるかもしれませんし、他の状況に適用するのに十分なほど一般的かもしれません。

これは、2つのテーブル、各テーブルから必要な列名を含む2つの配列、およびテーブルを結合するために使用されるキーを渡すことによって、データをマージする関数です。

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 
+0

RowFilterパラメータは単なる引用符で囲む必要があります。 RowFilter =(sKey& "= '"&row(sKey).ToString()& "'") – Paxsentry

3

LINQメソッドを使用することをお勧めします.LINQには、これを処理できる結合演算子があります。

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

KeeperOfTheSoul:応答に感謝します。私はvb.netのテーブルに参加する方法を知る必要があります。 – stewdaddy5000

+0

LINQは普通の古いネットオブジェクトとコレクションクラスで使うことができますが、IEnumerable(Of T)を実装しているものと一緒に作業するための非常に強力な方法です。 –

0
AsEnumerableは

VAR量= DataTable1()AsEnumerable()LINQで使用することができる

もの。 var customers = DataTable2()。AsEnumerable();量でQからクリスChilvers

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.PROJECTには顧客でCに参加c.projectを等しい_ 選択数量= Q、顧客= C

関連する問題