当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

4.1ADO.NET概述

8/31/2020 8:52:25 PM 人评论

4.1ADO.NET概述

4.1 ADO.NET概述

学习目标

熟悉ADO.NET的设计目标。熟悉ADO技术和ADO.NET技术的区别与联系。掌握ADO.NET的常用命名空间。

ADO.NET对Microsoft SQL Server和XML等数据源以及通过OLE DB和XML公开的数据源提供一致的访问。数据共享使用者应用程序可以使用ADO.NET来连接到这些数据源,并检索、处理和更新所包含的数据。

ADO.NET通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET包含用于连接到数据库、执行命令和检索结果的.NET Framework数据提供程序。可以直接处理检索到的结果,或将其放入ADO.NET DataSet对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet对象也可以独立于.NET Framework数据提供程序使用,以管理应用程序本地的数据或源自XML的数据。

ADO.NET类在System.Data.dll中,并且与System.Xml.dll中的XML类集成。当编译使用System.Data命名空间的代码时,可以引用System.Data.dll和System. Xml.dll。

4.1.1 ADO.NET的设计目标

随着应用程序开发的发展演变,新的应用程序越来越松散地耦合,通常基于 Web应用程序模型。如今,越来越多的应用程序使用XML来编码要通过网络连接传递的数据。Web应用程序将HTTP用作在层间进行通信的结构,必须显式处理请求之间的维护状态。这一新模型大大不同于连接、紧耦合的编程风格,此风格曾是客户端/服务器时代的标志。在此编程风格中,连接会在程序的整个生存期中保持打开,而不需要对状态进行特殊处理。

在设计符合当今开发人员需要的工具和技术时,Microsoft认识到需要为数据访问提供全新的编程模型,此模型是基于.NET Framework生成的。基于.NET Framework这一点将确保数据访问技术的一致性,因为组件将共享通用的类型系统、设计模式和命名约定。

设计ADO.NET的目的是为了满足这一新编程模型的以下要求:具有断开式数据结构;能够与XML紧密集成;具有能够组合来自多个不同数据源的数据的通用数据表示形式;以及具有为与数据库交互而优化的功能。这些要求都是.NET Framework固有的内容。

在创建ADO.NET时,Microsoft具有以下设计目标。

(1)利用当前的ActiveX数据类型(ADO)知识。

ADO.NET的设计满足了当今应用程序开发模型的多种要求。同时,该编程模型尽可能地与ADO保持一致,这使现在的ADO开发人员不必从头开始学习。ADO.NET是.NET Framework的固有部分,ADO程序员仍很熟悉。

ADO.NET还与ADO共存。虽然大多数基于.NET的新应用程序将使用ADO. NET来编写,但.NET程序员仍然可以通过.NET COM互操作性服务来使用ADO。

(2)支持N层编程模型。

使用断开式数据集这一概念已成为编程模型中的焦点。ADO.NET为断开式N层编程环境提供了一流的支持,许多新的应用程序都是为该环境编写的。N层编程的ADO.NET解决方案就是DataSet。

(3)集成XML支持。

XML和数据访问紧密联系在一起。XML与编码数据有关,数据访问也越来越多地与XML有关。.NET Framework不仅支持Web标准,还是完全基于Web标准生成的。

XML支持内置在ADO.NET中非常基本的级别上。.NET Framework和ADO. NET中的XML类是同一结构的一部分,它们在许多不同的级别集成。因此,不必在数据访问服务集和它们的XML相应服务之间进行选择;它们的设计本来就具有从其中一个跨越到另一个的功能。

4.1.2 ADO和ADO.NET

数据处理技术向来是程序设计的重要内容,ADO技术和ADO.NET技术实际上就是不同数据处理技术,使用这些技术可以完成编程语言和数据库的交互访问。而 ADO技术是传统的数据库访问技术,ADO.NET是目前最新的数据访问技术,可以通过将ADO.NET的各项功能与ActiveX数据对象(ADO)的特定功能进行比较来理解ADO.NET的功能。

1.数据在内存中表示形式

从数据在内存中表示形式来讲,在ADO中,数据为记录集。在ADO.NET中,它为数据集。它们之间有重要的差异。

(1)表的个数。

记录集看起来像单个表。如果记录集包含来自多个数据库表的数据,则它必须使用JOIN查询,将来自各个数据库表的数据组合到单个结果表中。

