ADO.Net中dataset的应用

一、知识点描述

1、DataSet、DataTable、DataRow之间有什么关系?

  DataSet是数据集,DataTable是数据表,DataSet存储多个DataTable。DataSet和DataTable像是专门存储数据的一个容器,在你查询数据库得到一些结果时可以存在里面。DataRow表示DataTable中包含的实际数据,我们可以通过DataRow将数据添加到用DataColumn定义好DataTable中。

2、dataset的特性

(1).独立性。DataSet独立于各种数据源。微软公司在推出DataSet时就考虑到各种数据源的多样性、复杂性。在.Net中,无论什么类型数据源,它都会提供一致的关系编程模型,而这就是DataSet。

(2).离线(断开)和连接。DataSet既可以以离线方式,也可以以实时连接来操作数据库中的数据。这一点有点像ADO中的RecordSet。

(3).DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。

3、dataset的使用方法

(1).创建DataSet对象

DataSet ds = new DataSet();

DataSet ds = new DataSet("DataSetName");

(2).用数据集填充DataSet

最常用的是DataAdapter对象的Fill()方法给他填充数据

①DataSet ds = new DataSet();

SqlDataAdapter adapt = new SqlDataAdapter(sqlcmd,con)

adapt.Fill(ds,"mytest");

②DataSet ds=new DataSet();

DataTable dt=new DataTable("newTable");

ds.Tables.Add(dt);

③DataSet ds=new DataSet();

DataTable dt=ds.Tables.Add("newTable");

3).访问DataSet中的表、行和列 值

①: 访问每个 DataTable

按表名访问:ds.Tables["mytest"] //指定DataTable对象mytest(即访问DataSet中名为mytest的DataTable)

按索引(索引基于0的)访问:ds.Tables[0] //指定DataSet中的第一个DataTable

②: 访问DataTable中的行

ds.Tables["mytest"].Rows[n] //访问mytest表 的第n+1行(行的索引是从0开始的)

ds.Tables[i].Rows[n] //访问DataSet中的第i+1个DataTable 的第n+1列(列的索引是从0开始的)

③: 访问DataTable中的某个元素

ds.Tables["mytest"].Rows[n][m] //访问mytest表的第n+1行第m+1列的元素

ds.Tables[i].Rows[n][m] //访问DataSet中的第i+1个DataTable 表的第n+1行第m+1列的元素

ds.Tables["mytest"].Rows[n][name] //访问mytest表的第n+1行name列的元素

ds.Tables[i].Rows[n][name] //访问DataSet中的第i+1个DataTable 表的第n+1行name列的元素

④: 取DataTable中的列名

ds.Tables["mytest"].Columns[n] //取出mytest表的n+1列列名

ds.Tables[i].Columns[n]

4、什么地方使用Dataset?

1)、桌面应用程序中使用,利用客户端的处理能力 2)、不同的应用平台之间传输远程数据,比如利用web service传输Dataset

3)、需要数据缓存(DataReader是保持数据连接的对象) 其他缓存办法:使用DataReader从数据库中取出数据,循环保存进一个Arraylist,每条数据保存在一个实体类里面,每个字段的数据对应了此类的相应属性。所有这些实体类对象一起构成了数组Arraylist。——这种方法的好处:不仅更有效率,而且更加易于保持,降低和数据库之间的耦合;当然,此数据集合也可以方便的绑定到控件中 4)、需要自由的获得关系数据的时候,比如主从表。与其每次都从数据库中取相应父栏目下的所有子数据,不如一次性全部取出子数据,然后根据table表之间的关系relation绑定到控件。

5、使用Dataset的若干理由

1)、某些场合使用它开发更加方便 2)、有时候可以让web客户端像桌面客户端 

二、思维导图

 

