一、思维导图

 

 

 

 

 

 

 

 

 

 

 

二、概念


      DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。因为DataSet可以看做是内存中的数据库,也因此可以说DataSet是数据表的集合,它可以包含任意多个数据表(DataTable),而且每一 DataSet中的数据表(DataTable)对应一个数据源中的数据表(Table)或是数据视图(View)。数据表实质是由行(DataRow)和 列(DataColumn)组成的集合为了保护内存中数据记录的正确性,避免并发访问时的读写冲突,DataSet对象中的DataTable负责维护每一条记录,分别保存记录的初始状态和当前状态。从这里可以看出DataSet是与只能存放单张数据表的Recordset是截然不同的概念。

 

 

三、三大特点

        DataSet对象的三大特性:

(1) 独立性。DataSet独立于各种数据源。

(2) 离线(断开)和连接。

(3) DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。

使用方法

四、程序代码

  

private void 员工表_Load(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=.;Database=AdressList;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = //指定SQL命令的命令文本;
"SELECT * FROM 科室表;" //该命令分别查询所有院系、专业、班级,查询结果将返回多张表;
+ "SELECT * FROM 员工表;";

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 科室表 = dataSet.Tables[0]; //声明院系数据表,对应数据集的表集合中的第1张数据表;
DataTable 员工表 = dataSet.Tables[1]; //声明专业数据表,对应数据集的表集合中的第2张数据表;
//声明班级数据表,对应数据集的表集合中的第3张数据表;
DataRelation[] dataRelations = //声明数据关系数组;
{
new DataRelation //实例化数据关系,实现院系表、专业表之间的层次关系;
("科室表" //数据关系名称;
, 科室表.Columns["no"] //父表的被参照列为院系表的编号列;
, 员工表.Columns["科室no"] //子表的参照列为专业表的院系编号列;
, false) //不创建约束(父列上的唯一约束、子列上的外键约束);
//不创建约束(父列上的唯一约束、子列上的外键约束);
};
dataSet.Relations.AddRange(dataRelations); //将数据关系数组批量加入数据集的关系集合中;
this.trv_EducationUnit.Nodes.Clear(); //树形视图的节点集合清空;
foreach (DataRow 科室表Row in 科室表.Rows) //遍历院系数据表中的每一数据行;
{
TreeNode 科室表Node = new TreeNode(); //声明并实例化院系节点,该节点对应当前某个院系;
科室表Node.Text = 科室表Row["name"].ToString(); //院系节点的文本设为当前院系的名称;
this.trv_EducationUnit.Nodes.Add(科室表Node); //将院系节点加入树形视图的(根)节点集合;
foreach (DataRow 员工表Row in 科室表Row.GetChildRows("科室表")) //借助先前定义的数据关系,遍历当前院系所在数据行的子行,即下属所有专业;
{
TreeNode 员工表Node = new TreeNode(); //声明并实例化专业节点,该节点对应当前某个专业;
员工表Node.Text = 员工表Row["ygxm"].ToString(); //专业节点的文本设为当前专业的名称;
科室表Node.Nodes.Add(员工表Node); //专业节点加入当前院系节点的节点集合,成为第1级节点之一;

}
}
}

 

 

 

五、运行结果