相反,数据集是一个或多个表的集合。数据集内的表称为数据表;明确地说,它们是DataTable对象。如果数据集包含来自多个数据库表的数据,它通常将包含多个DataTable对象。即每个DataTable对象通常对应于单个数据库表或视图。这样,数据集可以模仿基础数据库的结构。

数据集通常还包含关系。数据集内的关系类似于数据库中的外键关系,即它使多个表中的行彼此关联。例如,如果数据集包含一个有关投资者的表和另一个有关每个投资者的股票购买情况的表,则数据集可能还包含一个关系来连接投资者表的各个行和购买表的对应行。

由于数据集可以保存多个独立的表并维护有关表之间关系的信息,因此它可以保存比记录集丰富得多的数据结构,包括自关联的表和具有多对多关系的表。

(2)数据导航和游标。

在ADO中,使用ADO的MoveNext方法顺序扫描记录集的行。在ADO.NET中,行表示为集合,因此可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation对象维护有关主记录和详细资料记录的信息,并提供方法使程序员可以获取与正在操作的记录相关的记录。例如,从Investor表的“Nate Sun”的行开始,可以定位到Purchase表中描述其购买情况的那组行。

游标是数据库元素,它控制记录导航、更新数据的能力和其他用户对数据库所做更改的可见性。ADO.NET的不具有固有的游标对象,而是包含提供传统游标功能的数据类。例如,在ADO.NET的DataReader对象中提供只进、只读游标的功能。

2.将打开连接的时间降至最低

在ADO.NET中,打开连接的时间仅足够执行数据库操作,例如选择(Select)或更新(Update)。可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。在ADO中,记录集可以提供不连接的访问,但ADO主要是为连接的访问设计的。

ADO和ADO.NET中的不连接处理之间存在一个显著差异。在ADO中,通过调用OLE DB提供程序来与数据库通信。ADO.NET中通过TableAdapter或数据适配器(如SqlDataAdapter)与数据库通信,这会调用OLE DB提供程序或基础数据源提供的API。ADO和ADO.NET之间的主要区别在于:在ADO.NET中,适配器允许控制将对数据集所做的更改传输到数据库的方式,方法是实现性能优化、执行数据验证检查或添加其他任何额外处理。

3.在应用程序间共享数据

在应用程序间传输ADO.NET数据集比传输ADO不连接的记录集要容易得多。若要将ADO不连接的记录集从一个组件传输到另一个组件,可以使用COM封送。若要在ADO.NET中传输数据,可以使用数据集,它可以传输XML流。

相对于COM封送,XML文件的传输提供以下便利之处。

(1)更丰富的数据类型。

COM封送处理提供一组有限的数据类型(由COM标准定义的那些类型)。由于ADO.NET中的数据集传输基于XML格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。

(2)性能。

传输大型ADO记录集或大型ADO.NET数据集会使用网络资源;随着数据量的增长,施加于网络的压力也在增加。ADO和ADO.NET都可以最大限度地降低所传输的数据。但ADO.NET还提供另一个性能优势:ADO.NET不需要数据类型转换。而需要COM封送来在组件间传输记录集的ADO,则需要将ADO数据类型转换为 COM数据类型。

(3)穿透防火墙。

防火墙可以影响试图传输不连接的ADO记录集的两个组件。注意,防火墙通常配置为允许HTML文本通过,但防止系统级请求(如COM封送)通过。

因为组件使用XML交换ADO.NET数据库,所以防火墙可以允许数据集通过。

4.使用ADO.NET的好处

与ADO的早期版本和其他数据访问组件相比,ADO.NET提供了若干好处。这些好处分成以下几个类别。

(1)互操作性。

ADO.NET应用程序可以利用XML的灵活性和广泛接受性。由于XML是用于在网络中传输数据集的格式,因此可以读取XML格式的任何组件都可以处理数据。实际上,接收组件根本不必是ADO.NET组件:传输组件可以只是将数据集传输给其目标,而不考虑接收组件的实现方式。目标组件可以是Visual Studio应用程序或无论用什么工具实现的其他任何应用程序。唯一的要求是接收组件能够读取 XML。作为一项工业标准,XML正是在谨记这种互操作性的情况下设计的。

(2)可维护性。

