A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡军 中级黑马   /  2012-3-20 20:46  /  2095 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁告诉我一下DataSet的具体用法啊?谢谢

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
DataSet主要跟DataTable 、 DataRow 、 DataColumn 、 DataRelation起搭配,以下面:
  1. string conn = @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\text1.mdf;Integrated security=True;User Instance=True";  
  2. using (SqlConnection con=new SqlConnection(conn))//建立数据库连接,参数是连接字符串  
  3. {  
  4.     con.Open();   //打开数据库连接  
  5.     MessageBox.Show("数据库连接成功!");  
  6.     using(SqlCommand cmd=con.CreateCommand())  
  7.     {  
  8.         cmd.CommandText="select * from [user] "; //定义sqlcommand查询语句;  
  9.         SqlDataAdapter da=new SqlDataAdapter(cmd); //建立个sqlDataAdapter   
  10.         SqlCommandBuilder cb=new SqlCommandBuilder(da);//建立个SqlCommandBuilder,以DataSet为参数。可以包含“增减删改”的语句。  
  11.         DataSet ds=new DataSet();  
  12.         da.Fill(ds);//ds填充到 DataSet;这样数据就在内存里了;  
  13.         DataTable dt = ds.Tables[0];//建立个DataTable并把DataSet的一个表赋值给他;  
  14.         //【查询】,遍历表里面的姓名和年龄  
  15.         foreach (DataRow dr in dt.Rows)  
  16.         {   
  17.             string s=string.Format("姓名为{0},年龄:{1}",dr["name"],dr["age"]);//因为知道字段,直接引用  
  18.             MessageBox.Show(s);  
  19.         }  
  20.         MessageBox.Show("查询结束");  
  21.         //【修改】第一条数据的年龄.  
  22.         MessageBox.Show("原来的年龄为:" + Convert.ToString(dt.Rows[0]["age"]));  
  23.         dt.Rows[0]["age"] = "90";  
  24.         //【删掉】  
  25.         DataRow drd = dt.Rows[1];//指定第二条记录  
  26.         drd.Delete();  
  27.         //【插入】  
  28.         DataRow drc = dt.NewRow();  
  29.         drc["name"] = "ta";  
  30.         drc["age"] = "30";  
  31.         dt.Rows.Add(drc);  
  32.         da.Update(dt);  
  33.         MessageBox.Show("完成!");  
  34.     }  
  35. }  
复制代码

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
DataSet对象

什么是数据集呢?我们以工厂仓库和车间仓库为例。工厂里面有一个仓库用来存放生产用的原料和产品。同时,在工厂中有很多的生产车间。假设每个车间每天要生产100件产品,如果每加式一件产品都从仓库里面提取一次原料,并身仓库提交一个产品,这样恐怕会使仓库的管理员忙得晕头转向也不能够满足所有车间的需要。所以车间就在自己的旁边建了一个临时仓库。每天先把生产用的原料一次性地从仓库中取出来放在临时仓库中。生产的时候只需要从临时仓库提取原料就行了。每天生产的产品也先寄存在临时仓库中,待下班前再由各车间把这一天生产的产品一次性搬运到仓库里。

数据集和SQL Server非常相似,在SQL Server数据库中有很多数据表,每个数据表都有行和列,数据集中也包含多个表,这些表构成了一个数据表集合(DataTableCollection),其中的每个数据表都是一个DataTable对象。在每个数据表中又有列和行,所有的列构成了数据列集合(DataColumnCollection),其中每个数据列是一个DataColumn对象。所有的行构成了数据行集合(DataRowCollection)每一行是一个DataRow 对象。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
1.概述

每一个DataSet都有很多个DataTables和Relationships。RelationShip 应该也是一种表,特殊的是,这个表只是用来联系两个数据表的。
每一个DataTable都有很多 datarows和 datacols, 也包括ParentRelations,ChildRelations 和一些限制条件象主键不可以重复的限制。
每一行有一个RowState属性。主要是反映当前行是否已经被删掉了,被更新了,还是根本没变。有如下的几个选项: Deleted, Modified, New, and Unchanged.

