代码改变世界

ado.net的重要对象

2009-07-19 15:08  Peter Yao  阅读(408)  评论(0编辑  收藏  举报

与其他任何架构一样,ADO.NET也是由一些重要部分组成的。本节中,你将看到组成ADO.NET的各种对象。

          你可能知道,.NET类可以通过命名空间组织到一起。所有ADO.NET相关功能的类都位于System.Data命名空间下。这并不是说其他软件开发人员不能编写不属于这个命名空间但又实现了数据访问功能的类库,但是到.NET框架发布时,属于微软.NET框架一部分的所有ADO.NET相关功能都位于System.Data命名空间下。

          同样,就像其他.NET组件一样,ADO.NET并不是孤立的,它可以与.NET框架中各种其他组成部分——诸如System.Web.UI.WebControls.Adapters.TableAdapter类或System.Transactions命名空间等实现交互。

          ADO.NET架构可以分成两个基本类别:连接的和非连接的。在ADO.NET中的各种类都可以分成连接的和非连接的。唯一的例外是DataAdapter对象,它充当了连接的和非连接的类别之间的关卡。我们接下来要深入考察一下这两种类别的不同之处。

1.3.1  连接对象

面向连接的部分是,那些在与数据源交互和处理时必须要有打开的可用连接的对象。在ADO.NET中面向连接的部分主要包括如下对象:

l Connection:这个对象可以建立一个与数据源的连接。依赖于实际所用的.NET数据提供程序,连接对象可以自动为你池化物理数据库连接。它们并不池化连接对象实例,了解这一点很重要,但是它们会试图循环使用物理数据库连接。连接对象的例子有OleDbConnection,SqlConnection,OracleConnection等。这些将在第4章进一步讨论。

l Transaction:有时,你可能需要把一系列命令组织到一起或作为一个原子操作来执行,即“要么都执行,要么都不执行”。例如一个银行的应用程序,如果贷方不能执行操作,那么其借方也不应该执行操作。事务对象可以把一组命令组织起来原子化地执行。事务对象的例子有OleDbTransaction, SqlTransaction, OracleTransaction等。在ADO.NET 2.0中,你可以用System.Transactions命名空间来运行分布式事务,并支持非数据库事务。在ADO.NET 1.0和1.1中,使用System.EnterpriseServices命名空间可能并不是理想的解决方案。在第11章将会做个比较并讨论更多的细节。

l DataAdapter:这个对象可以作为ADO.NET中连接和非连接的网关。它可以建立一个连接,也可以提供一个已建立的连接。它拥有能够处理一个非连接对象的数据的足够信息,也可以基于事先没有指定的方式操作数据库。DataAdapter的例子有SqlDataAdapter,OracleDataAdapter等,将在第7章讨论它。

l Command:这个对象表示可在底层数据源上执行的命令。这个命令既可返回结果,也可不返回。这些命令可以用来操作、查询、更新或删除现存数据。此外,它们还可以用来操作底层数据表结构。命令对象的例子有SqlCommand,OracleCommand等。这些内容将在第5章讨论。

l Parameter:表示命令需要接收的参数。这就可以让命令更加灵活、接收输入值并且执行相应的操作。这些参数可以是存储过程的输入/输出值,或者是传递给SQL查询的“?”参数,或者是传递给动态查询的简单的命名参数。参数的例子有SqlParameter,OracleParameter等。这将在第5章讨论。

l DataReader:DataReader对象相当于是只读/只向前移的游标,可以用极快的速度从数据库获取数据,但是这种数据获取方式是只向前移和只读的。该对象将在第5章进一步讨论。

1.3.2  非连接对象

通常,只用连接对象并不能适应现代分布式应用程序的需求。非连接对象是使用ADO.NET构建的,只不过使用了一种不同的方法而已。非连接应用程序通常尽可能晚地连接,并且尽早地断开连接。在以非连接方式工作时,ADO.NET在不同的访问请求之间池化实际的物理连接。这将会在第4章讨论,我们会用实际的代码演示清晰地展示应用程序能通过这种连接池提高好几倍的性能。

          ADO.NET非连接模型下需要用到如下对象:

l DataSet:DataSet是ADO.NET非连接数据访问模型的核心。理解DataSet最好的方式就是,把它看作是完全在内存中表示的非常小的关系型数据库管理系统(RDBMS)。但它并不完全是RDBMS,而且永远也不能取代RDBMS,它的各个组件与大多数主要的RDBMS对象一一对应连接起来,这能帮助你理解DataSet。同时,DataSet是通过System.Data. DataSet来提供的,意识到这一点很重要,即数据集位于任何.NET提供程序(provider)之上,这样就把数据集变成与.NET数据提供程序无关(下一节将更多地讨论.NET数据提供程序)。DataSet也可以看作是DataTable和DataRelation的逻辑集合。

l DataTable:DataTable非常类似于数据库中的表。它是由DataColumn、DataRow以及作用于它们上的各种约束组成的。它以行/列格式存储数据。从ADO.NET 2.0开始,DataTable可以完全转换成XML,而且可以像DataSet那样被序列化。为满足数据访问的需要,可能在DataSet中就只包含一个DataTable,此时使用DataTable可能会更好。在以后的章节中你会看到,这样做不仅更方便,而且性能也更高。

l DataRow:DataTable的一个属性是DataRowCollection类型的Row,它表示一个可列举的DataRow对象集合。在数据填充到DataTable时,DataRowCollection获取一个新的DataRow对象,并且添加到其自身。在数据库中与DataRow最为贴切的逻辑对应就是数据表中的行。

l DataColumn:DataTable也包含一个DataColumnCollection类型的Column属性。本质上,这表示一个DataTable结构。在数据库中与DataColumn对象最为贴切的逻辑对应就是数据库中给定数据表的单个列。

l DataView:DataView很像是数据库中的视图。DataView可以让你在一个DataTable上创建一个“视图”,并且可以基于其Filter属性指定的一个预先设定的条件以查看数据的子集。你也可以使用Sort属性来对DataTable过滤后的子集数据进行排序。一个DataTable上可以定义多个视图。

l Constraint:DataTable也包含一个名为Constraint的ConstraintsCollection类型的属性。这就让你可以创建ForeignKeyConstraint或UniqueCosntraint对象,并且能把各个列关联到特定的条件上,在DataTable中,数据必须符合这些条件才能保存到DataTable中。在数据库中与ForeignKeyConstraint最为贴切的逻辑对应是外键,而Unique- Constraint指定了数据库中给定列的Unique条件。

l DataRelation:DataSet就像数据库一样,可以包含多个相互关联的表。DataRelation对象可以让你指定不同数据表之间的关系,这样就能实现跨数据表之间的数据验证,并在多个DataTable之间浏览父行和子行的数据。在数据库中最为贴切的逻辑对应是两个被指定的数据表之间的外键。ForeignKeyConstraint和DataRelation之间的差异在于:DataRelation除了能验证数据,还能让你很方便地在DataSet中的父行和子行之间遍历。

图1-3显示了各种连接和非连接对象如何应用到一起。

非连接对象

 

连接对象

 

 

 

数据源

 

应用程序

 

 

图1-3  ADO.NET的连接对象、非连接对象以及DataAdapter

          注意在图1-3中,你的应用程序是把ADO.NET当成整体来进行通信的。换言之,它可以选择使用非连接对象DataAdapter、连接对象或者它们的组合。

          所有这些对象将在第6章进一步讨论。跟ADO相比,数据留存对象(data holder object)过去是Recordset,而现在是DataSet。但是,它们之间完全不同,Recordset同时还负责与数据库之间的通信,而DataSet则不用。相反,它使用介于连接模式和非连接模式之间的网关——DataAdapter。非连接数据访问模型将在第6章到第10章中讨论。

          由于连接对象需要直接与底层数据库打交道,所以连接对象通常需要实现特定数据库代码。另一方面,非连接对象就意味着是与数据库无关的,因此从逻辑上假定可以在不同的数据库间实现共享。

          结果,大多数连接对象都是在所谓的.NET数据提供程序内实现的。