三、示例代码

 SqlConnection sqlConnection = new SqlConnection();                                              //声明并实例化SQL连接;

            sqlConnection.ConnectionString =

                "Server=(local);Database=Edubase2018;Integrated Security=sspi";                             //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);

            SqlCommand sqlCommand = new SqlCommand();                                                       //声明并实例化SQL命令;

            sqlCommand.Connection = sqlConnection;                                                          //SQL命令的连接属性指向SQL连接;

            sqlCommand.CommandText =                                                                        //指定SQL命令的命令文本;

               "SELECT * FROM tb_room;"

                + "SELECT * FROM tb_class;";

            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 roomTable = dataSet.Tables[0];                                                       //声明专业数据表,对应数据集的表集合中的第1张数据表;

            DataTable classTable = dataSet.Tables[1];                                                       //声明班级数据表,对应数据集的表集合中的第2张数据表;

            DataRelation[] dataRelations =                                                                  //声明数据关系数组;

            {

                new DataRelation                                                                          //实例化数据关系,实现科室表、年级表之间的层次关系;

                    ("room_class"                                                                          //数据关系名称;

                    , roomTable.Columns["R_no"]                                                              //父表的被参照列为专业表的编号列;

                    , classTable.Columns["R_no"]                                                         //子表的参照列为班级表的专业编号列;

                    , false)                                                                                //不创建约束(父列上的唯一约束、子列上的外键约束);

            };

            dataSet.Relations.AddRange(dataRelations);                                                      //将数据关系数组批量加入数据集的关系集合中;

            this.trv_room.Nodes.Clear();                                                           //树形视图的节点集合清空;

            foreach (DataRow roomRow in roomTable.Rows)                                         //遍历院系数据表中的每一数据行;

            {

                TreeNode roomNode = new TreeNode();                                                   //声明并实例化院系节点,该节点对应当前某个院系;

                roomNode.Text = roomRow["R_name"].ToString();                                     //院系节点的文本设为当前科室的名称;

                this.trv_room.Nodes.Add(roomNode);                                           //将院系节点加入树形视图的(根)节点集合;

                //专业节点加入当前院系节点的节点集合,成为第1级节点之一;

                foreach (DataRow classRow in roomRow.GetChildRows("room_class"))                      //借助先前定义的数据关系,遍历当前科室所在数据行的子行,即下属所有年级

                {

                    TreeNode classNode = new TreeNode();                                                //声明并实例化班级节点,该节点对应当前某个年级

                    classNode.Text = classRow["Name"].ToString();                                       //班级节点的文本设为当前级的名称;

                    classNode.Tag = classRow["No"];                                                     //班级节点的标签设为当前级的编号;

                    roomNode.Nodes.Add(classNode);                                                     //班级节点加入当前科室节点的节点集合,成为第2级节点之一;

                }

            }

if (this.trv_room.SelectedNode.Level == 1)                                             //若树形视图的选中节点的级别为2,即选中年级节点;

            {

                int c_no = (int)this.trv_room.SelectedNode.Tag;                                 //将树形视图的选中节点的标签转为整型,即可获得事先保存的科室编号;

                SqlConnection sqlConnection = new SqlConnection();                                          //声明并实例化SQL连接;

                sqlConnection.ConnectionString =

                    "Server=(local);Database=Edubase2018;Integrated Security=sspi";                         //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);

                SqlCommand sqlCommand = new SqlCommand();                                                   //声明并实例化SQL命令;

                sqlCommand.Connection = sqlConnection;                                                      //SQL命令的连接属性指向SQL连接;

                sqlCommand.CommandText = "SELECT No,Name FROM tb_nurse WHERE C_no=@C_no;";          //指定SQL命令的命令文本;该命令查询当前选中年级的所有护士名单,以用作数据网格视图数据源;

                sqlCommand.Parameters.AddWithValue("@C_no", c_no);                                    //SQL命令的参数集合添加参数的名称、值;

                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                       //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;

                sqlDataAdapter.SelectCommand = sqlCommand;                                                  //SQL数据适配器的查询命令属性指向SQL命令;

                DataTable studentTable = new DataTable();                                                   //声明并实例化数据表,用于保存当前选中班级的所有护士名单,以用作数据网格视图的数据源;

                sqlConnection.Open();                                                                       //打开SQL连接;

                sqlDataAdapter.Fill(studentTable);                                                          //SQL数据适配器读取数据,并填充护士数据表;

                sqlConnection.Close();                                                                      //关闭SQL连接;

                this.dgv_nurse.DataSource = studentTable;                                                 //设置数据网格视图的数据源;

                this.dgv_nurse.Columns["No"].HeaderText = "编号";                                         //将数据网格视图的指定列的表头文本设为中文;

                this.dgv_nurse.Columns["Name"].HeaderText = "姓名";

                this.dgv_nurse.Columns[this.dgv_nurse.Columns.Count - 1].AutoSizeMode =                 //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘);

                    DataGridViewAutoSizeColumnMode.Fill;

            }

四、效果截图

原文地址:https://www.cnblogs.com/13950784855xu/p/9994287.html