ADO.NET中DataSet的应用

DataSet 是 ADO. NET结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。

又称为资料集、数据集合或资料集合,是一种由数据所组成的集合,每一列代表一个特定变量。每一行都对应于某一成员的数据集。

一、思维导图

二、知识点描述

创建和刷新 DataSet 并依次更新数据

通过 DataAdapter 使用数据源的数据生成和填充 DataSet 中的每个 DataTable。

通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。

构造:

DataSet()  初始化 DataSet 类的新实例。

属性:

Connection 建立与特定数据源的连接。

Command 对数据源执行命令。

DataReader 从数据源中读取只进且只读的数据流。

DataAdapter 用于将数据填充到 DataSet。

Container 获取组件的容器

Table  获取包含在 DataSet中的表的集合。

方法:

Clear()    通过移除所有表中的所有行来清除任何数据的 DataSet。

Clone()   复制 DataSet 的结构,包括所有 DataTable 架构、关系和约束。 不要复制任何数据。

Copy()    复制该 DataSet 的结构和数据。

事件:

Disposed  添加事件处理程序以侦听组件上的 Disposed 事件。

Initialized   初始化 DataSet 后发生。

MergeFailed   当目标和源 DataRow 的主键值相同且 EnforceConstraints 设置为真时发生。

三、示例代码

    public partial class 出入区管理 : Form
    {
        public 出入区管理()
        {
            InitializeComponent();
        }

        private void 出入区管理_Load(object sender, EventArgs e)
        {
            SqlConnection sqlConnection = new SqlConnection();                                              //声明并实例化SQL连接;
            sqlConnection.ConnectionString =
                "Server=(local);Database=病区管理;Integrated Security=sspi";                             //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
            SqlCommand sqlCommand = new SqlCommand();                                                       //声明并实例化SQL命令;
            sqlCommand.Connection = sqlConnection;                                                          //将SQL命令的连接属性指向SQL连接;
            sqlCommand.CommandText =                                                                        //指定SQL命令的命令文本;
                "SELECT * FROM lesion;"                                                              //该命令分别查询所有院系、专业、班级,查询结果将返回多张表;
                + "SELECT * FROM departs;"
                + "SELECT * FROM ward;"
                + "SELECT * FROM beds";
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                           //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
            sqlDataAdapter.SelectCommand = sqlCommand;                                                      //将SQL数据适配器的查询命令属性指向SQL命令;
            DataSet dataSet = new DataSet();                                                                //声明并实例化数据集,用于保存查得的多张表;
            sqlConnection.Open();                                                                           //打开SQL连接;
            sqlDataAdapter.Fill(dataSet);                                                                   //SQL数据适配器读取数据,并填充数据集;
            sqlConnection.Close();                                                                          //关闭SQL连接;
            DataTable lesionTable = dataSet.Tables[0];                                                  //声明院系数据表,对应数据集的表集合中的第1张数据表;
            DataTable departTable = dataSet.Tables[1];                                                       //声明专业数据表,对应数据集的表集合中的第2张数据表;
            DataTable wardTable = dataSet.Tables[2];
            DataTable bedTable = dataSet.Tables[3];                                                       //声明班级数据表,对应数据集的表集合中的第3张数据表;
            //声明班级数据表,对应数据集的表集合中的第3张数据表;
            DataRelation[] dataRelations =                                                                  //声明数据关系数组;
            {
                new DataRelation                                                                            //实例化数据关系,实现院系表、专业表之间的层次关系;
                    ("lesion_depart"                                                                     //数据关系名称;
                    , lesionTable.Columns["le_depart"]                                                         //父表的被参照列为院系表的编号列;
                    , departTable.Columns["de_name"]                                                    //子表的参照列为专业表的院系编号列;
                    , false)                                                                                //不创建约束(父列上的唯一约束、子列上的外键约束);
                , new DataRelation                                                                          //实例化数据关系,实现专业表、班级表之间的层次关系;
                    ("depart_ward"                                                                          //数据关系名称;
                    , departTable.Columns["de_wardno"]                                                              //父表的被参照列为专业表的编号列;
                    , wardTable.Columns["wa_no"]                                                         //子表的参照列为班级表的专业编号列;
                    , false)
                , new DataRelation 
                    ("ward_bed"
                    ,wardTable .Columns ["wa_name"]
                    ,bedTable .Columns ["be_ward"]
                    ,false 
                    )//不创建约束(父列上的唯一约束、子列上的外键约束);
            };
            dataSet.Relations.AddRange(dataRelations);                                                      //将数据关系数组批量加入数据集的关系集合中;
            this.trv_EducationUnit.Nodes.Clear();                                                           //树形视图的节点集合清空;
            foreach (DataRow lesionRow in lesionTable.Rows)                                         //遍历院系数据表中的每一数据行;
            {
                TreeNode lesionNode = new TreeNode();                                                   //声明并实例化院系节点,该节点对应当前某个院系;
                lesionNode.Text = lesionRow["le_name"].ToString();                                     //院系节点的文本设为当前院系的名称;
                this.trv_EducationUnit.Nodes.Add(lesionNode);                                           //将院系节点加入树形视图的(根)节点集合;
                foreach (DataRow departRow in lesionRow.GetChildRows("lesion_depart"))                //借助先前定义的数据关系,遍历当前院系所在数据行的子行,即下属所有专业;
                {
                    TreeNode departNode = new TreeNode();                                                    //声明并实例化专业节点,该节点对应当前某个专业;
                    departNode.Text = departRow["de_name"].ToString();                                           //专业节点的文本设为当前专业的名称;
                    lesionNode.Nodes.Add(departNode);                                                    //专业节点加入当前院系节点的节点集合,成为第1级节点之一;
                    foreach (DataRow wardRow in departRow.GetChildRows("depart_ward"))                      //借助先前定义的数据关系,遍历当前专业所在数据行的子行,即下属所有班级;
                    {
                        TreeNode wardNode = new TreeNode();                                                //声明并实例化班级节点,该节点对应当前某个班级;
                        wardNode.Text = wardRow["wa_name"].ToString();                                       //班级节点的文本设为当前班级的名称;
                        wardNode.Tag = wardRow["wa_name"];                                                     //班级节点的标签设为当前班级的编号;
                        departNode.Nodes.Add(wardNode);
                        foreach (DataRow bedRow in wardRow.GetChildRows("ward_bed"))
                        {
                            TreeNode bedNode = new TreeNode();
                            bedNode.Text = bedRow["be_no"].ToString();
                            bedNode.Tag = bedRow["be_no"];
                            wardNode.Nodes.Add(bedNode);
                        }//班级节点加入当前专业节点的节点集合,成为第2级节点之一;
                    }
                }
            }

 

四、结果展示

 

posted @ 2018-11-21 20:22  Hu-Fan  阅读(359)  评论(0编辑  收藏  举报