一、知识点描述
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形式表示的数据视图,是一种数据关系视图。
二、思维导图

效果截图

代码示例:
1 1 DataSet PubsSet = new DataSet(); 2 2 SqlConnection ConnPubs; 3 3 DataSet ds = new DataSet(); 4 4 5 5 private void frm_PatientInformationManage_Load(object sender, EventArgs e) 6 6 { 7 7 8 8 ConnPubs = new SqlConnection(); //声明并实例化SQL连接; 9 9 ConnPubs.ConnectionString = 1010 ConfigurationManager.ConnectionStrings["Sql"].ConnectionString; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); 1111 SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; 1212 sqlCommand.Connection = ConnPubs; 1313 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"; 1414 1515 ConnPubs.Open(); 1616 SqlDataAdapter da = new SqlDataAdapter(); 1717 da.SelectCommand = sqlCommand; 1818 da.Fill(PubsSet, "tb_patient"); 1919 dataGridView1.DataSource = PubsSet.Tables["tb_patient"]; 2020 2121 this.dataGridView1.Columns["P_Photo"].Visible = false; //隐藏照片列 2222 2323 SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令; 2424 sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; 2525 DataTable tb_patient = new DataTable(); //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源; 2626 2727 sqlDataAdapter.Fill(tb_patient); //SQL数据适配器读取数据,并填充班级数据表; 2828 this.cmb_SearchPYM .DataSource = tb_patient; //将班级下拉框的数据源设为班级数据表; 2929 // this.cmb_SearchPYM.DisplayMember = "P_pym"; //将班级下拉框的显示成员设为班级数据表的名称列; 3030 this.cmb_SearchId .DataSource = tb_patient; 3131 // this.cmb_SearchId.DisplayMember = "P_id"; 3232 this.cmb_SearchId.DisplayMember = "医疗卡号"; 3333 this.cmb_SearchPYM.DisplayMember = "拼音码"; 3434 //this.cmb_SearchPYM.ValueMember = "U_id"; 3535 3636 3737 }
DatatreeView
效果截图:

示例代码:
1private void btn_Load_Click(object sender, EventArgs e) 2 { 3 SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; 4 sqlConnection.ConnectionString = 5 "Server=(local);Database=master;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); 6 SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; 7 sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; 8 sqlCommand.CommandText = //指定SQL命令的命令文本; 9 "SELECT * FROM tb_department;" //该命令分别查询所有院系、专业、班级,查询结果将返回多张表; 10 + "SELECT * FROM tb_doctor;" 11 ; 12 SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令; 13 sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; 14 DataSet dataSet = new DataSet(); //声明并实例化数据集,用于保存查得的多张表; 15 sqlConnection.Open(); //打开SQL连接; 16 sqlDataAdapter.Fill(dataSet); //SQL数据适配器读取数据,并填充数据集; 17 sqlConnection.Close(); //关闭SQL连接; 18 DataTable departmentTable = dataSet.Tables[0]; //声明院系数据表,对应数据集的表集合中的第1张数据表; 19 DataTable doctorTable = dataSet.Tables[1]; //声明专业数据表,对应数据集的表集合中的第2张数据表; 20 //声明班级数据表,对应数据集的表集合中的第3张数据表; 21 DataRelation[] dataRelations = //声明数据关系数组; 22 { 23 new DataRelation //实例化数据关系,实现院系表、专业表之间的层次关系; 24 ("department_doctor" //数据关系名称; 25 , departmentTable.Columns["Dep_id"] //父表的被参照列为院系表的编号列; 26 , doctorTable.Columns["Dep_id"] //子表的参照列为专业表的院系编号列; 27 , false) //不创建约束(父列上的唯一约束、子列上的外键约束); 28 //, new DataRelation //实例化数据关系,实现专业表、班级表之间的层次关系; 29 // ("Major_Class" //数据关系名称; 30 // , doctorTable.Columns["No"] //父表的被参照列为专业表的编号列; 31 // //子表的参照列为班级表的专业编号列; 32 // , false) //不创建约束(父列上的唯一约束、子列上的外键约束); 33 }; 34 dataSet.Relations.AddRange(dataRelations); //将数据关系数组批量加入数据集的关系集合中; 35 this.trv_Department.Nodes.Clear(); //树形视图的节点集合清空; 36 foreach (DataRow departmentRow in departmentTable.Rows) 37 { 38 TreeNode departmentNode = new TreeNode(); //声明并实例化院系节点,该节点对应当前某个院系; 39 departmentNode.Text = departmentRow["Dep_name"].ToString(); //院系节点的文本设为当前院系的名称; 40 this.trv_Department.Nodes.Add(departmentNode); 41 foreach (DataRow doctorRow in departmentRow.GetChildRows("department_doctor")) //借助先前定义的数据关系,遍历当前院系所在数据行的子行,即下属所有专业; 42 { 43 TreeNode doctorNode = new TreeNode(); //声明并实例化专业节点,该节点对应当前某个专业; 44 doctorNode.Text = doctorRow["D_Name"].ToString(); //专业节点的文本设为当前专业的名称; 45 departmentNode.Nodes.Add(doctorNode); //专业节点加入当前院系节点的节点集合,成为第1级节点之一; 46 //foreach (DataRow classRow in doctorRow.GetChildRows("Major_Class")) //借助先前定义的数据关系,遍历当前专业所在数据行的子行,即下属所有班级; 47 //{ 48 // TreeNode classNode = new TreeNode(); //声明并实例化班级节点,该节点对应当前某个班级; 49 // classNode.Text = classRow["Name"].ToString(); //班级节点的文本设为当前班级的名称; 50 // classNode.Tag = classRow["No"]; //班级节点的标签设为当前班级的编号; 51 // majorNode.Nodes.Add(classNode); //班级节点加入当前专业节点的节点集合,成为第2级节点之一; 52 //} 53 } 54 } 55 } 56 57 1 private void trv_Department_AfterSelect(object sender, TreeViewEventArgs e) 58 2 { 59 3 if (this.trv_Department.SelectedNode.Level == 1) //若树形视图的选中节点的级别为3,即选中班级节点; 60 4 { 61 5 string Depname = (string)this.trv_Department.SelectedNode.Text ; //将树形视图的选中节点的标签转为整型,即可获得事先保存的班级编号; 62 6 SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; 63 7 sqlConnection.ConnectionString = 64 8 "Server=(local);Database=master;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); 65 9 SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; 6610 sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; 6711 sqlCommand.CommandText = "SELECT D_id,D_Name,D_sex,D_Title,Dep_name,Dep_id FROM tb_doctor WHERE D_Name=@D_Name;"; //指定SQL命令的命令文本;该命令查询当前选中班级的所有学生名单,以用作数据网格视图数据源; 6812 sqlCommand.Parameters.AddWithValue("@D_Name", Depname); //向SQL命令的参数集合添加参数的名称、值; 6913 SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令; 7014 sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; 7115 DataTable doctorTable = new DataTable(); //声明并实例化数据表,用于保存当前选中班级的所有学生名单,以用作数据网格视图的数据源; 7216 sqlConnection.Open(); //打开SQL连接; 7317 sqlDataAdapter.Fill(doctorTable); //SQL数据适配器读取数据,并填充班级数据表; 7418 sqlConnection.Close(); //关闭SQL连接; 7519 this.dgv_Doctor.DataSource = doctorTable; //设置数据网格视图的数据源; 7620 this.dgv_Doctor.Columns["D_id"].HeaderText = "医生编号"; //将数据网格视图的指定列的表头文本设为中文; 7721 this.dgv_Doctor.Columns["D_Name"].HeaderText = "医生姓名"; 7822 this.dgv_Doctor.Columns["D_sex"].HeaderText = "性别"; 7923 this.dgv_Doctor.Columns["D_Title"].HeaderText = "职称"; 8024 this.dgv_Doctor.Columns["Dep_name"].HeaderText = "所属科室"; 8125 this.dgv_Doctor.Columns["Dep_id"].HeaderText = "科室编号"; 8226 this.dgv_Doctor.Columns[this.dgv_Doctor.Columns.Count - 1].AutoSizeMode = //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘); 8327 DataGridViewAutoSizeColumnMode.Fill; 8428 } 8529 }