一、DataSet简要介绍
DataSet是一个数据集合,存储在内存中,算是一个临时的数据库。
①DataSet通过DataAdapter从数据库中获取数据
DataSet dataset =new DataSet();
DataAdapter daA =new DataAdapter(SQL操作语句,数据库连接字符串)
daA.Fill(dsdataset);
②DataSet对象包含数据表集合(Tables)
DataSet对象内部包括集合Tables,每个DataSet对象可以拥有多个数据表
每条SELECT语句产生一个结果集,存放在DataSet的一张内部数据表中
DataTable Table1 = dataSet.Tables[0];
DataTable Table2 = dataSet.Tables[1];
DataTable Table3 = dataSet.Tables[2];//声明数据表,按查询语句的顺序,可以对应对应数据集的表集合中相应的数据表;
③DataSet对象包含关联集合(Relations)
DataSet对象包含关联集合(Relations),集合中的每一个DataRelation代表两个表之间的关联。
实例化数据关系名称时,定义:数据关系名称,父表的被参照列及子表的参照列以及约束条件
DataRelation[] dataRelations =//声明数据关系数组(可以包含多个数据关系);
{
new DataRelation//实例化第一个数据关系
("code1_code2", Table1.Columns["No"],Table2.Columns["NNo"] ,false)
, new DataRelation//实例化第一个数据关系
("code2_code3", Table2.Columns["No"], Table3.Columns["MNo"],false)
};
【注】每个数据关系中的“false”表示:不创建约束 即:
(1)唯一约束:保证表中的列不包含重复内容。
(2)外键约束:用来维护数据集中的父表和子表之间的引用完整性。
二、DataSet的常用属性与方法
属性 | 说明 |
---|---|
Tables | 检查现有的DataTable对象。通过索引访问DataTable有更好的性能。 |
Relations | 返回一个DataRelationCollection对象。 |
CaseSensitive | 用于控制DataTable中的字符串比较是否区分大小写。 |
DataSetName | 当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet"。如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。 |
DesignMode | 如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False。 |
HasErrors | 表示DataSet中 的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError属性设置为 True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。 |
方法 | 说明 |
---|---|
AcceptChanges | 调用AcceptChanges时,RowState属性值为Added或Modified的所有行的 RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。 |
RejectChanges | 调用 RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。 |
Clear | 清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。 |
Clone和Copy | 使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。 |
GetChanges | 返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。 |
HasChange | 表示DataSet中是否包含挂起更改的DataRow对象。 |
Merge | 从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。 |
Reset | 将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。 |
三、DataSet的具体应用
1、创建DataSet对象:
DataSet dataset =new DataSet();
2、用数据集填充DataSet:
SqlDataAdapter daA = new SqlDataAdapter(sqlcmd,con)
daA.Fill(dsdataset);
3、通过DataSet的查询:
①DataSet可存放若干个表(DataTable),每个表有若干个行(DataRow)
②将DataSet中的数据表赋给DataTable对象,通过对DataTable对象每一行的遍历,完成查找。
DataTable Table1 = dataSet.Tables[0];//查询第一张表
for (int i = 0; i < Table1.Rows.Count; i++) //遍历DataTable的每一行
{
DataRow row = Table1.Rows[i];//遍历每一行,得到每一行的内容
string name = Convert.ToString(row["Name"]); //查询当前行的 Name 列的数据
MessageBox.Show(name);//显示内容
}
4、通过DataSet的更新:
①通过DataTable对象对中的结果进行增删改
②调用DataAdapter对象的Update()方法,进行更新
DataTable Table1 = dataset.Tables[0];
DataRow row = Table1.Rows[0];
row["No"]="10001";//更改第一行中的相应字段
Table1.Rows.RemoveAt(1);//删除第二行
DataRow datarow1 = Table1.NewRow();//增加新行
SqlCommandBuilder builder = new SqlCommandBuilder(adapter) //自动生成操作命令
adpter.Update(dataset);
四、DataSet的实例应用
例子:用DataSet实现树形视图
①声明并实例化数据集(DataSet),用于保存查得的多张表
②连接数据库,按指定SQL命令的命令文本进行查询
③声明数据表,按顺序对应数据集的表集合中的数据表
DataSet dataSet = new DataSet();
sqlConnection.Open();
sqlDataAdapter.Fill(dataSet);
sqlConnection.Close();
DataTable TypeTable = dataSet.Tables[0];
DataTable CFTable = dataSet.Tables[1];
④声明数据关系数组,实例化数据关系
⑤将数据关系数组批量加入数据集的关系集合中
DataRelation[] dataRelations =
{
new DataRelation
("Type_CF", TypeTable.Columns["tpcode"], CFTable.Columns["tcode"] , false)
};
dataSet.Relations.AddRange(dataRelations);
⑥树形视图的节点集合清空
⑦遍历数据表中的每一数据行
⑧声明并实例化每个节点,并设置相应的文本和标签
⑨一个节点可以拥有1级节点、2级节点等
this.treeView1.Nodes.Clear();
foreach (DataRow TypeRow in TypeTable.Rows)
{
TreeNode TypeNode = new TreeNode();
TypeNode.Text = TypeRow["typename"].ToString();
this.treeView1.Nodes.Add(TypeNode);
foreach (DataRow CFRow in TypeRow.GetChildRows("Type_CF"))
{
TreeNode CFNode = new TreeNode();
CFNode.Text = CFRow["chufangy"].ToString();
CFNode.Tag = CFRow["code"];
TypeNode.Nodes.Add(CFNode);
}
}