ADO.NET(二):断开连接层

下载

 

断开连接层

与连接层不同,我们通过数据适配器获取数据而不是数据读取获取DataSet可以包含任意多的DataTable对象,而DataTable对象又是DataRowDataColumn对象的集合。

数据提供程序的数据适配器对象自动处理数据库连接,为了增加性能,数据适配器会尽可能缩短连接打开的总时间。一旦调用者获得了DataSet,会立即关闭DBMS的连接,仅在本地留下一个远程数据的本地副本。调用者可以任意对DataTable进行插入、修改、删除操作,但物理数据库不会被更新,直到调用者显示提交DataSet到数据适配器才进行更新。

 

DataSet

DataSet的核心成员除了TablesRelationsExtendProperties属性,还有

CaseSensitive bool

指示 DataTable 对象中的字符串比较是否区分大小写

DataSetName 

获取或设置当前 DataSet 的名称。

EnforceConstraints 

获取或设置一个值,该值指示在尝试执行任何更新操作时是否遵循约束规则。

HasErrors 

获取一个值,指示在此 DataSet 中的任何 DataTable 对象中是否存在错误。

RemotingFormat 

定义 DataSet 在传输内容时的序列化方式 (二进制或序列化)

 

一些重要的方法(*的表示DataTable也支持)

 

AcceptChanges() *

提交自加载此 DataSet 或上次调用 AcceptChanges 以来对其进行的所有更改。

Clear()*

通过移除所有表中的所有行来清除任何数据的 DataSet

Clone()*

复制 DataSet 的结构,包括所有 DataTable 架构、关系和约束。不复制任何数据。

Copy()*

复制该 DataSet 的结构和数据。

GetChanges()DataSet*

获取 DataSet 的副本,该副本包含自上次加载以来或自调用 AcceptChanges 以来对该数据集进行的所有更改。

HasChanges()

 获取一个值,该值指示 DataSet 是否有更改,包括新增行、已删除的行或已修改的行。

Merge()*

将指定的 DataSetDataTable 或 DataRow 对象的数组合并到当前的 DataSet 或 DataTable 中。

ReadXml()*

 将 XML 架构和数据读入 DataSet

ReadXmlSchema()* 

 将 XML 架构读入 DataSet

RejectChanges()*

回滚自创建 DataSet 以来或上次调用 DataSet..::.AcceptChanges 以来对其进行的所有更改。

WriteXml()WriteXmlSchema()*

 

DataTable

 

      除了RowsColumns这些重要属性以外,还包括ChildRelationsParentRelations(获取此DataTable的父/子关系的集合)PrimaryKey(获取设置充当数据表主键的列的数组)。

 

 

Code

 

 

使用DataTableReader处理DataTable

    从NET2.0开始,DataTable开始支持一个叫做CreateReader()的方法。这个方法允许使用像数据读取器一样的方法来获取DataTable内的数据。

 

Code

 

 

序列化DataTable/DataSet成为XML/二进制

 

Code

 

 

DataColumn

DataColumn类表示在DataTable中的一个实例,一组DataCloumn类型绑定到一个特定的DataTable,组合成一个表的基本信息。

 

Code

 

DataRow

表示表中的实际数据,它没有公共构造函数,所以不能new来构造。

 

DataRow row1=table.NewRow();
row1[
"Make1"]="aa";
row1[
"Make2"]="bb";

//0列自增,因此从1开始
DataRow row2=table.NewRow();
row1[
1]="cc";
row1[
2]="dd";

 

DataRow.RowState属性

要以编程方式指定表中的一组行被修改、新增的时候,就会使用RowState属性。他是DataRowState枚举值:

 

Code

 

 

ataRowVersion属性

除了RowState属性维护行的当前状态,DataRow对象还通过DataRowVersion属性维护了它包含的数据的3个可能版本。在首次构建DataRow对象时,它仅包含一份数据,表示为当前版本。然而,操作DataRow对象以后,就会引入其他版本的数据。DataRowVersion枚举:

Current

表示行的当前值,即使在做出改变之后

Defaul

DataRowState的默认值

Original

首次插入DataRow的值,或者AcceptChanges()最后一次被调用后的值

Proposed

调用BeginEdit()后当前正在被编辑的行的值。

在调用 DataRow 对象的 BeginEdit 方法之后,如果更改该值,则 Current 和 Proposed 值变得可用。

在调用 DataRow 对象的 CancelEdit 方法之后,Proposed 值将被删除。

在调用 DataRow 对象的 EndEdit 方法之后,Proposed 值变成 Current 值。

在调用 DataRow 对象的 AcceptChanges 方法之后,Original 值变得与 Current 值相同。

在调用 DataTable 对象的 AcceptChanges 方法之后,Original 值变得与 Current 值相同。

在调用 DataRow 对象的 RejectChanges 之后,Proposed 值将被丢弃,版本变成 Current

可视化设计DataGridView

在为DataGridView设计数据源之后,就会发现App.config文件中多了字符串连接

 

Code

 

 

WindowsFormsDataTableViewer.Properties.Settings.db_TeachingMISConnectionString就是连接字符串的名字,可以看了所有代码,不会发现任何指向ConfigurationManager类型的引用从<connectionStrings>元素读取值。然而,在自动生成的适配器对象的构造函数中会调用如下函数:

Code

 

 

其实每个VS项目类型都维护一组应用程序级别的设置,通过reflector.exe打开可以看到:

 

 

 

通过生成一个类图,我们可以发现DataSetDataTableDataRow都已经有了,在代码中可以使用这些生成的类型。

UI层解耦

虽然DataGridView的数据配置向导已经为我们节省了很多代码,但是UI层硬编码了数据访问逻辑,这是一个设计错误。高兴的是,我们可以用另一种方式:添加一个数据集,然后连接上某个数据库,将希望生成的表拖到界面上,如下

 

 

例子说明:

 

该界面显示了1.以编程方式删除行、2.根据筛选条件选择行、3.DataView的使用等。

 

展示了DataSet的基本使用,包括扩展属性、映射友好名称等。

 

 

 

展示了一个DataSet包含多个关联DataTable的时候,DataRelation的使用等。

 

展示了一个DataSet包含多个关联DataTable的时候,DataRelation的使用等。

 

 

 

 

posted @ 2009-06-08 11:19  碧海山城  阅读(478)  评论(0)    收藏  举报