今まで使ったことないのですが、DataTableにはリレーショナルデータベースのように、リレーションが張れるようです。
ということで、ちょっと使ってみました。
デザイナを使った方法
下記のような構成テーブルのデータベース(今回はmdb)を用意し、VisualStudioに読み込ませて、DataSetを作成します。
●positionテーブル
・id列
・position_name列
●staffテーブル
・id列
・staff_name列
・position_id列
テストデータは下記のようにしてみました。
positionテーブル
┌─┬───────┐
│id│position_name │
├─┼───────┤
│1 │営業部 │
├─┼───────┤
│2 │開発部 │
├─┼───────┤
│3 │サポート部 │
└─┴───────┘
staffテーブル
┌─┬─────┬──────┐
│id│staff_name│position_id │
├─┼─────┼──────┤
│1 │山田太郎 │1 │
├─┼─────┼──────┤
│2 │新岡明里 │1 │
├─┼─────┼──────┤
│3 │遠野貴樹 │2 │
├─┼─────┼──────┤
│4 │目黒亜由 │3 │
└─┴─────┴──────┘
positionテーブルとstaffテーブルは1対多の関係で、staff テーブルの posion_id 列で関係づけられています。
デザイナを使った場合、リレーションシップはマウスで簡単に作成できます。
下記(db1DataSet)のような感じです。
子テーブルの DataRow から親テーブルの該当する DataRow を呼び出すには、DataRow.GetParentRow(リレーション名) とすればいいようです。
逆に、親テーブルのDataRow から子テーブルの該当する DataRow を呼び出すには、DataRow.GetChildRows(リレーション名) とすればいいようです。
サンプルはこんな感じです。(C#)
private void button1_Click(object sender, EventArgs e){
//テーブルアダプタインスタンス生成
db1DataSetTableAdapters.staffTableAdapter adpStaff =
new db1DataSetTableAdapters.staffTableAdapter();
db1DataSetTableAdapters.positionTableAdapter adpPosition =
new db1DataSetTableAdapters.positionTableAdapter();
db1DataSet dset = new db1DataSet();
//DBより各テーブルにデータ取得
adpStaff.Fill(dset.staff);
adpPosition.Fill(dset.position);
//staffテーブルと外部キーに対応する親のpositionのデータ出力
foreach (DataRow row in dset.staff)
{
DataRow fkRow = row.GetParentRow("position_staff");
Console.Write(row["staff_name"].ToString() + " ");
Console.Write(fkRow["position_name"].ToString() + "\n");
}
Console.WriteLine();
//positionテーブルと外部キーに対応する子のstaffのデータ出力
foreach (DataRow row in dset.position)
{
Console.WriteLine(row["position_name"].ToString() + "に所属するStaff");
DataRow[] fkRows = row.GetChildRows("position_staff");
foreach (DataRow fkRow in fkRows)
{
Console.WriteLine(" " + fkRow["staff_name"].ToString() );
}
}
}
出力はこのようになります。
山田太郎 営業部
新岡明里 営業部
遠野貴樹 開発部
目黒亜由 サポート部
営業部に所属するStaff
新岡明里
開発部に所属するStaff
遠野貴樹
サポート部に所属するStaff
目黒亜由
次はコードだけでする方法ですが、それについては、(.Net)DataTableのリレーションPart2(コードだけでする方法)に書きます。