DataTableによるメモリ上のデータベース

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オブジェクトをDataTableNewRow()メソッドで作成します。続いて、その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から読み込むこともできるので、帳簿など各種の記録用アプリケーションを作るのにも適しているでしょう。

プログラムソース表示

プログラミング資料庫 > Windowsプログラミング研究室