一、知识点描述
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 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
效果截图:
示例代码:
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 }