ADO.NET(二):断开连接层
断开连接层
与连接层不同,我们通过数据适配器获取数据而不是数据读取获取,DataSet可以包含任意多的DataTable对象,而DataTable对象又是DataRow和DataColumn对象的集合。
数据提供程序的数据适配器对象自动处理数据库连接,为了增加性能,数据适配器会尽可能缩短连接打开的总时间。一旦调用者获得了DataSet,会立即关闭DBMS的连接,仅在本地留下一个远程数据的本地副本。调用者可以任意对DataTable进行插入、修改、删除操作,但物理数据库不会被更新,直到调用者显示提交DataSet到数据适配器才进行更新。
DataSet
DataSet的核心成员除了Tables、Relations和ExtendProperties属性,还有
|
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()* |
将指定的 DataSet、DataTable 或 DataRow 对象的数组合并到当前的 DataSet 或 DataTable 中。 |
|
ReadXml()* |
将 XML 架构和数据读入 DataSet。 |
|
ReadXmlSchema()* |
将 XML 架构读入 DataSet。 |
|
RejectChanges()* |
回滚自创建 DataSet 以来或上次调用 DataSet..::.AcceptChanges 以来对其进行的所有更改。 |
|
WriteXml()、WriteXmlSchema()* |
|
DataTable
除了Rows、Columns这些重要属性以外,还包括ChildRelations、ParentRelations(获取此DataTable的父/子关系的集合)、PrimaryKey(获取设置充当数据表主键的列的数组)。
使用DataTableReader处理DataTable
从NET2.0开始,DataTable开始支持一个叫做CreateReader()的方法。这个方法允许使用像数据读取器一样的方法来获取DataTable内的数据。
序列化DataTable/DataSet成为XML/二进制
DataColumn
DataColumn类表示在DataTable中的一个实例,一组DataCloumn类型绑定到一个特定的DataTable,组合成一个表的基本信息。
DataRow
表示表中的实际数据,它没有公共构造函数,所以不能new来构造。
row1["Make1"]="aa";
row1["Make2"]="bb";
//0列自增,因此从1开始
DataRow row2=table.NewRow();
row1[1]="cc";
row1[2]="dd";
要以编程方式指定表中的一组行被修改、新增的时候,就会使用RowState属性。他是DataRowState枚举值:

ataRowVersion属性
除了RowState属性维护行的当前状态,DataRow对象还通过DataRowVersion属性维护了它包含的数据的3个可能版本。在首次构建DataRow对象时,它仅包含一份数据,表示为“当前版本”。然而,操作DataRow对象以后,就会引入其他版本的数据。DataRowVersion枚举:
|
Current |
表示行的当前值,即使在做出改变之后 |
|
Defaul |
DataRowState的默认值 |
|
Original |
首次插入DataRow的值,或者AcceptChanges()最后一次被调用后的值 |
|
Proposed |
调用BeginEdit()后当前正在被编辑的行的值。 |
n 在调用 DataRow 对象的 BeginEdit 方法之后,如果更改该值,则 Current 和 Proposed 值变得可用。
n 在调用 DataRow 对象的 CancelEdit 方法之后,Proposed 值将被删除。
n 在调用 DataRow 对象的 EndEdit 方法之后,Proposed 值变成 Current 值。
n 在调用 DataRow 对象的 AcceptChanges 方法之后,Original 值变得与 Current 值相同。
n 在调用 DataTable 对象的 AcceptChanges 方法之后,Original 值变得与 Current 值相同。
n 在调用 DataRow 对象的 RejectChanges 之后,Proposed 值将被丢弃,版本变成 Current。
可视化设计DataGridView
在为DataGridView设计数据源之后,就会发现App.config文件中多了字符串连接:
WindowsFormsDataTableViewer.Properties.Settings.db_TeachingMISConnectionString就是连接字符串的名字,可以看了所有代码,不会发现任何指向ConfigurationManager类型的引用从<connectionStrings>元素读取值。然而,在自动生成的适配器对象的构造函数中会调用如下函数:
其实每个VS项目类型都维护一组应用程序级别的设置,通过reflector.exe打开可以看到:


通过生成一个类图,我们可以发现DataSet、DataTable、DataRow都已经有了,在代码中可以使用这些生成的类型。
从UI层解耦
虽然DataGridView的数据配置向导已经为我们节省了很多代码,但是UI层硬编码了数据访问逻辑,这是一个设计错误。高兴的是,我们可以用另一种方式:添加一个数据集,然后连接上某个数据库,将希望生成的表拖到界面上,如下

例子说明:

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

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

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

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

浙公网安备 33010602011771号