ADO.NET对象详解

ADO和ADO.NET有着两个截然不同的对象模型:ADO定位在基于Windows 2000和NT的服务器平台;ADO.NET定位在支持.NET的平台。Microsoft预期在2001年末推出第一个.NET OS——Windows XP(原来的代码名字为Whistler)。不过,它的后继产品(代码名字为Blackcomb)更有可能提供一个全功能的.NET OS。

如果要迁移代码,我们可以把现有的ADO代码导入到.NET应用之中,从而节省在编写代码方面的投入。然而,如果不做重大的设计调整,同样的代码几乎不可能移植到ADO.NET。ADO和ADO.NET的对象模型不一样,两者在不同的设计指导思想下完成。

ADO.NET只用来构造基于.NET服务器的Web应用。ADO.NET是.NET应用程序的数据访问API。因此,只有把服务器升级到.NET之后, 你才可以考虑ADO.NET。在同一个应用程序中,让ADO和ADO.NET协同运作是没有什么意义的。虽然你可以同时使用这两者(至少从设计的角度来 看),但这并不是一种好的选择。

ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation。这些对象的主要特点说明如下。

▲ DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表,以及所有表的约束、索引和关系。所有这些信息都以XML的形式存在,我们可以处 理、遍历、搜索任意或者全部的数据。图1显示了一个典型的DataSet对象的模式。在这个例子中,DataSet对象包含两个表,其中一个表来自SQL Server,另一个表来自Oracle。两个表通过一个关系连接到一起,关系把源表的一组记录和目的表的一组记录关联到一起(例如,主-细关系)。另 外,一个XML表通过一对一(1:1)的关系关联到了Oracle表。


▲ DataTable:这个对象代表着可以在DataSet对象内找到的所有表,如图2所示。我们通过Tables属性访问DataTable的集合。类似 地,通过DataSet的Relations属性可以访问到所有已经建立的数据集关系。Xml属性包含了对象原始的XML描述,.NET应用程序可以从这 个XML字符串重新构造出数据集。

在ADO.NET对象模型的层次结构中,DataTable对象与ADO的Recordset对象最接近。根据具体目的的不同,我们可以在数据集之内或之 外创建和使用表。另外,我们可以手工执行命令——但首先必须定义表的模式——或者,依靠受管理数据提供者创建和填充表。(受管理提供者即Managed Provider,它是一种新的数据提供者类型,是ADO.NET中唯一直接访问数据源的途径。这种提供者封装了一个数据源,通过Microsoft .NET类返回数据。受管理提供者共用OLE DB的观念,但它是经过专用化的、优化的,而且很容易使用。)

▲ DataColumn:表包含与列有关的信息,包括列的名称、类型和属性。我们可以按照下面的方式创建DataColumn对象,指定数据类型,然后把列加入到表:

Dim dc As DataColumn
dc = New DataColumn()
dc.DataType = System.Type.GetType("System.String")
dc.ColumnName = "NameOfTheColumn"


任何时候,列的清单都可以通过DataTable的Columns集合得到。

▲ DataRow:要填充一个表,我们可以使用命令的自动数据绑定功能,或者也可以手工添加行,方法是:创建DataRow对象,把DataRow对象插入 到表,然后为该记录的各个字段填写数据。我们可以通过Rows集合导航DataTable的元素,利用Rows集合实现一个顺序导航器,或者,通过搜索或 直接定位跳转到特定的记录。

▲ DataRelation:这个对象代表着两个表之间的父-子关系。关系建立在具有同样数据类型的列上,但列不必有相同的精确度。关系可以是1:1、一对多(1:M)或多-对-多(M:N)关系。关系可以方便地把对父记录的改动传播到子记录,但这不是默认行为。

要启用DataRelation对象,我们必须把一个ForeignKeyConstraint加入到待修改数据表的 ConstraintsCollection成员。DataTable对象的ConstraintsCollection成员决定了当一个父表的值被删除 或改动时,要执行一些什么动作。

