ADO.Net中DataSet的应用

Stella981
• 阅读 663

一、知识点描述

1、DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。也就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的。

 2、创建和刷新 DataSet 并依次更新原始数据的步骤:

  • 通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
  • 通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
  • 调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。

 3、DataSet所有数据都加载在内存上执行的,可以提高数据访问速度,提高硬盘数据的安全性,极大的改善了程序运行的速度和稳定性。

 4、每一个DataSet对象是由若干个 DataTable对象组成。

 5、DataSet使用方法:

  • 把数据库中的数据通过DataAdapter对象填充DataSet。
  • 通过DataAdapter对象操作DataSet实现更新数据库。

 6、DataSet对象的三大特性

  • 独立性。DataSet独立于各种数据源。
  • 离线(断开)和连接。
  • DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。

 二、思维导图

ADO.Net中DataSet的应用

效果截图

ADO.Net中DataSet的应用

代码示例:

 1 DataSet PubsSet = new DataSet();
 2 SqlConnection ConnPubs;
 3 DataSet ds = new DataSet();
 4 
 5         private void frm_PatientInformationManage_Load(object sender, EventArgs e)
 6         {
 7 
 8             ConnPubs = new SqlConnection(); //声明并实例化SQL连接;
 9             ConnPubs.ConnectionString =
10                 ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;             //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
11             SqlCommand sqlCommand = new SqlCommand();                                       //声明并实例化SQL命令;
12             sqlCommand.Connection = ConnPubs;
13             sqlCommand.CommandText = "select P_id as 医疗卡号,P_name as 姓名 ,P_sex as 性别,P_birthday as 生日,P_nation as 民族,Feetype as 付费类型,P_tel as 电话,P_pym as 拼音码,P_address as 地址,P_career as 职业,P_bloodtype  as 血型,P_allergic as 过敏药物,P_idcard as 身份证号,P_Photo from tb_patient";
14 
15             ConnPubs.Open();
16             SqlDataAdapter da = new SqlDataAdapter();
17             da.SelectCommand = sqlCommand;
18             da.Fill(PubsSet, "tb_patient");
19             dataGridView1.DataSource = PubsSet.Tables["tb_patient"];
20            
21             this.dataGridView1.Columns["P_Photo"].Visible = false;   //隐藏照片列
22 
23             SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                           //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
24             sqlDataAdapter.SelectCommand = sqlCommand;                                                      //将SQL数据适配器的查询命令属性指向SQL命令;
25             DataTable tb_patient = new DataTable();                                                         //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源;
26                                                                                   
27             sqlDataAdapter.Fill(tb_patient);                                                                //SQL数据适配器读取数据,并填充班级数据表;
28             this.cmb_SearchPYM .DataSource = tb_patient;                                                         //将班级下拉框的数据源设为班级数据表;
29            // this.cmb_SearchPYM.DisplayMember = "P_pym";                                                          //将班级下拉框的显示成员设为班级数据表的名称列;
30             this.cmb_SearchId .DataSource = tb_patient; 
31            // this.cmb_SearchId.DisplayMember = "P_id";
32             this.cmb_SearchId.DisplayMember = "医疗卡号";
33             this.cmb_SearchPYM.DisplayMember = "拼音码"; 
34             //this.cmb_SearchPYM.ValueMember = "U_id";   
35 
36        
37         }

 DatatreeView

效果截图:

ADO.Net中DataSet的应用

示例代码:

