【VB.NET】DataSet DataTable DataColumn DataRow の使い方をわかりやすく解説します。
VB.NETでコーディングしていれば避けては通れないであろう、 DataSet の説明です。
全体像
まずはイメージを掴んで欲しいので図を描きました。
データベースをイメージするとわかりやすいかと思いますが、DataSet がデータテーブルを持っていてDataTableがカラムとDataRowを持っているイメージです。
データにアクセスする場合は、
DataSet⇒DataTable⇒DataRow⇒DataColumnの順に指定していきます。
| System.Data.DataSetクラス(データベースのDBに相当) | ||
| System.Data.DataTableクラス(データベースのテーブルに相当) | ||
| System.Data.DataColumnクラス(データベースのカラムに相当) | ||
| System.Data.DataRowクラス(データベースのレコードに相当) | ||
宣言・初期化の仕方
それぞれのオブジェクトの初期化ですが、DataSet と DataTable ならびに DataColumn は初期化が可能ですが、DataRow は型指定からは初期化出来ません。
DataRow はレコードという性質上、テーブルの定義によって作成するレコードが決められるためです。
DataRow の初期化は DataTable の定義を設定後に NewRow()メソッドを使用してインスタン化します。
Module Module1
Sub Main()
' DataSet オブジェクト作成
Dim ds As DataSet = New DataSet
' DataTable オブジェクト作成
Dim dt As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc As DataColumn = New DataColumn
' DataRow オブジェクト作成
' Dim dr As DataRow = New DataRow これはNG
' データテーブルからDataRow オブジェクトを作成する
Dim dr As DataRow = dt.NewRow
End Sub
End Module
誰の持ち物なのか
イメージ図からも分かるように、
DataSet は DataTable を持てます。
DataTable は DataColumn と DataRow を持てます。
逆に言うと
DataColumn は、DataTable に格納することが出来ます。
DataRow は、DataTable に格納することが出来ます。
DataTable は、DataSet に格納することが出来ます。
DataSet は DataTable を設定することで、複数のテーブル情報を管理出来るようになります。
Module Module1
Sub Main()
' DataSet オブジェクト作成
Dim ds As DataSet = New DataSet
' DataTable オブジェクト作成
Dim dt As DataTable = New DataTable
' DataColumn オブジェクト作成
Dim dc As DataColumn = New DataColumn
' DataRow オブジェクト作成
' Dim dr As DataRow = New DataRow これはNG
' データテーブルからオブジェクトを作成する
Dim dr As DataRow = dt.NewRow
' DataColumn を DataTable に格納
dt.Columns.Add(dc)
' DataRow を DataTable に格納
dt.Rows.Add(dr)
' DataTable を DataSet に格納
ds.Tables.Add(dt)
End Sub
End Module
DataTable
DataTable は、テーブル名を持てます。
DataTable を DataSet に格納すると自動で「Table + n (連番) 」というテーブル名を振られますが、任意にテーブル名を付ける事も可能です。
テーブル名を付けるとインデックス指定以外にもテーブル名で指定することが出来ます。
Module Module1
Sub Main()
' DataSet オブジェクト作成
Dim ds As DataSet = New DataSet
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable
Dim dt2 As DataTable = New DataTable
Dim dt3 As DataTable = New DataTable
' DataTable を DataSet に格納
ds.Tables.Add(dt1)
ds.Tables.Add(dt2)
ds.Tables.Add(dt3)
Console.WriteLine(ds.Tables(0).TableName) 'Table1
Console.WriteLine(ds.Tables(1).TableName) 'Table2
Console.WriteLine(ds.Tables(2).TableName) 'Table3
Console.WriteLine(ds.Tables("table1").TableName) 'Table1
Console.WriteLine(ds.Tables("table2").TableName) 'Table2
Console.WriteLine(ds.Tables("table3").TableName) 'Table3
'テーブル名変更
dt2.TableName = "T2"
Console.WriteLine(ds.Tables("table1").TableName) 'Table1
Console.WriteLine(ds.Tables("T2").TableName) 'T2
'テーブル名が変わったため System.NullReferenceException 発生
Console.WriteLine(ds.Tables("table2").TableName)
End Sub
End Module
宣言と同時にテーブルを指定することも可能です。
指定しない場合、名無しのテーブルが作成されます。
Module Module1
Sub Main()
' DataTable オブジェクト作成
Dim dt1 As DataTable = New DataTable("T1")
Dim dt2 As DataTable = New DataTable("あ")
Dim dt3 As DataTable = New DataTable
Console.WriteLine(dt1.TableName) 'T1
Console.WriteLine(dt2.TableName) 'あ
Console.WriteLine(dt3.TableName) '
End Sub
End Module
DataColumn
DataColumn の 宣言
New DataColumn() New DataColumn(カラム名) New DataColumn(カラム名,型)
引数を指定しないと、カラム名なし、型 String
カラム名を指定すると、型 String
が設定されます。
サンプルコード
Imports System.Boolean
Module Module1
Sub Main()
' DataColumn(c1)を宣言
Dim c1 = New DataColumn()
' DataColumn(c2)を宣言
Dim c2 = New DataColumn("c2")
' DataColumn(c3)を宣言
Dim c3 = New DataColumn("c3", Type.GetType("System.String"))
' DataColumn(c4)を宣言
Dim c4 = New DataColumn("c4", Type.GetType("System.Int32"))
' DataColumn(c5)を宣言
Dim c5 = New DataColumn("c5", Type.GetType("System.DateTime"))
' DataColumn(c6)を宣言
Dim c6 = New DataColumn("c6", Type.GetType("System.Boolean"))
Console.WriteLine(c1.ColumnName & ":" & c1.DataType.ToString)
Console.WriteLine(c2.ColumnName & ":" & c2.DataType.ToString)
Console.WriteLine(c3.ColumnName & ":" & c3.DataType.ToString)
Console.WriteLine(c4.ColumnName & ":" & c4.DataType.ToString)
Console.WriteLine(c5.ColumnName & ":" & c5.DataType.ToString)
Console.WriteLine(c6.ColumnName & ":" & c6.DataType.ToString)
' System.String
'c2: System.String
'c3: System.String
'c4: System.Int32
'c5: System.DateTime
'c6: System.Boolean
' 続行するには何かキーを押してください...
End Sub
End Module
カラムで指定した型しかレコードに入れられません。
Imports System.Boolean
Module Module1
Sub Main()
' DataColumn(c1)を宣言
Dim c1 = New DataColumn()
' DataColumn(c2)を宣言
Dim c2 = New DataColumn("c2")
' DataColumn(c3)を宣言
Dim c3 = New DataColumn("c3", Type.GetType("System.String"))
' DataColumn(c4)を宣言
Dim c4 = New DataColumn("c4", Type.GetType("System.Int32"))
' DataColumn(c5)を宣言
Dim c5 = New DataColumn("c5", Type.GetType("System.DateTime"))
' DataColumn(c6)を宣言
Dim c6 = New DataColumn("c6", Type.GetType("System.Boolean"))
Console.WriteLine(c1.ColumnName & ":" & c1.DataType.ToString)
Console.WriteLine(c2.ColumnName & ":" & c2.DataType.ToString)
Console.WriteLine(c3.ColumnName & ":" & c3.DataType.ToString)
Console.WriteLine(c4.ColumnName & ":" & c4.DataType.ToString)
Console.WriteLine(c5.ColumnName & ":" & c5.DataType.ToString)
Console.WriteLine(c6.ColumnName & ":" & c6.DataType.ToString)
' System.String
'c2: System.String
'c3: System.String
'c4: System.Int32
'c5: System.DateTime
'c6: System.Boolean
' 続行するには何かキーを押してください...
Dim dt = New DataTable("T1")
dt.Columns.Add(c1)
dt.Columns.Add(c2)
dt.Columns.Add(c3)
dt.Columns.Add(c4)
dt.Columns.Add(c5)
dt.Columns.Add(c6)
Dim dr = dt.NewRow()
dr.Item("c4") = "A"
' System.ArgumentException : 入力文字列の形式が正しくありません。
' 列 c4 に を格納できませんで した。 必要な型は Int32 です。
End Sub
End Module
DataSet DataTable DataColumn DataRow まとめ
全体の流れをサンプルコードで確認してください。
Module Module1
Sub Main()
' DataSet を宣言
Dim ds = New DataSet
' DataTable(T1)を宣言
Dim dt = New DataTable("T1")
' DataColumn(Id)を宣言
Dim id = New DataColumn("Id", Type.GetType("System.Int32"))
' DataColumn(Name)を宣言
Dim name = New DataColumn("Name", Type.GetType("System.String"))
' DataColumn(Id)を追加
dt.Columns.Add(id)
' DataColumn(Name)を追加
dt.Columns.Add(name)
' 新規レコード1を宣言
Dim dr1 = dt.NewRow
' 行1をセット(カラム名で指定)
dr1("id") = 1
dr1("Name") = "犬塚"
' 新規レコード2を宣言
Dim dr2 = dt.NewRow
' 行2をセット(インデックスで指定)
dr2(0) = 2
dr2(1) = "猫塚"
' テーブル(T1)にレコードを追加
dt.Rows.Add(dr1)
dt.Rows.Add(dr2)
' データセットにテーブルを追加
ds.Tables.Add(dt)
'テーブル名の取得(名前指定)
Console.WriteLine(ds.Tables("T1").TableName)
'テーブル.カラム名の取得(名前指定)
Console.WriteLine(ds.Tables("T1").Columns("id").ColumnName)
'テーブル.カラム値の取得(名前指定)
Console.WriteLine(ds.Tables("T1").Rows(0).Item("Id"))
'テーブル名の取得(インデックス)
Console.WriteLine(ds.Tables(0).TableName)
'テーブル.カラム名の取得(インデックス)
Console.WriteLine(ds.Tables(0).Columns(1).ColumnName)
'テーブル.カラム値の取得(インデックス)
Console.WriteLine(ds.Tables(0).Rows(1).Item(1))
'出力
'T1
'id
'1
'T1
'name
'猫塚
End Sub
End Module



コメント