用DataRelation给多个DataTable建立关系并显示到TreeView

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);//将子节点添加到上以及子节点里;
            }
        }
    }
}
上一篇:数据结构入门(二)固定容量数组


下一篇:Android APK反编译就这么简单 详解(附图)