2013年12月15日日曜日

【VB.NET】DataViewRowStateで行の状態での抽出

DataViewRowStateを条件指定して行の状態で行を抽出します。

DataViewRowStateのメンバー(詳細はMSDN DataViewRowState列挙体を参照してください)
メンバー名説明
Added新しい行。
Deleted削除された行。
ModifiedCurrent変更された元のデータの現在のバージョン(ModifiedOriginalを参照)。
ModifiedOriginal変更されたデータの元のバージョン(データは変更されても、ModifiedCurrentとして利用可能です)。
Unchanged変更されていない行。

DataTable.Selectメッソドでの使用例
Module Module1
    Sub main()
        'サンプルデータテーブル
        Dim sampleTable As New DataTable
 
        sampleTable.TableName = "SampleTable"
        sampleTable.Columns.Add("ItemCD", Type.GetType("System.String"))
        sampleTable.Columns.Add("ItemName", Type.GetType("System.String"))
        sampleTable.Columns.Add("Price", Type.GetType("System.Double"))
 
        sampleTable.Rows.Add("001", "商品001", 110)
        sampleTable.Rows.Add("002", "商品002", 120)
        sampleTable.Rows.Add("003", "商品003", 130)
        sampleTable.Rows.Add("004", "商品004", 140)
        sampleTable.Rows.Add("005", "商品005", 150)
        sampleTable.Rows.Add("006", "商品006", 160)
        sampleTable.Rows.Add("007", "商品007", 170)
        sampleTable.Rows.Add("008", "商品008", 180)
        sampleTable.Rows.Add("009", "商品009", 190)
 
        'テーブルの変更をコミット‥DataRowをAdded→Modifiedへ
        sampleTable.AcceptChanges()
 
        'データを変更
        sampleTable.Rows(0)("Price") = 510
        sampleTable.Rows(3)("Price") = 530
 
        'データを削除
        sampleTable.Rows(1).Delete()
        sampleTable.Rows(4).Delete()
 
        'データを追加
        sampleTable.Rows.Add("010", "商品020", 200)
        sampleTable.Rows.Add("011", "商品020", 210)
 
        '変更された行
        Console.WriteLine("--- 変更された行 ---")
        Dim rws() As DataRow = sampleTable.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
        For i = 0 To rws.Length - 1
            Console.WriteLine(rws(i)("ItemCD").ToString & " " & rws(i)("ItemName").ToString & " " & rws(i)("Price").ToString)
        Next
 
        '変更された行の元の値
        Console.WriteLine("--- 変更された行の元の値 ---")
        rws = sampleTable.Select(Nothing, Nothing, DataViewRowState.ModifiedOriginal)
        For i = 0 To rws.Length - 1
            Console.WriteLine(rws(i)("ItemCD").ToString & " " & rws(i)("ItemName").ToString & " " & rws(i)("Price").ToString)
        Next
 
        '削除された行の元の値
        Console.WriteLine("--- 削除された行の元の値 ---")
        rws = sampleTable.Select(Nothing, Nothing, DataViewRowState.Deleted)
        For i = 0 To rws.Length - 1
            Console.WriteLine(rws(i)("ItemCD", DataRowVersion.Original).ToString & " " & _
                              rws(i)("ItemName", DataRowVersion.Original).ToString & " " & rws(i)("Price", DataRowVersion.Original).ToString)
        Next
 
        '追加された行
        Console.WriteLine("--- 追加された行の表示 ---")
        rws = sampleTable.Select(Nothing, Nothing, DataViewRowState.Added)
        For i = 0 To rws.Length - 1
            Console.WriteLine(rws(i)("ItemCD").ToString & " " & rws(i)("ItemName").ToString & " " & rws(i)("Price").ToString)
        Next
 
        '変更されてない行
        Console.WriteLine("--- 変更されてない行 ---")
        rws = sampleTable.Select(Nothing, Nothing, DataViewRowState.Unchanged)
        For i = 0 To rws.Length - 1
            Console.WriteLine(rws(i)("ItemCD").ToString & " " & rws(i)("ItemName").ToString & " " & rws(i)("Price").ToString)
        Next
 
    End Sub