在已部署系统的生存期中,适度的更改是可能的,但由于十分困难,所以很少尝试进行实质的结构更改。这是很遗憾的,因为在事件的自然过程中,这种实质上的更改会变得很有必要。例如,当已部署的应用程序越来越受用户欢迎时,增加的性能负荷可能需要进行结构更改。随着已部署的应用程序服务器上的性能负荷的增长,系统资源会变得不足,并且响应时间或吞吐量会受到影响。面对该问题,软件设计者可以选择将服务器的业务逻辑处理和用户界面处理划分到单独计算机上的单独层上。实际上,应用程序服务器层将替换为两层,缓解了系统资源缺乏。

该问题并不是要设计三层应用程序。相反,它是要在应用程序部署以后增加层数。如果原始应用程序使用数据集以ADO.NET实现,则该转换很容易进行。注意,当用两层替换单个层时,将安排这两层交换信息。由于这些层可以通过XML格式的数据集传输数据,所以通信相对较容易。

(3)可编程性。

Visual Studio中的ADO.NET数据组件以不同方式封装数据访问功能,帮助开发人员加快编程速度并降低犯错概率。例如,数据命令提取生成和执行SQL语句或存储过程的任务。

同样,由这些设计器工具生成的ADO.NET数据类导致类型化数据集。这又使可以通过已声明类型的编程访问数据。已声明类型的数据集的代码更易阅读。最后,已声明类型的数据集的代码更安全,原因在于它提供对类型的编译时检查。当使用未声明类型的数据集时,程序员直到运行时才会知道该错误。

(4)性能。

对于不连接的应用程序,ADO.NET数据库提供的性能优于ADO不连接的记录集。当使用COM封送在层间传输不连接的记录集时,会因将记录集内的值转换为COM可识别的数据类型而导致显著的处理开销。在ADO.NET中,这种数据类型转换则没有必要。

(5)可伸缩性。

因为Web可以极大地增加对数据的需求,所以可缩放性变得很关键。Internet应用程序具有无限的潜在用户供应。尽管应用程序可以很好地为十几个用户服务,但它可能不能向成百上千个(或成千上万个)用户提供同样好的服务。使用数据库锁和数据库连接之类资源的应用程序不能很好地为大量用户服务,因为用户对这些有限资源的需求最终将超出其供应。

ADO.NET通过鼓励程序员节省有限资源来实现可缩放性。由于所有ADO.NET应用程序都使用对数据的不连接访问,因此它不会在较长持续时间内保留数据库锁或活动数据库连接。

4.1.3 ADO.NET命名空间基础

在整个ADO.NET技术应用过程中会使用大量的命名空间,为了方便理解后续的ADO.NET编程代码,非常有必要先对和ADO.NET相关的命名空间做一个了解。

1.System.Data命名空间

System.Data命名空间提供对表示ADO.NET结构的类的访问。通过ADO.NET可以生成一些组件,用于有效管理多个数据源的数据。

在断开连接的情形中(如Internet),ADO.NET提供在多层系统中请求、更新和协调数据的工具。ADO.NET结构也在客户端应用程序(如ASP.NET创建的 Windows窗体或HTML页)中实现。

ADO.NET结构的中心构件是DataSet类。每个DataSet都可以包含多个DataTable对象,每个DataTable都包含来自单个数据源(如SQL Server)的数据。

每个DataTable都包含一个 DataColumnCollection(DataColumn对象的集合),DataColumnCollection决定每个DataTable的架构。DataType属性确定DataColumn所包含的数据的类型。使用ReadOnly和AllowDBNull属性可以进一步确保数据完整性。使用Expression属性可以构造计算出的列。

如果DataTable参与同另一个DataTable的父/子关系,则通过将DataRelation添加到DataSet对象的DataRelationCollection来构造该关系。在添加这样的关系时,将自动创建UniqueConstraint和ForeignKeyConstraint,具体取决于构造函数的参数设置。UniqueConstraint确保列中包含的值是唯一的。ForeignKeyConstraint确定当主键值被更改或删除时将对子行或子列执行的操作。

使用System.Data.SqlClient命名空间(用于SQL Server的.NET Framework数据提供程序)、System.Data.Odbc命名空间(用于ODBC的.NET Framework数据提供程序)、System.Data.OleDb命名空间(用于OLE DB的.NET Framework数据提供程序)或System.Data.OracleClient命名空间(用于Oracle的.NET Framework数据提供程序),可访问要与DataSet结合使用的数据源。每个.NET Framework数据提供程序都有相应的DataAdapter,可以将它用作数据源和DataSet之间的桥梁。