2. 生成
A. 生成一个DataSet: 只需要一个名字: DataSet ds = new DataSet(" DataSetName " ) ;
B.生成DataTable并加入到DataSet中去: DataTable dt = ds.Tables.Add("TableName " ) ;
C.生成DataColumn并加入到DataTable中去,需要给定一个名字和数据类型:
DataColumn dc= dt.Columns.Add("colName", Type.GetType("System.String" ) ) ;
D. 设定primary key 的 constraints:dt.PrimaryKey = new DataColumn[ ] {dc } ;
E. 生成relationship: 需要设定relation的名字和指定关联的两个DataColumn名字.
ds.Relations.Add("relationName", ds.Tables( " table1 ") .Columns( " columnA" ), ds.Tables("table2" ).Columns("columnB" ));


3.合并两个DataSet/DataTable
(1) 合并规则
A. 检查primary key. 如果两个Table使用不同的primary key,那么他们不可能合并起来,抛出一个异常并触发 MergeFail 事件。如果两个Table的列名字相同,但是数据类型不同,也没法合并,最终也以抛出异常结束.
B. 如果在某一行上,两个Table的Primary key相同, 其他数据不同,这时就需要用户来选择继续使用表上原有的数据还是使用新的数据。有一个属性叫PreserveChanges就是管这个的. 如果 PreserveChanges 是真,则保留原来的数据,否则,使用新的数据. 进行合并时,调用起来是这样的A.Merge(B )。原有的数据是用A上的数据,新数据是指B上的数据。
C. 合并结束后,才会检查constrains. 如果有些Constrains的错误,会抛出异常的。

(2)代码很简单,就一句话:
DataSet1.Merge(DataSet2,true, MissingSchemaAction.AddWithKey);
MissingSchemaAction: 如果两个Table的Schema不相同时,设定需要执行的动作。有下列选项:
Add: 遇到新的Column,添加之
AddWithKey: 添加新的Column和 primary key
Error: 如果Schema不同就抛出InvalidOperationException 异常
Ignore: 忽略新的columns.

4.拷贝dataset
共有三种不同的拷贝
A. 拷贝整个DataSet
DataSet ds2 = ds1.Copy() ;

B. 只拷贝改变了部分
DataSet ds2 = ds1.GetChanges() ;

C. 只拷贝 schema
DataSet ds2 = ds1.Clone() ;

5.从DataSet 生成 DataView

为了生成一个DataView,必须指定 datatable, row filter, sort , selected row status, 代码如下:
DataView view1 = new DataView(DataSet1.Tables["table1"],
"Country = 'USA'", "City", DataViewRowState.CurrentRows);
country ='usa' 是row filter,满足这个要求的行才会被挑选出来。
city 是指在View中按照city排序
DataViewRowState 指定挑选出来的行的编辑状态。如:current, deleted, changed, new.. CurrentRows就是目前存在的行,不论是新添,还是修改过的,还是没修改过的。

6. DataSet 的事件(event)
在前面,介绍了DataSet有一个 MergeFailed 事件,EventHandler中可以调用这个Event的 Table和Conflict 属性来显示出错信息。
DataTable还有很多Event,例如: RowChanging, RowChanged, ColumnChanging, ColumnChanged, RowDeleting, RowDeleted.

7.自动生成有类型的数据集( typed dataset )
typed dataset 可以通过一个小工具来自动生成,叫 xsd.exe. 输入一个Schema,xsd.exe可以根据Schema给你自动生成一个DataSet类, 这个类继承于System.Data.DataSet,但是变量名都是使用Schema中的名字,可以结合intellisence方便使用。例如:

xsd /d /l:CS 2.xsd /n:FusionXml

/d: 从Schema生成一个DataSet的子类
/l: 编程语言的种类,如CS,VB,JS
/n: 命名空间namespace
/c: 生成数据结构那样的类

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马