ADO.Net中DataSet的应用

在这里插入图片描述

一、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);  
                }
 }

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值