2.System.Data.Common命名空间

System.Data.Common命名空间包含由各种.NET Framework数据提供程序共享的类。

.NET Framework数据提供程序描述用于访问托管空间中数据源(例如数据库)的类的集合。支持的提供程序包括用于ODBC的.NET Framework数据提供程序、用于OLE DB的.NET Framework数据提供程序、用于Oracle的.NET Framework数据提供程序以及用于SQL Server的.NET Framework数据提供程序。System.Data. Common中的类旨在给开发人员提供一种方法以编写将作用于所有.NET Framework数据提供程序的ADO.NET代码。

3.System.Xml命名空间

System.Xml命名空间为处理XML提供基于标准的支持。

4.System.Data.OleDb命名空间

System.Data.OleDb命名空间是用于OLE DB的.NET Framework数据提供程序,包含了兼容数据源的OLE DB .NET Framework数据提供程序的所有类。这些类能连接到OLE DB数据源,针对数据源执行命令并读取结果。

5.System.Data.SqlClien命名空间

System.Data.SqlClient命名空间是SQL Server的.NET Framework数据提供程序,包含了SQL Server .NET Framework数据提供程序的所有类,可以说SQL Server的.NET Framework数据提供程序描述了一个类集合,这个类集合用于访问SQL Server数据库、执行命令并读取结果。使用SqlDataAdapter可以填充驻留在内存中的DataSet,该数据集可用于查询和更新数据库。System.Data.SqlClient命名空间与System.Data.OleDb命名空间类似,但为访问SQL Server进行了优化,所以通常要访问SQL Server数据库最好选择System.Data.SqlClient命名空间的.NET Framework数据提供程序来完成。

6.System.Data.SqlTypes命名空间

System.Data.SqlTypes命名空间为SQL Server中的本机数据类型提供类。这些类为.NET Framework公共语言运行库(CLR)所提供的数据类型提供了一种更为安全和快速的替代项。使用此命名空间中的类有助于防止出现精度损失造成的类型转换错误。由于其他数据类型在幕后与SqlTypes进行相互转换,所以在此命名空间内显式创建和使用对象将会使代码更快。

SqlTypes中的每个数据类型在SQL Server中都有等效的数据类型(具有相同的基础数据表示形式)。很多数据类型在CLR中也有等效数据类型。

7.System.Data.Odbc命名空间

System.Data.Odbc命名空间是用于ODBC的.NET Framework数据提供程序。用于ODBC的.NET Framework数据提供程序描述用来访问ODBC数据源的类集合。使用OdbcDataAdapter类可以填充驻留在内存中的DataSet,该数据集可用于查询和更新数据源。

8.System.Data.OracleClient命名空间

System.Data.OracleClient命名空间是用于Oracle的.NET Framework数据提供程序。用于Oracle的.NET Framework数据提供程序描述了访问Oracle数据源的类集合。使用OracleDataAdapter类可以填充驻留在内存中的DataSet,查询该数据集以及使用该数据集更新数据源。

4.1.4 ADO.NET 3.0新特性

语言集成查询(Language-Integrated Query, LINQ)是一项新技术,它将查询功能直接引入到.NET Framework 3.0编程语言。查询操作通过语言自身传达,而不是以字符串嵌入到应用程序代码中。在.NET Framework中,LINQ被集成到数据访问的各个方面。

定义了一组可以在.NET Framework 3.0编程语言中使用的通用标准查询运算符。使用这些标准查询运算符可以投影、筛选和遍历内存中的集合或数据库中的表。注意,LINQ查询使用编程语言本身进行表示,而不表示为应用程序代码中嵌入的字符串。这是在.NET Framework的早期版本中编写多数应用程序方式的重大更改。使用编程语言中编写查询具有多项重要优势。它可以简化查询,不必使用单独的查询语言。并且,如果使用Visual Studio 2012 IDE, LINQ还允许利用编译时检查、静态类型和IntelliSense。在.NET Framework中,数据访问的各个方面都集成了 LINQ,包括DataSet断开连接式编程模型和现有的SQL Server数据库架构。本节说明LINQ的实现ADO.NET(LINQ to ADO.NET)。

图4-1所示的关系图概述了 LINQ to ADO.NET如何关联到高级编程语言、其他LINQ技术和启用LINQ的数据源。

图4-1 LINQ to ADO.NET关系图

相关教程

共有条评论 网友评论

验证码: 看不清楚?