「ほっ」と。キャンペーン
(.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)
[PR]
by jehoshaphat | 2010-06-05 00:40 | .Net開発 | Trackback | Comments(0)
トラックバックURL : http://jehupc.exblog.jp/tb/12753280
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


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