设置了关系之后,ADO.NET将拒绝所有破坏该关系的数据集改动操作,并产生一个运行时异常。在遍历表的记录时,调用GetChildRows方法可以 从已连接的表访问所有相关的行。GetChildRows方法返回一个DataRow对象的数组,这是一种新的分层式记录导航方式,而传统的记录导航方式 属于顺序模式或随机模式。

关系是不可传递的。假设表A关联到表B,表B又关联到表C的一些行。另外,假设在遍历表A记录的时候,对于每一个表A的记录,我们要访问现有关系中的子记 录。如果我们想要访问对应表B中特定记录的表C记录,那么,我们不能使用由A-B的关系得到的表B的DataRow对象;相反,我们必须从表B打开一个新 的表视图,找到我们想要的特定记录,然后通过表B对表C的关系调用GetChildRows方法。


【Listing 1:创建和填充一个DataSet对象】

' 执行命令
Dim strConn, strCmd As String
strConn = "DATABASE=Northwind;SERVER=localhost;UID=sa;PWD=;"
strCmd = "SELECT * FROM Employees"
Dim oCMD As New SQLDataSetCommand(strCmd, strConn)

' 向数据集加入一个命名的表,得到一个静态快照
Dim oDS As New DataSet
oCMD.FillDataSet(oDS, "EmployeesList")

' 遍历各个记录
Dim oRow As DataRow
For Each oRow In oDS.Tables(0).Rows
Response.Write(oRow(0).ToString() + " ")
Response.Write(oRow(1).ToString() + "<BR>")
Next


Listing 1的代码显示了如何访问SQL Server标准的Northwind数据库,创建并填充一个DataSet对象。关于DataSet及其下属对象的层次结构简图,请参考图2。

创建DataSet对象之后,我们打开了一个访问指定数据库的连接,并执行一个返回记录的命令。这个命令可以是一个SQL命令,或者也可以是一个存储过 程。下面的代码用到了FillDataSet方法,FillDataSet方法允许我们把命令返回的表关联到指定的数据集。

Dim oDS As New DataSet
oCMD.FillDataSet(oDS, "EmployeesList")


数据集中的每一个表都有一个名字,我们通过这个名字来提取内容。ADO.NET真正的进步源自数据集这一概念的提出,在ADO中不存在与ADO.NET DataSet类似的对象。虽然我们无法从这个例子看出DataSet对象的重要性,但从体系结构上说,DataSet对象处于一个不同的层次。它允许我 们在同一个逻辑对象的组织之下管理多个表,这个功能为我们实现主-细关系模式和数据绑定机制提供了前所未有的强大工具。另外,我们还可以通过索引引用一个 表。

修改数据

以脱机方式工作时,我们对数据的添加、修改、删除等更新操作在内存缓冲中进行。因此,如果你利用NewRow添加了新的记录,或者利用某个简单的工具编辑 现有的行,这些更新只在内存中进行,不影响底层的数据源。更新操作在我们从Command对象调用Update方法提交更改的时候发生。Update方法 为数据集中每个被插入、修改、删除的行分别调用Insert、Update和Delete命令。

我们可以利用ADO.NET命令的InsertCommand、UpdateCommand和DeleteCommand属性,指定面向特定数据源的命 令,插入、修改或删除记录。这些属性的内容和我们所要操作的数据提供者有关,但是,如果数据提供者是一个数据库管理系统(DBMS),属性的内容很可能就 是SQL命令字符串。当Update方法执行时,如果这些属性还没有设置好,但DataSet对象包含了主键信息,那么,ADO.NET将自动生成命令文 本。

我建议,只有当应用程序要求读取一定数量的记录并进行修改,而且修改的次序和数量不可预测时,才使用这种插入、更改、删除记录的方法。如果应用程序的用户界面只是要求填写几个字段,然后插入或更新记录,那么,执行SQL语句或存储过程是更理想的方法。
posted @ 2008-06-10 22:00  <一路向西  阅读(866)  评论(0)    收藏  举报