DataTableを使うと、メモリ上にデータベースを作ることができます。データベースといっても、ちょっとしたテーブル構造を保持して簡単な条件検索や絞込みができたり、XMLでシリアライズ/デシリアライズできたりする程度ですが、.NET Framework標準の機能なので、気軽にXMLデータベースが使えるのは利点でしょう。
DataTableの構造とデータ作成
実際にデータベースを利用する際は、まずDataTableを作成し、そこに列構造(カラム)を定義します。このカラムは、データの各項目の名前やデータ型の定義です。テーブルにカラムを追加する際は、DataTableのカラムを保持するColumnsコレクションに列名とデータ型を指定してAddするか、列名とデータ型だけでなくさまざまな属性を設定したColumnオブジェクトをAddします。
DataTable dtTest = new DataTable(); dtTest.Columns.Add("No", typeof(Int32)); dtTest.Columns.Add("Name", typeof(String));
これで「整数型データ、Noと文字列型データ、Nameからなるデータを保持するデータベーステーブルdtTest」ができました。あとは、このデータベースの構造に沿ったデータ行(DataRow)を作成し、そのDataRowオブジェクトをテーブルのデータ行を保持するRowsコレクションに追加して行きます。
DataRow drAdd; drAdd = dtTest.NewRow(); drAdd["No"] = 1; drAdd["Name"] = "abc"; dtTest.Rows.Add(drAdd);
データ行を追加する際は、まずテーブルの構造に沿ったデータ行DataRowオブジェクトをDataTableのNewRow()メソッドで作成します。続いて、そのDataRowの各列にデータを格納したら、それをRowsコレクションにAddすると、データ行として追加されます。
C#では、DataRowオブジェクト内のデータに列名を入れた[]でアクセスできるので、データの参照も同じように
dtTest.Rows[0]["No"]
などとできます(この例では、dtTestの最初の行のNoを参照)。テーブルのデータをまとめて処理したい時には、Rowsコレクションをforeachループで順次参照していきましょう。たとえば、以下のようにするとdtTestの全データをコンソールに出力できます。
foreach (DataRow drItem in dtTest.Rows) { Console.WriteLine("No-" + drItem["No"] + " Name-" + drItem["Name"]); }
さらに、DataViewを使うと、データを一定の条件で抽出することもできます。
DataView dvTest = dtTest.DefaultView; dvTest.RowFilter = "No > 3"; Console.WriteLine("No > 3のデータ表示"); for (int i = 0;i < dvTest.Count;i++) { Console.WriteLine("No-" + dvTest[i]["No"] + " Name-" + dvTest[i]["Name"]); }
RowsFilterには、数字や文字列の条件を色々指定できるので、ちょっとしたデータベース検索や抽出処理を、ほとんどコードを書かないで実現できます。
DataTableを少し使ってみた感じでは、本格的なデータベースとして使うのは難しいですが、アプリケーションのデータ管理にはなかなか便利ですね。DataSetを使うと、テーブルのデータをXMLに書き出したり逆にXMLから読み込むこともできるので、帳簿など各種の記録用アプリケーションを作るのにも適しているでしょう。