ADO.NET中DataSet的应用
DataSet 是 ADO. NET结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。
又称为资料集、数据集合或资料集合,是一种由数据所组成的集合,每一列代表一个特定变量。每一行都对应于某一成员的数据集。
一、思维导图
二、知识点描述
创建和刷新 DataSet 并依次更新数据
通过 DataAdapter 使用数据源的数据生成和填充 DataSet 中的每个 DataTable。
通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
构造:
DataSet() 初始化 DataSet 类的新实例。
属性:
Connection 建立与特定数据源的连接。
Command 对数据源执行命令。
DataReader 从数据源中读取只进且只读的数据流。
DataAdapter 用于将数据填充到 DataSet。
Container 获取组件的容器
Table 获取包含在 DataSet中的表的集合。
方法:
Clear() 通过移除所有表中的所有行来清除任何数据的 DataSet。
Clone() 复制 DataSet 的结构,包括所有 DataTable 架构、关系和约束。 不要复制任何数据。
Copy() 复制该 DataSet 的结构和数据。
事件:
Disposed 添加事件处理程序以侦听组件上的 Disposed 事件。
Initialized 初始化 DataSet 后发生。
MergeFailed 当目标和源 DataRow 的主键值相同且 EnforceConstraints 设置为真时发生。
三、示例代码
public partial class 出入区管理 : Form { public 出入区管理() { InitializeComponent(); } private void 出入区管理_Load(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=病区管理;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = //指定SQL命令的命令文本; "SELECT * FROM lesion;" //该命令分别查询所有院系、专业、班级,查询结果将返回多张表; + "SELECT * FROM departs;" + "SELECT * FROM ward;" + "SELECT * FROM beds"; 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 lesionTable = dataSet.Tables[0]; //声明院系数据表,对应数据集的表集合中的第1张数据表; DataTable departTable = dataSet.Tables[1]; //声明专业数据表,对应数据集的表集合中的第2张数据表; DataTable wardTable = dataSet.Tables[2]; DataTable bedTable = dataSet.Tables[3]; //声明班级数据表,对应数据集的表集合中的第3张数据表; //声明班级数据表,对应数据集的表集合中的第3张数据表; DataRelation[] dataRelations = //声明数据关系数组; { new DataRelation //实例化数据关系,实现院系表、专业表之间的层次关系; ("lesion_depart" //数据关系名称; , lesionTable.Columns["le_depart"] //父表的被参照列为院系表的编号列; , departTable.Columns["de_name"] //子表的参照列为专业表的院系编号列; , false) //不创建约束(父列上的唯一约束、子列上的外键约束); , new DataRelation //实例化数据关系,实现专业表、班级表之间的层次关系; ("depart_ward" //数据关系名称; , departTable.Columns["de_wardno"] //父表的被参照列为专业表的编号列; , wardTable.Columns["wa_no"] //子表的参照列为班级表的专业编号列; , false) , new DataRelation ("ward_bed" ,wardTable .Columns ["wa_name"] ,bedTable .Columns ["be_ward"] ,false )//不创建约束(父列上的唯一约束、子列上的外键约束); }; dataSet.Relations.AddRange(dataRelations); //将数据关系数组批量加入数据集的关系集合中; this.trv_EducationUnit.Nodes.Clear(); //树形视图的节点集合清空; foreach (DataRow lesionRow in lesionTable.Rows) //遍历院系数据表中的每一数据行; { TreeNode lesionNode = new TreeNode(); //声明并实例化院系节点,该节点对应当前某个院系; lesionNode.Text = lesionRow["le_name"].ToString(); //院系节点的文本设为当前院系的名称; this.trv_EducationUnit.Nodes.Add(lesionNode); //将院系节点加入树形视图的(根)节点集合; foreach (DataRow departRow in lesionRow.GetChildRows("lesion_depart")) //借助先前定义的数据关系,遍历当前院系所在数据行的子行,即下属所有专业; { TreeNode departNode = new TreeNode(); //声明并实例化专业节点,该节点对应当前某个专业; departNode.Text = departRow["de_name"].ToString(); //专业节点的文本设为当前专业的名称; lesionNode.Nodes.Add(departNode); //专业节点加入当前院系节点的节点集合,成为第1级节点之一; foreach (DataRow wardRow in departRow.GetChildRows("depart_ward")) //借助先前定义的数据关系,遍历当前专业所在数据行的子行,即下属所有班级; { TreeNode wardNode = new TreeNode(); //声明并实例化班级节点,该节点对应当前某个班级; wardNode.Text = wardRow["wa_name"].ToString(); //班级节点的文本设为当前班级的名称; wardNode.Tag = wardRow["wa_name"]; //班级节点的标签设为当前班级的编号; departNode.Nodes.Add(wardNode); foreach (DataRow bedRow in wardRow.GetChildRows("ward_bed")) { TreeNode bedNode = new TreeNode(); bedNode.Text = bedRow["be_no"].ToString(); bedNode.Tag = bedRow["be_no"]; wardNode.Nodes.Add(bedNode); }//班级节点加入当前专业节点的节点集合,成为第2级节点之一; } } }
四、结果展示