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

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

(.Net)DataTableのリレーションPart2(コードだけでする方法)

(.Net)DataTable のリレーションPart1(デザイナを使った方法)の続きです。

コードだけでする方法

デザイナを使わずにリレーションを張るには、DataSet.Relations コレクションに、DataRelation インスタンスを追加すればいいようです。

こんな感じです。

テーブル構造データは前回と同じです。

private void button2_Click(object sender, EventArgs e)

{

//DataSet作成

DataSet dset = new DataSet();

//DataTable(position)作成

DataTable tblPosition = new DataTable("position");

tblPosition.Columns.Add(new DataColumn("id"));

tblPosition.Columns["id"].DataType = Type.GetType("System.Int32");

tblPosition.Columns.Add(new DataColumn("position_name"));

dset.Tables.Add(tblPosition);

//DataTable(staff)作成

DataTable tblStaff = new DataTable("staff");

tblStaff.Columns.Add(new DataColumn("id"));

tblStaff.Columns["id"].DataType = Type.GetType("System.Int32");

tblStaff.Columns.Add(new DataColumn("staff_name"));

tblStaff.Columns.Add(new DataColumn("position_id"));

tblStaff.Columns["position_id"].DataType = Type.GetType("System.Int32");

dset.Tables.Add(tblStaff);

//DataTable(position)にデータを追加

tblPosition.Rows.Add(new object[] { 1, "営業部" });

tblPosition.Rows.Add(new object[] { 2, "開発部" });

tblPosition.Rows.Add(new object[] { 3, "サポート部" });

//DataTable(staff)にデータを追加

tblStaff.Rows.Add(new object[] { 1, "山田太郎", 1 });

tblStaff.Rows.Add(new object[] { 2, "新岡明里", 1 });

tblStaff.Rows.Add(new object[] { 3, "遠野貴樹", 2 });

tblStaff.Rows.Add(new object[] { 4, "目黒亜由", 3 });

 

//リレーションを張る

dset.Relations.Add(

new DataRelation("position_staff",

tblPosition.Columns["id"],

tblStaff.Columns["position_id"])

);

 

//staffテーブルと外部キーに対応する親のpositionのデータ出力

foreach (DataRow row in tblStaff.Rows)

{

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 tblPosition.Rows)

{

Console.WriteLine(row["position_name"].ToString() + "に所属するStaff");

DataRow[] fkRows = row.GetChildRows("position_staff");

foreach (DataRow fkRow in fkRows)

{

Console.WriteLine(" " + fkRow["staff_name"].ToString());

}

}

}

リレーション張れると、やはり便利ですね。

ただ、DataTable は一つの DataSet にか属せないのでそこは注意が必要です。

また、リレーションを張った DataTable を DataSet.Tables.Clear() でクリアするときは、その前に DataSet.Relations.Clear() でリレーションをクリアし、DataTable.Constraints.Clear() で制約を削除する必要があります。

参考:

MSDN:方法 : 関連する DataTable のレコードにアクセスする

MSDN:10 行でズバリ !! リレーショナルデータテーブルの構築 (VB)