ADO.net中DataSet的应用
DataSet的简介与特征
DataSet是ADO. NET实现断开式连接的主要组件,是以数据源中检索到的数据在内存中的缓存形式,可以视为内存中的一个虚拟数据库,一般情况下。应用程序并不直接和数据库进行交互.而是使用DataSet中的数据操作,DataSet主要有以下三个特征,
(1)具有与数据原无关的特性,
DataSet被填充数据后,与数据库保持断开方式和实时连接方式均可使用。
(2)独立于使用的各种数据源。
无论什么类型数据源,都提供了一致的编程模型DataSet。
(3)DataSet对象可以用XML形式表示数据视图。
这三大特征使ADO. NET技术较以往ADO版本有了较大提升。
既然断开连接后,数据的所有操作都集中在DataSet上,下面的任务就是去研究如何手动操作DataSet内部结构。掌握了这些,就能灵活处理DataSet中的数据了。
知识点描述
DataSet是由一组DataTable对象组成,每个DataTable对象又由行和列组成,它和物理数据表是一样的结构;并可借助于DataRelation对象将DataTable相互关联;其次,还可使用UniqueConstraint或ForeignkeyConstraint约束对象在DataSet中实施数据完整性。
DataSet常用构造方法
|
|||||||
DataSet常用的属性和方法
|
||||||||||||||||||||||||||
思维导图
运行代码
private void frm_Ks_Load(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = ConfigurationManager.ConnectionStrings["Sql"].ToString(); //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = //指定SQL命令的命令文本; "SELECT * FROM Ks;" //该命令分别查询所有院系、专业、班级,查询结果将返回多张表; + "SELECT * FROM Mzys;"; 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 Ks = dataSet.Tables[0]; //声明院系数据表,对应数据集的表集合中的第1张数据表; DataTable Mzys = dataSet.Tables[1]; //声明专业数据表,对应数据集的表集合中的第2张数据表; //声明班级数据表,对应数据集的表集合中的第3张数据表; DataRelation[] dataRelations = //声明数据关系数组;好 { new DataRelation //实例化数据关系,实现院系表、专业表之间的层次关系; ("Ks" //数据关系名称; , Ks.Columns["depe_code"] //父表的被参照列为院系表的编号列; , Mzys.Columns["dept_code"] //子表的参照列为专业表的院系编号列; , false) //不创建约束(父列上的唯一约束、子列上的外键约束); //不创建约束(父列上的唯一约束、子列上的外键约束); }; dataSet.Relations.AddRange(dataRelations); //将数据关系数组批量加入数据集的关系集合中; this.trv_Ks.Nodes.Clear(); //树形视图的节点集合清空; foreach (DataRow KsRow in Ks.Rows) //遍历院系数据表中的每一数据行; { TreeNode KsNode = new TreeNode(); //声明并实例化院系节点,该节点对应当前某个院系; KsNode.Text = KsRow["depet_name"].ToString(); //院系节点的文本设为当前院系的名称; this.trv_Ks.Nodes.Add(KsNode); //将院系节点加入树形视图的(根)节点集合; foreach (DataRow MzysRow in KsRow.GetChildRows("Ks")) //借助先前定义的数据关系,遍历当前院系所在数据行的子行,即下属所有专业; { TreeNode MzysNode = new TreeNode(); //声明并实例化专业节点,该节点对应当前某个专业; MzysNode.Text = MzysRow["doctor_name"].ToString(); //专业节点的文本设为当前专业的名称; KsNode.Nodes.Add(MzysNode); //专业节点加入当前院系节点的节点集合,成为第1级节点之一; } } }
执行结果