private void btn_Load_Click(object sender, EventArgs e)
        {
            SqlConnection sqlConnection = new SqlConnection();                                              //声明并实例化SQL连接;
            sqlConnection.ConnectionString =
                "Server=(local);Database=master;Integrated Security=sspi";                             //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
            SqlCommand sqlCommand = new SqlCommand();                                                       //声明并实例化SQL命令;
            sqlCommand.Connection = sqlConnection;                                                          //将SQL命令的连接属性指向SQL连接;
            sqlCommand.CommandText =                                                                        //指定SQL命令的命令文本;
                "SELECT * FROM tb_department;"                                                              //该命令分别查询所有院系、专业、班级,查询结果将返回多张表;
                + "SELECT * FROM tb_doctor;"
                ;                                           
            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 departmentTable = dataSet.Tables[0];                                                  //声明院系数据表,对应数据集的表集合中的第1张数据表;
            DataTable doctorTable = dataSet.Tables[1];                                                       //声明专业数据表,对应数据集的表集合中的第2张数据表;
                                                                  //声明班级数据表,对应数据集的表集合中的第3张数据表;
            DataRelation[] dataRelations =                                                                  //声明数据关系数组;
            {
                new DataRelation                                                                            //实例化数据关系,实现院系表、专业表之间的层次关系;
                    ("department_doctor"                                                                     //数据关系名称;
                    , departmentTable.Columns["Dep_id"]                                                         //父表的被参照列为院系表的编号列;
                    , doctorTable.Columns["Dep_id"]                                                    //子表的参照列为专业表的院系编号列;
                    , false)                                                                                //不创建约束(父列上的唯一约束、子列上的外键约束);
                //, new DataRelation                                                                          //实例化数据关系,实现专业表、班级表之间的层次关系;
                //    ("Major_Class"                                                                          //数据关系名称;
                //    , doctorTable.Columns["No"]                                                              //父表的被参照列为专业表的编号列;
                //                                                          //子表的参照列为班级表的专业编号列;
                //    , false)                                                                                //不创建约束(父列上的唯一约束、子列上的外键约束);
            };
            dataSet.Relations.AddRange(dataRelations);                                                      //将数据关系数组批量加入数据集的关系集合中;
            this.trv_Department.Nodes.Clear();                                                           //树形视图的节点集合清空;
           foreach (DataRow departmentRow in departmentTable.Rows) 
           {
               TreeNode departmentNode = new TreeNode();                                                   //声明并实例化院系节点,该节点对应当前某个院系;
                departmentNode.Text = departmentRow["Dep_name"].ToString();                                     //院系节点的文本设为当前院系的名称;
                this.trv_Department.Nodes.Add(departmentNode); 
               foreach (DataRow doctorRow in departmentRow.GetChildRows("department_doctor"))                //借助先前定义的数据关系,遍历当前院系所在数据行的子行,即下属所有专业;
                {
                    TreeNode doctorNode = new TreeNode();                                                    //声明并实例化专业节点,该节点对应当前某个专业;
                    doctorNode.Text = doctorRow["D_Name"].ToString();                                           //专业节点的文本设为当前专业的名称;
                    departmentNode.Nodes.Add(doctorNode);                                                    //专业节点加入当前院系节点的节点集合,成为第1级节点之一;
                    //foreach (DataRow classRow in doctorRow.GetChildRows("Major_Class"))                      //借助先前定义的数据关系,遍历当前专业所在数据行的子行,即下属所有班级;
                    //{
                    //    TreeNode classNode = new TreeNode();                                                //声明并实例化班级节点,该节点对应当前某个班级;
                    //    classNode.Text = classRow["Name"].ToString();                                       //班级节点的文本设为当前班级的名称;
                    //    classNode.Tag = classRow["No"];                                                     //班级节点的标签设为当前班级的编号;
                    //    majorNode.Nodes.Add(classNode);                                                     //班级节点加入当前专业节点的节点集合,成为第2级节点之一;
                    //}
                }
            }
        }

 1  private void trv_Department_AfterSelect(object sender, TreeViewEventArgs e)
 2         {
 3             if (this.trv_Department.SelectedNode.Level == 1)                                             //若树形视图的选中节点的级别为3,即选中班级节点;
 4             {
 5                 string  Depname = (string)this.trv_Department.SelectedNode.Text    ;                                 //将树形视图的选中节点的标签转为整型,即可获得事先保存的班级编号;
 6                 SqlConnection sqlConnection = new SqlConnection();                                          //声明并实例化SQL连接;
 7                 sqlConnection.ConnectionString =
 8                     "Server=(local);Database=master;Integrated Security=sspi";                         //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
 9                 SqlCommand sqlCommand = new SqlCommand();                                                   //声明并实例化SQL命令;
10                 sqlCommand.Connection = sqlConnection;                                                      //将SQL命令的连接属性指向SQL连接;
11                 sqlCommand.CommandText = "SELECT D_id,D_Name,D_sex,D_Title,Dep_name,Dep_id FROM tb_doctor WHERE D_Name=@D_Name;";          //指定SQL命令的命令文本;该命令查询当前选中班级的所有学生名单,以用作数据网格视图数据源;
12                 sqlCommand.Parameters.AddWithValue("@D_Name", Depname);                                    //向SQL命令的参数集合添加参数的名称、值;
13                 SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                       //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
14                 sqlDataAdapter.SelectCommand = sqlCommand;                                                  //将SQL数据适配器的查询命令属性指向SQL命令;
15                 DataTable doctorTable = new DataTable();                                                   //声明并实例化数据表,用于保存当前选中班级的所有学生名单,以用作数据网格视图的数据源;
16                 sqlConnection.Open();                                                                       //打开SQL连接;
17                 sqlDataAdapter.Fill(doctorTable);                                                          //SQL数据适配器读取数据,并填充班级数据表;
18                 sqlConnection.Close();                                                                      //关闭SQL连接;
19                 this.dgv_Doctor.DataSource = doctorTable;                                                 //设置数据网格视图的数据源;
20                 this.dgv_Doctor.Columns["D_id"].HeaderText = "医生编号";                                         //将数据网格视图的指定列的表头文本设为中文;
21                 this.dgv_Doctor.Columns["D_Name"].HeaderText = "医生姓名";
22                 this.dgv_Doctor.Columns["D_sex"].HeaderText = "性别";
23                 this.dgv_Doctor.Columns["D_Title"].HeaderText = "职称";
24                 this.dgv_Doctor.Columns["Dep_name"].HeaderText = "所属科室";
25                 this.dgv_Doctor.Columns["Dep_id"].HeaderText = "科室编号";
26                 this.dgv_Doctor.Columns[this.dgv_Doctor.Columns.Count - 1].AutoSizeMode =                 //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘);
27                     DataGridViewAutoSizeColumnMode.Fill;
28             }
29         }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
vue+axios下载pdf文件流
项目中用到流文件下载的需求,之前使用的方法一直都没问题,但是这次就是下载不下来,查了多种方法终于解决了,方式如下://下载文件downLoadFile(e){letide.target.dataset.id;letnamee.target.dataset.name;
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这