【VB.NET】DataSet DataTable DataColumn DataRow の使い方をわかりやすく解説します。

VB.NET
この記事は約15分で読めます。

【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

 

コメント

タイトルとURLをコピーしました