DataSet浅析

来源:互联网 发布:可脱抱枕淘宝店铺推荐 编辑:程序博客网 时间:2024/05/20 06:06
1步,创建到数据源的连接:

SQLConnection con =new SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");

2步,创建DataSetCommand对象,指定一个存储过程的名字或者一个SQL语句,指定数据链路;

SQLDataSetCommand cmd =new SQLDataSetCommand("SELECT * FROM Authors", con);

3步,创建一个Dataset对象

DataSet ds = new DataSet();

4步,调用DataSetCommandFillData方法,为Dataset填充数据。注意:数据链路没有必要是打开的。如果数据链路是关闭状态,FillData函数会打开它,并在FillData之后关闭数据链路。如果数据链路本来就是打开的,在FillData之后,数据链路依然保持打开状态。

int iRowCount = cmd.FillDataSet(ds, “Authors”);

5步,操作数据。由于FillData返回了记录的个数,我们可以构造一个循环,来操纵Dataset中的数据。

for(int i=0; i< iRowCount; i++){

       DataRow dr = ds.Tables[0].Rows;

       Console.WriteLine(dr["au_lname"]);

}

下面它的使用:

5.3 DataSet的使用

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: 生成数据结构那样的类

原创粉丝点击