Back to Top

プログラムの覚書

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)

 

VB.NET スキーマ情報を取得する

スキーマ情報(全テーブル名または全列名)の取得方法を記載します。

スキーマ情報を取得する

Dim builder As SqlConnectionStringBuilder = New SqlConnectionStringBuilder()
builder.DataSource = ".\SQLEXPRESS"
builder.AttachDBFilename = "D:\DB\TestDB.mdf"
builder.IntegratedSecurity = True
builder.UserInstance = True
builder.MultipleActiveResultSets = True
Dim ConnectString As String = builder.ToString()

Using sqlConnect As New SqlConnection(ConnectString)
    sqlConnect.Open()

    '全てのテーブルを取得します。
    Dim schemaTable As DataTable = sqlConnect.GetSchema("Tables")

    Dim command As SqlCommand = sqlConnect.CreateCommand()
    command.CommandText = "SELECT * FROM Table_1"
    Dim dtReader As SqlDataReader = command.ExecuteReader()

    'テーブル内の列情報を取得します。
    schemaTable = dtReader.GetSchemaTable()

    dtReader.Close()
End Using