3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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)のような感じです。

子テーブルの 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(コードだけでする方法)に書きます。