一、概念
DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。
因为DataSet可以看做是内存中的数据库,也因此可以说DataSet是数据表的集合,它可以包含任意多个数据表(DataTable),而且每一 DataSet中的数据表(DataTable)对应一个数据源中的数据表(Table)或是数据视图(View)。数据表实质是由行(DataRow)和 列(DataColumn)组成的集合为了保护内存中数据记录的正确性,避免并发访问时的读写冲突,DataSet对象中的DataTable负责维护每一条记录,分别保存记录的初始状态和当前状态。从这里可以看出DataSet是与只能存放单张数据表的Recordset是截然不同的概念。
二、特点
(1) 独立性。DataSet独立于各种数据源。
(2) 离线(断开)和连接。
(3) DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。
三、使用方法
在实际应用中,DataSet使用方法一般有三种:
(1) 把数据库中的数据通过DataAdapter对象填充DataSet。
(2) 通过DataAdapter对象操作DataSet实现更新数据库。
(3) 把XML数据流或文本加载到DataSet。
四、实例
private void toolStripMenuItem7_Click(object sender, EventArgs e) { using (SqlConnection sqlConnection = new SqlConnection(DBHelper.connString)) { SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = "SELECT * FROM tb_Client;" + "SELECT * FROM tb_chushou;" + "SELECT * FROM tb_medicine;"; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); sqlDataAdapter.SelectCommand = sqlCommand; DataSet dataSet = new DataSet(); sqlConnection.Open(); sqlDataAdapter.Fill(dataSet); sqlConnection.Close(); DataTable ClientTable = dataSet.Tables[0]; DataTable chushouTable = dataSet.Tables[1]; DataTable medicineTable = dataSet.Tables[2]; DataRelation[] dataRelations = { new DataRelation ("Client_chushou" , ClientTable.Columns["CNO"] , chushouTable.Columns["CNO"] , false) , new DataRelation ("chushou_medicine" , chushouTable.Columns["MNo"] , medicineTable.Columns["MNo"] , false) }; dataSet.Relations.AddRange(dataRelations); this.trv_Client.Nodes.Clear(); foreach (DataRow ClientRow in ClientTable.Rows) { TreeNode ClientNode = new TreeNode(); ClientNode.Text = ClientRow["CName"].ToString(); this.trv_Client.Nodes.Add(ClientNode); foreach (DataRow chushouRow in ClientRow.GetChildRows("Client_chushou")) { //TreeNode chushouNode = new TreeNode(); ////chushouNode.Text = ""; //ClientNode.Nodes.Add(chushouNode); foreach (DataRow MRow in chushouRow.GetChildRows("chushou_medicine")) { TreeNode MNode = new TreeNode(); MNode.Text = MRow["MName"].ToString(); MNode.Tag = MRow["MNo"]; ClientNode.Nodes.Add(MNode); } } } } }