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