zoukankan      html  css  js  c++  java
  • 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;

                }

    四、效果截图

  • 相关阅读:
    2017(秋)软工作业: (2)硬币游戏—— 代码分析与改进
    软工作业(1)课程学习热身
    用户体验分析:以 “师路南通网站” 为例
    用户体验分析: 以 “南通大学教务管理系统微信公众号” 为例
    软件工程第二次作业:硬币游戏—— 代码分析与改进
    自我介绍
    用户体验分析---以师路南通为例
    用户体验分析---七八点照相馆
    硬币游戏—— 代码分析与改进
    About me
  • 原文地址:https://www.cnblogs.com/13950784855xu/p/9994287.html
Copyright © 2011-2022 走看看