代码改变世界

数据访问技术系列课程 笔记(6) 处理数据集

2011-09-08 23:53  lujiao_cs  阅读(369)  评论(0编辑  收藏  举报

 

一)构建DataSet DataTable

DataSetDataTable 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聚合函数可以使用父子关系 

    – AvgCountSumMaxMin

 

二)定义数据的关系定义数据的关系 

 

使用外键约束限制对数据的操作

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()

 

删除行 

1DataRowCollection 类中的Remove 方法 

    – 将行从集合中彻底删除将行从集合中彻底删除 

2示例 

    – dtEdtEmployees.Rows.Remove(drEmplloyee)

3DataRow 类的Delete 方法 

    – 将一行标记为已经删除 

    – 隐藏如果有必要仍然可以访问

4)示例 

    – drEmployee.Delete 

 

RowState  RowVersion 属性

1) DataRow RowState 属性

    – Added 

    – Deleted 

    – Detached 

    – Modified 

    – Unchanged 

2) DataViewRowState 枚举器

DataView 一起使用过滤所有某一状态的行CurrentRowsOriginalRows 等等

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 事件列表

    – ColumnChangedColumnChanging

    – RowChangedRowChangingRowDeletedRowDeleting 

 

四)排序和筛选数据 

 

使用Select 方法

1DataTable 对象的Select 方法 

    – 返回已经过滤的、按照顺序排序的并且满足指定状态的数据行的队列

2三个可选参数 

    – Filter 表达式,例如:"City='London'"

    – Sort,例如:"CompanyName ASC"

    – DataView,例如:Deleted

 

创建 DataView

1)使用RowStateFilter 属性得到不同的数据 

CurrentRows      不包括被删除的行(默认)

Deleted                    包括被删除的行

ModifiedCurrent           包括更改数据,当前数据可见

ModifiedOriginal           包括更改数据,原始数据可见

None                       不包括任何行

OriginalRows               包括删除的、更改的、没有更改的行,原始数据可见

Unchanged                  包括没有被更改的行 

Added                      包括被增加的行 

 

 DataView 中查询数据

1DataView 对象支持使用RowFilter RowStateFilter属性过滤数据 

2DataView 对象支持Find FindRow 方法查询数据 

  设定DataView 对象的Sort 属性vue.Sort = “ContactName" 

  Find 方法返回Integer 的返回值指定返回列的位置Dim intIndex As Integer = vue.Find(“Fran Wilson”) ,如果Find方法没有找到对应的值,返回-1