包含相關數據表的數據集使用 DataRelation 對象表示表之間的父/子關係並互相返回相關記錄。使用“數據源配置嚮導”或“數據集設計器”將相關表添加到數據集可爲您創建和配置 DataRelation 對象。有關返回相關記錄的更多信息,請參見如何:訪問相關數據表中的記錄。有關創建數據關係的信息,請參見如何:使用數據集設計器創建 DataRelation。
DataRelation 對象執行兩種功能:
-
它可使與正使用的記錄相關的記錄可用。如果在父記錄 (GetChildRows) 中,則它提供子記錄;如果正使用子記錄 (GetParentRow),則它提供父記錄。
-
它可強制約束的引用完整性,如刪除父記錄時刪除相關的子記錄。
瞭解真正的聯接與 DataRelation 對象功能之間的差異很重要。在真正的聯接中,從父表和子表獲取記錄並將其放入單個的平面記錄集。當使用 DataRelation 對象時,不創建新記錄集。而關係跟蹤表之間的關係並使父記錄和子記錄保持同步。
public partial class DataRelationDemo : System.Web.UI.Page
{
private SqlConnection conn;
private SqlDataAdapter dad;
private DataSet ds;
protected void Page_Load(object sender, EventArgs e)
{
//連接數據庫pubs,且把三張表填充到DataSet裏;
this.conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["pubsConnectionString"].ToString());
this.dad = new SqlDataAdapter("select job_id,job_desc from jobs select pub_id,pub_name from publishers select pub_id,job_id,fname,lname from employee", conn);
this.ds=new DataSet();
this.dad.Fill(ds);
//給三張表建立不同的關係;
//通過job_id給employee和jobs建立主外間關係;注意主表(父表)在前,從表(子表)在後,注意參數的順序
DataRelation relationjob = new DataRelation("empjob", ds.Tables[0].Columns["job_id"], ds.Tables[2].Columns["job_id"]);
//添加到DataSet裏的Relations中;
ds.Relations.Add(relationjob);
//通過pub_id給employee和publishers建立主外間關係;注意主表(父表)在前,從表(子表)在後,注意參數的順序
DataRelation relationpub = new DataRelation("emppub", ds.Tables[1].Columns["pub_id"], ds.Tables[2].Columns["pub_id"]);
//添加到DataSet裏的Relations中;
ds.Relations.Add(relationpub);
//循環遍力主表(父表),
foreach (DataRow drpub in ds.Tables[1].Rows) {
//建立父節點
TreeNode nodepart = new TreeNode();
nodepart.Text = drpub["pub_name"].ToString();
this.TreeView1.Nodes.Add(nodepart);//將父節點添加到樹控件;
//在循環遍力主表所對應的從表(子表),用GetChildRows(relationpub)得到的是一個DataRow數組;
foreach (DataRow dremp in drpub.GetChildRows(relationpub)) {
//在建立子節點;
TreeNode nodechild = new TreeNode();
nodechild.Text = dremp["fname"].ToString() + " " + dremp["lname"].ToString();
nodepart.ChildNodes.Add(nodechild);//將子節點添加到父節點裏;
//通過dremp.GetParentRow(relationjob)這個方法得到從表(子表)所對應的主表(父表),而返回的是一行DataRow數據;
//因此不需要用循環遍歷;
DataRow dr=dremp.GetParentRow(relationjob);
////在建立子節點;
TreeNode nodechch = new TreeNode();
nodechch.Text = dr["job_desc"].ToString();
nodechild.ChildNodes.Add(nodechch);//將子節點添加到上以及子節點裏;
}
}
}
}