人気ブログランキング | 話題のタグを見る
(.Net)DataTableのリレーションPart1(デザイナを使った方法)
今まで使ったことないのですが、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)のような感じです。
(.Net)DataTableのリレーションPart1(デザイナを使った方法)_e0091163_035951.jpg

子テーブルの 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(コードだけでする方法)に書きます。
by jehoshaphat | 2010-06-05 00:39 | .Net開発


<< (.Net)DataTable... (.Net)DataGridV... >>