一、知识点描述
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 }