一)构建DataSet 和DataTable
DataSet、DataTable 和DataColumn 的概念
1)数据集(DataSet)
a) 与关系数据库相似的对象模型保存数据:表、行、列
b) 可以在数据集中定义约束条件与关联
2) 数据表(DataTable)
a) 代表了数据集中的表,可以从数据源加载数据
b) 由数据列组成
3) 数据列(DataColumn)
a) 由DataType 属性指定对应的数据类型
b) 需要保持数据列的数据类型与数据库列的类型匹配
DataSet 对象模型
1)普通集合
a) 数据库中的表(DataTable对象的集合)
b) 关联(数据关联对象的集合)
2) 支持数据绑定到Web 或者Windows 控件
3) 数据结构可以编程,或使用XSD 指定
强类型化的数据集:继承自DataSet类,在编译时检查。
非类型化的数据集:在运行时检查。
主键约束
1)设置数据表的Constraint属性
a) 按照一定顺序选择列
b) 不允许对约束命名
2)编辑数据表的约束集合
a) 增加一个惟一性约束
b) 约束的命名
c) 选择对应的列
d) 选中主键的选择框
惟一约束
1)惟一性约束的两种类型
a) UniqueConstraint
b) ForeignKeyConstraint
2) 创建一个约束
a) 编辑数据表的约束集合
b) 编辑数据列的Unique 属性
3)UniqueConstraint
a) 保证每行数据都是惟一的
b) 数据列的数组
c) 可以是数据表的主键
d) 创建主键约束会自动在该行上增加惟一性约束
4) ForeignKeyConstraint
:外键约束,主要用于两个数据表之间的主键列
:用于建立引用的父子关系
4)自增字段
a) AutoIncrement
b) AutoIncrementSeed
c) AutoIncrementStep
自定义表达式
1) 定义:
自定义表达式是由列的计算得到的自定义表达式是由列的计算得到的,而不是列而不是列中存储的原始值
2)使用数据列 Expression 属性
– Sum([Unit Price] * [Quantity])
3)聚合函数可以使用父子关系
– Avg、Count、Sum、Max、Min
二)定义数据的关系定义数据的关系
使用外键约束限制对数据的操作
1)外键约束增强了引用的完整性
– 如果数据集的EnforceConstraints 属性为真
2)在相关的表中限制数据的操作
– DeleteRule 和UpdateRule 属性
操作 |
描述 |
Cascade |
删除或者更新相关的行,是默认值 |
SetNull |
设置相关行中的值为DBNull |
SetDefault |
设置相关行中的值为DefaultValue |
None |
不作任何操作,但是会抛出一个异常 |
DataRelation 对象
1)定义:数据关联对象定义了数据导航的关系,而不是约束的关系
2)使用已有的对象(例如,DataGrid控件)完成更简单的数据导航(例如,从父记录到子记录的“向下钻取”的功能)
3) 被由表达式组成的列进行聚集函数的计算
4) 数据集有一个关联的集合
5)使用数据关联对象的好处
– 比连接查询返回更少的行数
– 只取回有关联的信息
– 不需要复杂的处理同步的代码
– 可以用于执行复合的UPDATE操作
– 动态
– 支持级联操作
– 可以用于在多个数据源之间建立等级的模型
创建DataRelation对象
1) 使用属性窗口
2) 编写代码
dsNorthwind.Relations.Add("FK_CustomersOrders",
dtCustomers.Columns("CustomerID"),
dtOrders.Columns("CustomerID"), True);
3) 通过数据关联构建器建立多类之间的关联关系
定义一个列的数组:
tblChild = ds.Tables["ChildTable"];
colsChild = new DataColumn[ ]{tblChild.Columns[["ChildColumn1"],], tblChild.Columns["ChildColumn2"]};
使用数据关联构建器建立数据关联对象:
rel = new DataRelation(“MultipleColumns",colsParent, colsChild);
浏览相关联的 DataTable
1)DataRow 对象的对象的GetChildRows 方法方法
将一个数据关联名称作为参数传递
2)举例:
foreach(DataRow drCustomer in dsdsNoortthwindd.Tabableses[["CustoCustomeer“]].Roows)s)
{
foreach(DataRow drOrder in drCustomer.GetChildR["FK_CustomersOrders“])
{
//process row
}
}
3)使用数据关联对象还可以由子表到父表的上溯
调用DataRow 对象的GetParentRows 方法
4)举例:
DataRow rowCustomer, rowOrder;
//Loop through the orders.
foreach(DataRow rowOrder In ds.Tables[“Orders”].Rows)
{
Console.Write(rowOrder[“OrderID”]+”\t”+rowOrder[“OrderDate”]) ;
DataRow rowCustomer = rowOrder.GetParentRow[“CustomersOrders”];
Console.WriteLine(“\t”+rowCustomer[“CompanyName”]) ;
}
三)更改DataTable 中的数据
插入新行
1)创建创建一个新行
– Dim drNewEmployee As DataRow = dtEmployees.NewRow()
2)添充新行
– drNewEmployee("EmployeeID") = 11
– drNewEmployee("LastName") = "Smith"
3)将该行追加到数据表
– dtEmployes.Rows.AdddtEmployes.Rows.Add(drNewEmployee)
4) 同时创建、填充、添加
–dtEmployees.Rows.Add(New Object(){11, "SmithSmith"})
更改表中的数据
1)数据行类中BeginEdit 方法
– 禁止抛出事件或异常
2)数据行类中EndEdit 和CancelEdit 方法
– 允许抛出事件和异常
3)如何更新表中的数据
DimDim drEmployee As DataRow = dtEmployees.Rows(3)
drEmployee.BeginEdit()
drEmployee("FirstName") == "John"
drEmployee("LastName") = "Smith"
drEmployee.EndEdit()
删除行
1)DataRowCollection 类中的Remove 方法
– 将行从集合中彻底删除将行从集合中彻底删除
2)示例
– dtEdtEmployees.Rows.Remove(drEmplloyee)
3)DataRow 类的Delete 方法
– 将一行标记为已经删除
– 隐藏, 如果有必要仍然可以访问
4)示例
– drEmployee.Delete
RowState 和 RowVersion 属性
1) DataRow 的RowState 属性
– Added
– Deleted
– Detached
– Modified
– Unchanged
2) DataViewRowState 枚举器
与DataView 一起使用过滤所有某一状态的行CurrentRows、OriginalRows 等等
3) DataRowVersion 枚举枚举器用来使用Item 属性返回数据值
– Current
– Default
– Original
– Proposed
4) DataRowDataRow 的的HasVersionHasVersion 方法
5) AcceptChanges 和RejectChanges 方法
处理DataTable 对象的事件
1) 示例
– Private WithEvents dtProducts As DataTable
– Private Sub dtProducts_RowDeleted( ByVal _ sender As Object, _
– ByVal e As System.Data.DataRowChangeEventArgs) _
– Handles dtProducts.RowDeleted
– ' write code here
– End Sub
2) DataTable 事件列表
– ColumnChanged、ColumnChanging
– RowChanged、RowChanging、RowDeleted、RowDeleting
四)排序和筛选数据
使用Select 方法
1)DataTable 对象的Select 方法
– 返回已经过滤的、按照顺序排序的并且满足指定状态的数据行的队列
2)三个可选参数
– Filter 表达式,例如:"City='London'"
– Sort,例如:"CompanyName ASC"
– DataView,例如:Deleted
创建 DataView
1)使用RowStateFilter 属性得到不同的数据
CurrentRows 不包括被删除的行(默认)
Deleted 包括被删除的行
ModifiedCurrent 包括更改数据,当前数据可见
ModifiedOriginal 包括更改数据,原始数据可见
None 不包括任何行
OriginalRows 包括删除的、更改的、没有更改的行,原始数据可见
Unchanged 包括没有被更改的行
Added 包括被增加的行
在 DataView 中查询数据
1)DataView 对象支持使用RowFilter 与RowStateFilter属性过滤数据
2)DataView 对象支持Find 与FindRow 方法查询数据
设定DataView 对象的Sort 属性:vue.Sort = “ContactName"
Find 方法返回Integer 的返回值指定返回列的位置:Dim intIndex As Integer = vue.Find(“Fran Wilson”) ,如果Find方法没有找到对应的值,返回-1