【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
コメント