概要
DataTable には Merge という便利な機能があります。Merge について説明します。
基本構文
テーブル1.Merge(テーブル2)
内容
マージするDataTabl に 存在しないカラムが追加されます。存在するとは対応するカラムの名前が無いと言う事です。
サンプルコードの例だと dt1 にある dc は追加されず、 dc2_2 のみが追加されます。
サンプルコードです。
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc1_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc1_2 As DataColumn = New DataColumn("dc1_2", GetType(String))
dt1.Columns.Add(dc1_1)
dt1.Columns.Add(dc1_2)
' DataTable オブジェクト作成
Dim dt2 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc2_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc2_2 As DataColumn = New DataColumn("dc2_2", GetType(String))
dt2.Columns.Add(dc2_1)
dt2.Columns.Add(dc2_2)
' マージ前の確認
For Each c In dt1.Columns
Console.WriteLine(c.ToString) 'dc dc1_2
Next
For Each c In dt2.Columns
Console.WriteLine(c.ToString) 'dc dc2_2
Next
' マージ実行 カラム dc は両方にある
dt1.Merge(dt2)
' マージ後の確認
For Each c In dt1.Columns
Console.WriteLine(c.ToString) 'dc dc1_2 dc2_2
Next
For Each c In dt2.Columns
Console.WriteLine(c.ToString) 'dc dc2_2
Next
End Sub
End Module
カラム名は同じだがデータ型が違う場合
カラム名は同じだがデータ型が違う場合は System.Data.DataException が発生します。
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc1_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc1_2 As DataColumn = New DataColumn("dc1_2", GetType(String))
dt1.Columns.Add(dc1_1)
dt1.Columns.Add(dc1_2)
' DataTable オブジェクト作成
Dim dt2 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc2_1 As DataColumn = New DataColumn("dc", GetType(String)) 'String型
Dim dc2_2 As DataColumn = New DataColumn("dc2_2", GetType(String))
dt2.Columns.Add(dc2_1)
dt2.Columns.Add(dc2_2)
' マージ前の確認
For Each c In dt1.Columns
Console.WriteLine(c.ToString) 'dc dc1_2
Next
For Each c In dt2.Columns
Console.WriteLine(c.ToString) 'dc dc2_2
Next
' マージ実行
dt1.Merge(dt2)
' マージ後の確認
For Each c In dt1.Columns
Console.WriteLine(c.ToString) 'dc dc1_2 dc2_2
Next
For Each c In dt2.Columns
Console.WriteLine(c.ToString) 'dc dc2_2
Next
End Sub
End Module
ハンドルされていない例外: System.Data.DataException: .dc と .dc は競合するプロパティがあります : DataType プロパティの不一致 場所 System.Data.Merger.MergeSchema(DataTable table) 場所 System.Data.Merger.MergeTableData(DataTable src) 場所 System.Data.Merger.MergeTable(DataTable src) 場所 System.Data.DataTable.Merge(DataTable table, Boolean preserveChanges, MissingSchemaAction missingSchemaAction) 場所 System.Data.DataTable.Merge(DataTable table) 場所 ConsoleApplication1.Module1.Main() 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 34 続行するには何かキーを押してください . . .
マージ後にマージされたデータテーブルにカラムを追加してみる
マージ後は、相互に影響を与えません。
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc1_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc1_2 As DataColumn = New DataColumn("dc1_2", GetType(String))
dt1.Columns.Add(dc1_1)
dt1.Columns.Add(dc1_2)
' DataTable オブジェクト作成
Dim dt2 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc2_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc2_2 As DataColumn = New DataColumn("dc2_2", GetType(String))
dt2.Columns.Add(dc2_1)
dt2.Columns.Add(dc2_2)
' マージ実行
dt1.Merge(dt2)
' dt2にカラムを追加
Dim dc2_3 As DataColumn = New DataColumn("dc2_3", GetType(String))
dt2.Columns.Add(dc2_3)
For Each c In dt1.Columns
Console.WriteLine(c.ToString) 'dc dc1_2 dc2_2
Next
For Each c In dt2.Columns
Console.WriteLine(c.ToString) 'dc dc2_2 dc2_3
Next
End Sub
End Module
レコード入れた状態でマージしてみる。
下記のようなレコードを各テーブルに登録した状態でマージしてみます。
テーブル1
| dc | dc1_2 |
| 1 | あ |
| 2 | い |
テーブル2
| dc | dc2_2 |
| 1 | A |
| 3 | B |
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc1_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc1_2 As DataColumn = New DataColumn("dc1_2", GetType(String))
dt1.Columns.Add(dc1_1)
dt1.Columns.Add(dc1_2)
' レコード追加
dt1.Rows.Add(1, "あ")
dt1.Rows.Add(2, "い")
' DataTable オブジェクト作成
Dim dt2 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc2_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc2_2 As DataColumn = New DataColumn("dc2_2", GetType(String))
dt2.Columns.Add(dc2_1)
dt2.Columns.Add(dc2_2)
' レコード追加
dt2.Rows.Add(1, "A")
dt2.Rows.Add(3, "B")
' マージ実行
dt1.Merge(dt2)
' 出力
For Each r As DataRow In dt1.Rows
For Each c As Object In r.ItemArray
If c.Equals(DBNull.Value) Then
Console.Write(" ")
Else
Console.Write(c)
End If
Console.Write(",")
Next
Console.WriteLine()
Next
End Sub
End Module
1,あ, , 2,い, , 1, ,A, 3, ,B, 続行するには何かキーを押してください . . .
4レコードになっていますね。
主キーを設定してマージしてみる
両方のテーブルに存在する dc を主キー設定します。
dt1.PrimaryKey = New DataColumn() {dt1.Columns("dc")}
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc1_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc1_2 As DataColumn = New DataColumn("dc1_2", GetType(String))
dt1.Columns.Add(dc1_1)
dt1.Columns.Add(dc1_2)
dt1.PrimaryKey = New DataColumn() {dt1.Columns("dc")}
' レコード追加
dt1.Rows.Add(1, "あ")
dt1.Rows.Add(2, "い")
' DataTable オブジェクト作成
Dim dt2 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc2_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc2_2 As DataColumn = New DataColumn("dc2_2", GetType(String))
dt2.Columns.Add(dc2_1)
dt2.Columns.Add(dc2_2)
' レコード追加
dt2.Rows.Add(1, "A")
dt2.Rows.Add(3, "B")
' マージ実行
dt1.Merge(dt2)
For Each r As DataRow In dt1.Rows
For Each c As Object In r.ItemArray
If c.Equals(DBNull.Value) Then
Console.Write(" ")
Else
Console.Write(c)
End If
Console.Write(",")
Next
Console.WriteLine()
Next
End Sub
End Module
1,あ,A, 2,い, , 3, ,B, 続行するには何かキーを押してください . . .
主キーである カラム dc が統合されて dc = 1 のレコードが1件になりました。
マージされる側に主キーを設定してみる。
dt2 側に主キーを設定してみます。
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc1_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc1_2 As DataColumn = New DataColumn("dc1_2", GetType(String))
dt1.Columns.Add(dc1_1)
dt1.Columns.Add(dc1_2)
' DataTable オブジェクト作成
Dim dt2 As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc2_1 As DataColumn = New DataColumn("dc", GetType(Integer))
Dim dc2_2 As DataColumn = New DataColumn("dc2_2", GetType(String))
dt2.Columns.Add(dc2_1)
dt2.Columns.Add(dc2_2)
' マージされる側に主キーを設定
dt2.PrimaryKey = New DataColumn() {dt2.Columns("dc")}
' 主キーの有無を確認
Console.WriteLine(dt1.PrimaryKey.Length) '0
' マージ実行
dt1.Merge(dt2)
' 主キーの有無を確認
Console.WriteLine(dt1.PrimaryKey.Length) '1
End Sub
End Module
0 1 続行するには何かキーを押してください . . .
主キー設定もマージされます。

コメント