いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

ADO.NET入門記-021 (DataRowに追加された拡張メソッド)(System.Data.DataRowExtensions, Field, SetField)


前回に引き続き、今回はDataRowに用意された拡張メソッドについて記述します。


.NET Framework 3.5になって、DataRowに以下の拡張メソッドが用意されました。

* Field
* SetField


尚、これらの拡張メソッドは、System.Data.DataRowExtensionsクラスに定義されています。
上記の拡張メソッドによって、別段新しい機能が追加されるわけではありません。


上記の拡張メソッド達は、以下のようにして使用します。

DataRow row = table.NewRow();

row.SetField("COL-1", 100);

int val1 = row.Field("COL-1");


つまり、フィールドの読み取り処理が型セーフになったという事になります。
今までは、

int val1 = (int) row["COL-1"];

のように、キャストが必要だった部分がなくなったって感じです。
これも、前回の拡張メソッドと同様に主にLinqで利用するために追加されたメソッドです。
Linqで処理を行う際に

where ((int) row["COL-1"]) >= 100

と書くよりも

where row.Field("COL-1") >= 100

と書ける方が記述性がいいです。


この拡張メソッド、当然普段の処理でも利用できます。
また、DataRowVersionを指定するタイプのオーバーロードも当然用意されています。


以下、サンプルです。

#region DataTableExtensionsSample-02

    public class DataTableExtensionsSample02 : IExecutable{

        public void Execute(){
            DataTable table = BuildSampleTable();

            //
            // 1列目の情報をint型で取得.
            // 2列目の情報をstring型で取得.
            //
            int    val1 = table.Rows[0].Field("COL-1");
            string val2 = table.Rows[0].Field("COL-2");
            PrintTable("Result:", table);

            //
            // 1列目の情報を変更.
            //
            table.Rows[0].SetField("COL-1", 100);
            PrintTable("Result:", table);

        }

        DataTable BuildSampleTable(){
            DataTable table = new DataTable();

            table.BeginInit();
            table.Columns.Add("COL-1", typeof(int));
            table.Columns.Add("COL-2");
            table.EndInit();

            table.BeginLoadData();
            for(int i = 0; i < 5; i++){
                table.LoadDataRow(new object[]{i, (i + 1).ToString()}, true);
            }
            table.EndLoadData();

            return table;
        }

        void PrintTable(string title, DataTable table){
            Console.WriteLine(title);

            foreach(DataRow row in table.Rows){
                Console.WriteLine("\t{0}, {1}", row[0], row[1]);
            }

            Console.WriteLine();
        }
    }
#endregion