Back to Top

プログラムの覚書

Category: DataTable

VB.NETのDataTable列(Columns)

DataTableで使用する列(Columnsプロパティ)の操作を説明します。

列(フィールド)の追加および主キーの設定をする

Dim tbl As DataTable = New DataTable("Table1")
Dim PrimaryColumn As DataColumn

PrimaryColumn = tbl.Columns.Add("ID", Type.GetType("System.Int32"))

tbl.Columns.Add("Item1", Type.GetType("System.String"))
tbl.Columns.Add("Item2", Type.GetType("System.String"))
tbl.Columns.Add("Item3", Type.GetType("System.Double"))

'フィールドに主キーを設定(IDを主キーにします)
tbl.PrimaryKey = New DataColumn() {PrimaryColumn}

 

フィールド名の存在チェックおよびフィールド名の削除をする

フィールド名が主キーに設定されている時は、削除することはできません。

Dim ItemName = "Item1"
Dim columns As DataColumnCollection = tbl.Columns

'フィールドの存在チェック
If columns.Contains(ItemName) Then
    '削除できるかチェック 
    If columns.CanRemove(columns(ItemName)) Then 
        'フィールド削除        
        columns.Remove(ItemName)
    End If
End If

 

フィールド数を取得する

MessageBox.Show(Tbl.Columns.Count)

 

フィールドでループ

Dim s As String = ""
For Each Col As DataColumn In tbl.Columns
    s &= Col.ColumnName & System.Environment.NewLine
Next
MessageBox.Show(s)

 

主キーの大文字と小文字を区別する

主キーが文字列の場合、主キーの大文字と小文字を区別する場合はCaseSensitiveをTrueに設定します。

Dim tbl As DataTable = New DataTable("Table1")
Dim PrimaryColumn As DataColumn
Dim row As DataRow

PrimaryColumn = tbl.Columns.Add("ID", Type.GetType("System.String"))
tbl.Columns.Add("Item1", Type.GetType("System.String"))
tbl.Columns.Add("Item2", Type.GetType("System.String"))

tbl.PrimaryKey = New DataColumn() {PrimaryColumn}

'主キーの大文字小文字を区別する
tbl.CaseSensitive = True

'1列目
row = tbl.NewRow
row("ID") = "AAA1"
row("Item1") = "A1"
row("Item2") = "A2"
tbl.Rows.Add(row)

'2列目
row = tbl.NewRow
row("ID") = "aaa1"
row("Item1") = "B1"
row("Item2") = "B2"
tbl.Rows.Add(row)

上のコードでCaseSensitiveがFalseの場合2列目の追加でエラーになります。

 

VB.NETのDataTable行(Rows)

DataTableで使用する行(Rows)の操作説明をします。

行を追加します

任意の行に追加する場合はInsertAtを使用します。

Dim tbl As DataTable = New DataTable("table1")

tbl.Columns.Add("Item1")
tbl.Columns.Add("Item2")
tbl.Columns.Add("Item3")


Dim row As DataRow

'1列目
row = tbl.NewRow
row("Item1") = "A1"
row("Item2") = "A2"
row("Item3") = "A3"
tbl.Rows.Add(row)

'2列目
row = tbl.NewRow
row("Item1") = "B1"
row("Item2") = "B2"
row("Item3") = "B3"
tbl.Rows.Add(row)

'途中挿入
row = tbl.NewRow
row("Item1") = "C1"
row("Item2") = "C2"
row("Item3") = "C3"
tbl.Rows.InsertAt(row, 1)

 

オブジェクトのインデックスを取得します

Dim no As Integer = tbl.Rows.IndexOf(row)
MessageBox.Show(no.ToString)

 

行を削除します

DataRowの削除する方法RemoveとDeleteの二つあります。
RemoveメソッドはDataRowCollectionからDataRowを削除します。
Deleteメソッドは削除対象の行をマークします。(実際に削除しません)

'位置指定による削除
tbl.Rows.RemoveAt(0)

'オブジェクト指定による削除
tbl.Rows.Remove(row)

'削除フラグを付ける
tbl.Rows(0).Delete()

※DataViewを使用している場合、Deleteにより削除した場合、DataRowCollection.CountとDataView.Countの結果に違いが出ます。
 

行数を取得する

 MessageBox.Show(tbl.Rows.Count.ToString)

 

行でループ

Dim s As String
For Each drow As DataRow In tbl.Rows
    s &= drow("Item1").ToString & System.Environment.NewLine
Next
MessageBox.Show(s)

 

データを抽出する

抽出にはSelectを使用します。SelectのパラメータはSQL文です。
Dim dr() As DataRow = DataTable.Select(“カラム名 = 値”)
Dim dr() As DataRow = DataTable.Select(“カラム名 = 値”, “カラム名 ASC または カラム名 DESC”)
戻り値は、DataRow型の配列を返します。

'インデックスを作成
tbl.DefaultView.Sort = "Item1"

'データの抽出
Dim dr() As DataRow = tbl.Select("Item1 = 'C1'", "Item1 ASC")

必ずしもインデックスを作成する必要はありません。

インデックスを作成すると抽出速度は上がりますが、インデックスを作成する時間がかかります。
 

編集処理

DataRowの複数カラムの値を更新する際に、BeginEditとEndEditメソッドで囲むことで速くなります。

Dim tbl As DataTable = New DataTable("table1")
Dim row As DataRow

tbl.Columns.Add("Item1")
tbl.Columns.Add("Item2")

'1列目
row = tbl.NewRow
row("Item1") = "A1"
row("Item2") = "A2"
tbl.Rows.Add(row)

'2列目
row = tbl.NewRow
row("Item1") = "B1"
row("Item2") = "B2"
tbl.Rows.Add(row)

'3列目
row = tbl.NewRow
row("Item1") = "C1"
row("Item2") = "C2"
tbl.Rows.Add(row)

For Each drow As DataRow In tbl.Rows
    'オブジェクトの編集開始
    drow.BeginEdit()

    drow("Item2") = "AAAAA"

    'オブジェクトの編集終了
    drow.EndEdit()
Next

'変更を反映する
tbl.AcceptChanges()

Dim s As String = ""
For Each drow As DataRow In tbl.Rows
    s &= drow("Item2").ToString & System.Environment.NewLine
Next
MessageBox.Show(s)