End Module
実行結果
 ※DataTable.SelectメソッドでのModifiedOriginalは変更後の値が表示されるようです。


DataViewでの使用例
Module Module1
 
    Sub Main()
        'サンプルデータテーブル
        Dim sampleTable As New DataTable
 
        sampleTable.TableName = "SampleTable"
        sampleTable.Columns.Add("ItemCD", Type.GetType("System.String"))
        sampleTable.Columns.Add("ItemName", Type.GetType("System.String"))
        sampleTable.Columns.Add("Price", Type.GetType("System.Double"))
 
        sampleTable.Rows.Add("001", "商品001", 110)
        sampleTable.Rows.Add("002", "商品002", 120)
        sampleTable.Rows.Add("003", "商品003", 130)
        sampleTable.Rows.Add("004", "商品004", 140)
        sampleTable.Rows.Add("005", "商品005", 150)
        sampleTable.Rows.Add("006", "商品006", 160)
        sampleTable.Rows.Add("007", "商品007", 170)
        sampleTable.Rows.Add("008", "商品008", 180)
        sampleTable.Rows.Add("009", "商品009", 190)
 
        'テーブルの変更をコミット‥DataRowをAdded→Modifiedへ
        sampleTable.AcceptChanges()
 
        'データを変更
        sampleTable.Rows(0)("Price") = 510
        sampleTable.Rows(3)("Price") = 530
 
        'データを削除
        sampleTable.Rows(1).Delete()
        sampleTable.Rows(4).Delete()
 
        'データを追加
        sampleTable.Rows.Add("010", "商品020", 200)
        sampleTable.Rows.Add("011", "商品020", 210)
 
        '変更された行
        Console.WriteLine("--- 変更された行 ---")
        Dim dv As New DataView(sampleTable)
        dv.RowStateFilter = DataViewRowState.ModifiedCurrent
        For i = 0 To dv.Count - 1
            Console.WriteLine(dv(i)("ItemCD").ToString & " " & dv(i)("ItemName").ToString & " " & dv(i)("Price").ToString)
        Next
 
        '変更された行の元の値
        Console.WriteLine("--- 変更された行の元の値 ---")
        dv.RowStateFilter = DataViewRowState.ModifiedOriginal
        For i = 0 To dv.Count - 1
            Console.WriteLine(dv(i)("ItemCD").ToString & " " & dv(i)("ItemName").ToString & " " & dv(i)("Price").ToString)
        Next
 
        '削除された行の元の値
        Console.WriteLine("--- 削除された行の元の値 ---")
        dv.RowStateFilter = DataViewRowState.Deleted
        For i = 0 To dv.Count - 1
            Console.WriteLine(dv(i)("ItemCD").ToString & " " & _
                              dv(i)("ItemName").ToString & " " & dv(i)("Price").ToString)
        Next
 
        '追加された行
        Console.WriteLine("--- 追加された行の表示 ---")
        dv.RowStateFilter = DataViewRowState.Added
        For i = 0 To dv.Count - 1
            Console.WriteLine(dv(i)("ItemCD").ToString & " " & dv(i)("ItemName").ToString & " " & dv(i)("Price").ToString)
        Next
 
        '変更されてない行
        Console.WriteLine("--- 変更されてない行 ---")
        dv.RowStateFilter = DataViewRowState.Unchanged
        For i = 0 To dv.Count - 1
            Console.WriteLine(dv(i)("ItemCD").ToString & " " & dv(i)("ItemName").ToString & " " & dv(i)("Price").ToString)
        Next
    End Sub
 
End Module
実行結果

使用例はコンソールアプリケーションです。
VisualStudioの「新しいプロジェクト」から「コンソールアプリケーション」を選択しMain関数内にコードを記述します。
Ctrl+F5キーで実行します。


0 件のコメント:

コメントを投稿