ADO对象模型

2024-08-04

ADO对象模型(精选5篇)

ADO对象模型 第1篇

ADO(Active X Data Objects,Active X数据对象)是Microsoft公司提供的一种用统一方式访问多种数据源的方法,它基于被微软称之为OLE DB的数据访问模式,既可访问传统的关系型数据表,也可访问诸如电子邮件系统、图形格式、Internet资源等。由于ADO技术的迅速普及,Delphi从5.0开始加入了ADO技术的模块,并逐渐形成Delphi数据库设计的主流。Delphi2010中通过ADO对象模型提供了几种存取数据库的方法,下面研究常用的3种方法的使用。

2 Delphi 2010中ADO对象模型

Delphi 2010中ADO对象模型位于db Go面板中,如图1所示[1,2]。

Delphi 2010中常用TADOCommand组件、TADOTable组件、TADOQuery组件存取数据,这3种方法既可使用ODBC方式连接,也可以使用OLE DB方式连接。由于ODBC方式要访问注册表,而OLE DB方式无需访问注册表,因而OLE DB方式要比ODBC方式快。在此分别介绍上述3个组件使用OLE DB方式存取数据库的方法。在具体操作数据库前,通常使用TADOConnection组件连接数据源。

2.1 使用TADOConnection组件连接数据源

Delphi中在使用TADOConnection组件连接数据源前需创建该对象的实例,创建方法如下:

ADOCommnection:=TADOConnection.create(nil);

创建后使用Connection String属性指定连接的数据源。下面是使用OLE DB方式连接c:database1.mdb数据库的代码。

ADOConnection1.Connection String:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:Database1.mdb;Persist Security Info=False';

2.2 使用TADOCommand组件实现数据库的存取

使用TADOCommand组件存取数据库需用到以下几个属性:

Connection:关联一个已连接的对象实例。

Command Text:定义一个SQL语句或存储过程。

Execute:运行Command Tex t属性中定义的SQL语句或存储过程。

2.3 使用TADOTable组件实现对数据库的存取

使用TADOData Set组件存取数据库时需用到以下属性:

Connection:关联一个已连接的对象实例。

Table Name:指定具体操作的表名。

Open:执行连接操作。

Delete、Insert和Update属性用对指定数据表中记录的删除、插入和修改操作。

2.4 使用TADOQuery组件实现对数据库的存取

使用TADOQuery组件存取数据库时需用到下面的几个属性:

Connection:关联一个已连接的对象实例。

SQL.Add:指定SQL语句。

另外,若结果有返回,则使用Open属性;否则可使用Exec Sql。

3 访问数据库

Delphi中存取数据库的步骤如下[3]:

Step1:连接数据库;

Step2:指定SQL命令;

Step3:执行SQL命令;

Step4:处理数据;

Step5:关闭数据库;

下面是Delphi中用上述3种方式以OLE DB方法将数据插入Access数据库表中的具体代码,数据库名c:database1mdb,表名xy(name,class,scord)。

3.1 使用TADOCommand组件

代码如下:

3.2 使用TADOTable组件

3.3 使用TADOQuery组件

4 结语

TADOTable只能用于单表操作,TADOCommand和TADO-Query既可用于单表操作,也可用于多表操作。TADOTable和TADOCommand操作无返回结果,而TADOQuery操作既可返回结果(使用Open属性),也可不返回结果(使用Exec Sql属性)。

参考文献

[1]吴懋刚.Delphi程序设计基础教程[M].北京:北京理工大学出版社,2007.

[2]叶核亚,陈瑞.Delphi程序设计实用教程[M].北京:电子工业出版社,2007.

ADO对象模型 第2篇

ADO 编程模型详细资料

以下元素是 ADO 编程模型中的关键部分:

连接

命令

参数

记录集

字段

错误

属性

集合

事件

连接

通过“连接”可从应用程序访问数据源,连接是交换数据所必需的环境,通过如 Microsoft® Internet Information Server 作为媒介,应用程序可直接(有时称为双层系统)或间接(有时称为三层系统)访问数据源。

对象模型使用 Connection 对象使连接概念得以具体化。

“事务”用于界定在连接过程中发生的一系列数据访问操作的开始和结束。ADO 可明确事务中的操作造成的对数据源的更改或者成功发生,或者根本没有发生。

如果取消事务或它的一个操作失败,则最终的结果将仿佛是事务中的操作均未发生,数据源将会保持事务开始以前的状态。

对象模型无法清楚地体现出事务的概念,而是用一组 Connection 对象方法来表示。

ADO 访问来自 OLE DB 提供者的数据和服务。Connection 对象用于指定专门的提供者和任意参数。例如,可对远程数据服务 (RDS) 进行显式调用,或通过“Microsoft OLE DB Remoting Provider”进行隐式调用。(请参阅 RDS 教程通过“MS Remote Provider”调用 RDS 第二步的范例)

命令

通过已建立的连接发出的“命令”可以某种方式来操作数据源。一般情况下,命令可以在数据源中添加、删除或更新数据,或者在表中以行的格式检索数据。

对象模型用 Command 对象来体现命令概念。Command 对象使 ADO 能够优化对命令的执行。

参数

通常,命令需要的变量部分即“参数”可以在命令发布之前进行更改。例如,可重复发出相同的数据检索命令,但每一次均可更改指定的检索信息。

参数对执行其行为类似函数的命令非常有用,这样就可知道命令是做什么的,但不必知道它如何工作。例如,可发出一项银行过户命令,从一方借出贷给另一方。可将要过户的款额设置为参数。

对象模型用 Parameter 对象来体现参数概念。

记录集

如果命令是在表中按信息行返回数据的查询(行返回查询),则这些行将会存储在本地。

对象模型将该存储体现为 Recordset 对象。但是,不存在仅代表单独一个 Recordset 行的对象。

记录集是在行中检查和修改数据最主要的方法。Recordset 对象用于: 指定可以检查的行。

移动行。

指定移动行的顺序。

添加、更改或删除行。

通过更改行更新数据源。

管理 Recordset 的总体状态,

字段

一个记录集行包含一个或多个“字段”。如果将记录集看作二维网格,字段将排列构成“列”。每一字段(列)都分别包含有名称、数据类型和值的属性,正是在该值中包含了来自数据源的真实数据。

对象模型以 Field 对象体现字段。

要修改数据源中的数据,可在记录集行中修改 Field 对象的值,对记录集的更改最终被传送给数据源。作为选项,Connection 对象的事务管理方法能够可靠地保证更改要么全部成功,要么全部失败。

错误

错误随时可在应用程序中发生,通常是由于无法建立连接、执行命令或对某些状态(例如,试图使用没有初始化的记录集)的对象进行操作。

对象模型以 Error 对象体现错误。

任意给定的错误都会产生一个或多个 Error 对象,随后产生的错误将会放弃先前的 Error 对象组。

属性

每个 ADO 对象都有一组唯一的“属性”来描述或控制对象的行为。

属性有两种类型:内置和动态。内置属性是 ADO 对象的一部分并且随时可用。动态属性则由特别的数据提供者添加到 ADO 对象的属性集合中,仅在提供者被使用时才能存在。

对象模型以 Property 对象体现属性。

集合

ADO 提供“集合”,这是一种可方便地包含其他特殊类型对象的对象类型。使用集合方法可按名称(文本字符串)或序号(整型数)对集合中的对象进行检索。

ADO 提供四种类型的集合: Connection 对象具有 Errors 集合,包含为响应与数据源有关的单一错误而创建的所有 Error 对象。

Command 对象具有 Parameters 集合,包含应用于 Command 对象的所有 Parameter 对象。

Recordset 对象具有 Fields 集合,包含所有定义 Recordset 对象列的 Field 对象。

另外,Connection、Command、Recordset 和 Field 对象都具有 Properties 集合。它包含所有属于各个包含对象的 Property 对象。

ADO 对象拥有可在其上使用的诸如“整型”、“字符型”或“布尔型”这样的普通数据类型来设置或检索值的属性。然而,有必要将某些属性看成是数据类型“COLLECTION OBJECT”的返回值。相应的,集合对象具有存储和检索适合该集合的其他对象的方法。

例如,可认为 Recordset 对象具有能够返回集合对象的 Properties 属性。该集合对象具有存储和检索描述 Recordset 性质的 Property 对象的方法。

事件

“事件”是对将要发生或已经发生的某些操作的通知。一般情况下,可用事件高效地编写包含几个异步任务的应用程序。

对象模型无法显式体现事件,只能在调用事件处理程序例程时表现出来。

在操作开始之前调用的事件处理程序便于对操作参数进行检查或修改,然后取消或允许操作完成。

ADO对象模型 第3篇

Data Reader对象是ADO.NET数据模型中的一个重要成员, 它是一个DBMS所特有的, 常用来检索大量的数据。Data Reader对象是以连接的方式工作, 它只允许以只读、顺向的方式查看其中所存储的数据, 并在Execute Reader方法执行期间进行实例化。它每次的访问或操作只有一个记录保存在服务器的内存中。相比与Data Set而言Data Reader具有快速的数据库访问、只进和只读、减少服务器资源等特点。

1.1 常用属性

Depth:设置阅读器浓度。对于Sql Data Reader类, 总是返回0。它指出当前行的嵌套浓度。外层表的浓度总是为0;内层表的浓度按1递增。大多数的数据阅读器, 包括Sql Data Reader和Ole Db Data Reader类, 不支持多层嵌套, 所以Depth属性总是为0。

Field Count:只读, 表示纪录中有多少字段。Field Count属性获取Data Reader对象中有几行数据, 它的默认值为-1。如果未放在有效的记录集中, 属性值则为0;否则为当前行中的列数。

s Closed:获得一个表明数据阅读器有没有关闭的值。

Item:只读, 本对象是集合对象, 以键值 (Key) 或索引值 (Index) 的方式取得纪录中某个字段的数据

1.2 常用方法

了解Data Reader对象有什么属性后, 我们就可以利用Data Reader所提供的方法来取回资料了。其常用的方法:

Read:让Data Reader读取下一笔记录, 如果有读到数据则传回True, 若没有纪录则传回False。

Close:关闭Data Reader对象。关闭阅读器对象并不会自动关闭底层连接。

Get:用来读取数据集的当前行的某一列的数据。

Get Name:取得指定字段的字段名称

Get Ordinal:取得指定字段名称在纪录中的顺序

Get Values:取得全部字段的数据

Is Null:用来判断字段内是否为Null值

1.3 Data Reader的特点

1) 快速的数据库访问。相比之下Data Reader对象的速度要比Data Set要快。因为Data Set在创建和初始化时, 可能是一个或多个表的集合, 并且Data Set具有向前, 向后读写和浏览的能力, 所以当创建一个Data Set对象时, 会造成额外的开销。

2) 只进和只读。当对数据库的操作没有太大的要求时, 可以使用Data Reader显示数据。这些数据可以与单个list-bound控件绑定, 也可以填充List接口。当不需要复杂的数据库处理时, Data Reader能够较快的完成数据显示。

3) 减少服务器资源。因为Data Reader并不是数据的内存的表示形式, 所以使用Data Reader对服务器占用的资源很少。

4) 自定义数据库管理。Data Reader对象可以使用Read方法来进行数据库遍历, 当使用Read方法时, 可以以编程的方式自定义数据库中数据的显示方式, 当开发自定义控件时, 可以将这些数据整合到HTML中, 并显示数据。

1.4 创建Data Reader对象的步骤

1) 创建Connection对象。利用连接字符串创建Connection对象。

2) 创建Command对象。利用SQL语句和Connection对象创建Command对象。

3) 打开数据库, 调用Command对象的Execute Reader () 方法返回Data Reader对象。注意, 一定要先打开数据库, 然后在返回Data Reader对象。因为Execute Reader () 方法要求已经打开并且可用的数据库连接。

4) 使用Data Reader对象的Read () 方法进行逐行读取, 该方法返回Boolean类型的值, 若有数据可读, 则返回True.否则为, False。

data Reader.Read ()

5) 读取当前行某列的值。我们可以像使用数组那样, 用方括号读取某列的值, 如 (type) data Reader[0], 方括号中可以像数组一样使用列的索引, 从0开始, 也可以使用列名, 因为取出的值是Object类型的, 所以要进行类型转换。 (string) data Reader["studentName"];

6) 关闭Data Reader对象。调用其Close () 方法进行关闭。Data Reader对象它是独占数据库连接的。所以, 当我们需要利用Connection对象进行其他操作时, 必须调用Data Reader对象的Close () 方法关闭Data Reader对象。

2 Data Reader对象的应用

2.1 常用方法

1) Read方法

在取得Command对象执行Execute方法所产生的Data Reader对象后, 我们就可以将记录中的数据取出使用。Data Reader一开始并没有取回任何数据, 所以我们要先使用Read方法Data Reader先读取一笔数据回来。如Data Reader对象成功取得数据则传回True, 若没有取得资料则传回False。这样一来我们就可以利用Do While...Loop循环来取得所有的数据, 如下列程序段所示:

Do While dr A.Read ()

Response.Write ("User Id:"&dr A.Item ("User Id") &", Password:")

Response.Write (dr A.Item (1) &"
")

上述程序代码片段利用Read方法将数据取回后, 再利用Item集合以键值 (Key) 的方式取出User Id字段的数据, 以及利用索引值 (Index) 取得使用者User Pwd字段的数据;索引值是由0开始计数, 故第一个字段的索引值为0, 依此类推。当数据读取完毕后Read方法会传回False, 所以就跳出循环。

2) Get Value方法

我们也可以使用Get Value方法取得指定字段内的记录, 这个方法和Item属性很像;不过Get Value方法的参数只接收索引值, 并不接收键值为参数。我们改用Get Value取得所有字段内的数据, 如下程序所示:

3) Get Values方法

Get Values方法是取得字段内所有的记录。这个方法接收一个数组, 并且将所有字段填入数组中, 如下程序所示:

因为索引值是由零开始算, 所以我们在使用For...Next循环的时候记得将结束值减一。

4) Close方法

Close方法可以关闭Data Reader对象和数据源之间的联机。除非把Data Reader对象关闭, 否则当Data Reader对象尚未关闭时, Data Reader所使用的Connection对象就无法执行其它的动作。

2.2 应用实例

本实例介绍了Data Reader应用的关键技术, 主要以Sql Data Reader对象读取数据库 (xs) 中Student表所有内容为背景, 并将其读取的全部内容显示在页面, 最后关闭Sql Data Reader。

1) 新建一个网站, 将其命名为01, 默认主页名为Default.aspx。

2) 在编写代码前需引入命名空间System.Data.Sql Client。

3) 通过spt对象的Read方法将Student表中的信息动态的读取出来, 并加已显示, 代码如下。

摘要:DataReader对象是ADO.NET中的重要成员之一, 常用来检索大量的数据。该文介绍了DataReader对象常用的属性、方法、特点及使用步骤, 并对其应用进行了探讨。

关键词:.NET平台,ADO.NET,DataReader

参考文献

[1]魏峥.ADO.NET程序设计教程与实验[M].北京:清华大学出版社, 2007.

ADO对象模型 第4篇

当今世界对数据的需求越来越迫切,数据库的发展可谓是一日千里。现代的数据库不仅能存储传统的文字数据,还可以存储图象、视频、声音等数据。无论采用任何软件编写程序访问数据库,都必须事先建立好数据库,用VB.NET访问数据库也是如此,所以,要为以后方便使用VB.NET访问数据库,必须建立结构合理的数据库。

1.1 数据库系统的基本概念

数据库(DB)是按特定方式存储在存储媒体中可共享的相关数据的集合,可以理解为数据的仓库。现在的数据库往往由多个表(table)组成,表是一个由若干行、若干列组成的二维的关系结构。而数据库可以理解为是由多个表和表之间的关联关系组成的数据的集合。其存在形式是一个计算机文件,如:ABC.DBF,客户.MDB,Total.DBC,我们称之为数据库文件或库文件。

数据库管理系统(DBMS)是数据库系统中对数据进行管理的软件系统。如:Visual Fox Pro,SQL SERVER,ACCESS,Oracle,具有数据定义、数据操作、数据控制与管理的功能。它提供一个可以方便地、有效地存取数据库信息的环境,是用户和数据库的接口。

1.2 数据库应用系统的体系结构

数据库应用体系结构中主要有集中式结构、客户/服务器结构(C/S)和浏览器/服务器结构(B/S)三种形式。

1)中央集中式系统是数据库系统早期的产品,以IBM公司的大型主机为代表。在中央集中式机构中,所有的应用程序都放在大型主机上运行,这些程序包括数据库管理系统和访问数据库的应用程序。

2)C/S结构

C/S结构即客户/服务器(Client/Server)结构,此结构的体系组成要素为服务器、客户机和网络。在客户/服务器系统中,用户是请求的发起者,服务器是请求的处理者和响应者,而且一台客户机可以向不同的服务器请求服务。

3)B/S结构

所谓B/S结构,就是只安装一个服务器(Server),而客户机采用浏览器运行软件,即浏览器/服务器结构。

2 VB.NET特点及应用

Visual Basic.NET是基于微软.NET Framework之上的面向对象的中间解释性语言,可以看作是Visual Basic在.Net Framework平台上的升级版本,增强了对面向对象的支持。在VB.NET中提供了可视化操作数据库的集成开发环境(integrated development environment,简称IDE)。在此环境中,用户可以利用这些可视化数据库工具,可以方便地访问和操作数据库。

Visual Basic.NET最初是随vc#和ASP.NET一起在2002年发布的最初始的VB.net版本。Visual Basic.NET 2003是和.NET Framework 1.1一起发布的。其功能包括对.NET Compact Framework的支持和更好的VB升迁向导,并改进了运行状况,IDE稳定性(尤其是后台编译器),以及运行时Run Time稳定性。Visual Basic 2005是VB.Net的重大转变,微软决意在其软件名称中去掉了.NET部份。在VB2005中,微软增加了许多新功能,以引用VB对于初学者来说的一些优点。到目前为止,VB.NET版本已经更新到了Visual Basic 2008。

在VB.NET中可以同时开发C/S和B/S两种模式下的数据库应用程序。在“模版”中选择“Windows应用程序”,可以开发C/S模式的应用程序;在“模版”中选择“ASP.NET Web应用程序”,可以开发B/S模式下的应用程序。

3 VB.NET中ADO.NET对象模型

3.1 ADO.NET概述

不同的数据库都提供有一组应用程序接口(API),供应用程序访问数据时使用,但是这些API互不相同,如果要访问这些数据库,程序员就要熟悉这些数据库的API,这样,就给程序员访问数据库带来了不便。现在有了.NET,微软提供了一个普及的通用的框架—框架类库,该类库将跨越所有的存在的Windows API函数,特别的,它将包含一些经常使用的库,而且用户会发现XML和ADO对象模型被集成在一个树状的类的集合中,这个集合就叫做ADO.NET。

不像ADO那样,ADN.NET被设计成为遵循一般的更没有面向数据库缺陷的数据库访问准则,ADO.NET搜集了所有的和数据访问有关的类,这些类由一些数据容器对象组成,这项对象具有一般的数据处理能力—索引、排序和浏览。ADO.NET是为.NET数据库应用程序定义的开发办法,ADO.NET是一个对数据库的整套设计环境,而不是象ADO那样只是围绕着数据访问和数据处理的。

3.2 ADO.NET的优点

Visual Basic 6.0中访问数据库,一般采用ADO(ActiveX Data Object)。ADO作为微软访问数据库的一种模型,已经存在多年。在VB.NET中,微软推出了新的数据访问模型ADO.NET,它将成为构建数据感知.NET应用程序的基础。与ADO的早期版本和其它数据访问组件相比,ADO.NET有以下优点:1)互操作性;2)可维护性;3)可编程性;4)性能优越;5)可伸缩性。

3.3 ADO.NET的结构和数据提供程序

以前数据处理主要以来于双层模型,现在数据处理越来越多使用多层结构向断开方式转变,ADO.NET借用XML提供对数据的断开式访问,而在VB.NET中完成此任务的是ADO.NET的两个核心组件:Data Set和.NET数据提供程序,另外一组是包括Connection,Command,Data Reader和Data Adapter对象在内的组件.

ADO.NET配套的四种数据提供程序,分别是用于SQL Server7.0及更高版本的SqlClient数据提供程序,对应的名字空间是System.Data.SqlClient;用于OLE DB数据源的OleDb数据提供程序,对应的名字空间是System.Data.OleDb;用于ODBC数据源的Odbc数据提供程序,对应的名字空间是System.Data.Odbc;用于Oracle数据源的Oracle Client数据提供程序,对应的名字空间是System.Data.OracleClient。(注意:.NET Framework1.0版本不包括Odbc和OracleClient数据提供程序,需要从微软官方站点下载安装)。以下主要以SqlServer为例介绍一下数据源提供程序的使用方法。

4 ADO.NET对象与数据库的交互

ADO.NET的数据提供程序(Data Provider)提供四大组件(对象):Connection,Command,Data Reader,Data Adapter下面就以SQL Server数据源为例分别介绍一下这对象的使用方法。

4.1 Connection对象

Connection对象表示与数据源之间的连接。可通过Connection对象的各种不同属性指定数据源的类型、位置以及其他属性,可用它来与数据库建立连接或断开连接。Connection对象起到渠道的作用,其他对象如Data Adapter和Command对象通过它与数据库通信。连接到数据源可以在设计时创建连接,也可以通过程序代码建立连接。

1)设计时连接

在窗体的“工具”选项卡中的“数据”中选中Sql Connection,将其拖动到窗体上,生成一个连接对象,选中连接对象,设置Connection String属性。

2)通过代码连接

Dim conn As New Sql Connection()

Conn.Connection String=“Server=Computer Name;Database=orders;UID=sa;PWD=sa”

Conn.Open();

或者

Dim conn As New Sql Connection(“Server=Computer Name;Database=chengyuan;UID=sa;PWD=sa”)

Conn.Open();

注:server数据库服务计算机的名称

Database数据库名称

UID登录数据库的帐号

PWD登录数据库帐号的密码

4.2 Command对象

表示对数据库的查询、对存储过程的调用或要返回特定表内容的直接请求。可使用Command对象对数据库执行任何一种查询、更新、添加和删除操作。Command对象分为创建和执行两个过程。

创建Command对象

创建Command对象的语法如下:

Dim cmd as New SqlCommand()

cmd.Connection=conn;//引用上一步(4.1)的连接

cmd.Command Text=“select*from yuangong”//yuangong为chengyuan数据库中的表

或者

Dim cmd As New Sql Command(“select*from yuangong”,conn)

执行Command对象

执行Command对象有以下四种方法:

1)cmd.Execute Reader(创建Data Reader)

2)cmd.Execute Non Query(执行没有返回数据的SQL语句)

3)cmd.Execute Scalar(返回单个值如:Count(*)Sum(*)或者Avg(*)等

4)cmd.Execute Xml Reader(返回XML流的形式)

4.3 Data Reader对象

Data Reder用于以最快的数据检索并检查查询所返回的行。可使用Data Reader对象来检查查询结果,一次查询一行,当移到下一行时,前一行的内容就会被放弃。Data Reader不支持更新操作,由Data Reader返回的数据是只读的。由于Data Reader对象支持最小特性集,所以它的速度非常快,而且是轻量的。Data Reader对象分为创建Data Reader对象和读取Data Reader中的记录。

创建Data Reader对象

Dim reader As New Sql Data Reader()

读取Data Reader中的记录

当Data Reader对象创建成功后,我们可以用reader.Read()命令来读取记录,如果要读取全部返回行,我们必须采用循环结构才可以实现。

4.4 Data Adapter对象

ADO.NET中提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataReade和DataSet,DataAdapter对象充当数据库和ADO.NET对象模型中断开连接的对象之间的桥梁。DataAdapter对象会填充DataSet对象中的表,而且能读取缓存的更改并将其提交给数据库。具体四个对象结合实现数据操作代码如下:

Dim conn As New Sql Connection()

Conn.Connection String=“Server=Computer Name;Database=orders;UID=sa;PWD=sa”

Conn.Open();//连接数据库

Dim adapter As New Sql Data Adapter=New Sql Data Adapter(“select*from yuangong”,conn)//创建Data Adapter(数据库适配器)对象

Dim data As New Data Set()

adapter.Fill(data,"yuangong")//利用创建的Data Adapter对象向Data Set对象中添加要操作的数据库表

Conn.Close()//关闭数据库

摘要:当今世界对数据的需求越来越迫切,无论采用任何软件编写程序访问数据库,都必须事先建立好数据库,用VB.NET访问数据库也是如此。在VB.NET中,微软推出了新的数据访问模型ADO.NET,它将成为构建数据感知.NET应用程序的基础。

关键词:VB.NET,ADO.NET对象,数据库,交互

参考文献

[1]刘保顺.Visual Basic.NET数据库开发专业教程[M].北京:清华大学出版社,2004.

ADO对象模型 第5篇

Ado.net在数据访问上提供了2种方式:1、连接模式:一般采用DbDataReader对数据进行读取, 读取的过程中, 数据库连接始终是打开的。在读取数据前, 打开数据库连接。读取结束后在关闭数据库连接。2、断开模式:利用DbDataAdapter将数据一次性取出, 填充到DataSet中, 然后关闭数据库连接, DataSet中的数据和数据库是完全断开的。由DbDataAdpater在是获取数据前, 判断数据库连接是否打开, 如果处于关闭状态, 则将连接打开, 填充完DataSet之后, 再将数据库连接关闭。如果连接在获取数据之前已经打开, 则不打开连接, 填充完DataSet后也不将连接关闭。因此Ado.net的工作方式可以归纳为以下流程:1、打开连接。2、执行SQL语句返回结果。3、关闭连接。可以说这3个步骤组成了.net下数据操作的标准模式。虽然数据操作只是在重复这3个基本步骤, 但是在单线程和多线程的应用场合下实现的细节也有所不同。

单线程应用开发时, 常用的做法是整个应用程序共享一个数据库连接;由于一个应用程序中, 用户同一时间只能进行一次数据库操作, 因此这种方法是可行的。而进行多线程应用开发时, 由于是多线程并发操作数据库, 因此每次数据库操作都实例化一个数据库连接, 然后再执行标准的3个步骤。

2、发现问题

基于Ado.net的工作方式可以发现, 如果同时进行的多个数据操作, 共享一个数据库连接, 是绝对不允许的。断开模式会自动打开关闭数据库连接, 因此当多个操作共享同一个数据库连接时, 如果在执行操作前没有打开数据库连接, 则开始的操作自动打开连接并在操作完成后关闭连接, 而数据库连接被关闭后将可能导致其他操作失败。这个问题似乎可以通过在所有数据库操作之前打开连接, 并在所有操作完成后关闭连接的方式来解决。然而在实际的使用中, 如果在断开模式下用同一个数据库连接, 获取数据, 时常会出现"已经有一个打开的DataReader对象与这个Connection对象相关联, 应首先关闭该DataReader对象"的InvalidOperationException异常消息。

深入探究之后发现, 针对并行的数据读取操作Ado.net提供了MARS (即:Multiple Active Result Sets) 来解决这个问题, 在数据库连接字符串中加入"MultipleActiveResultSets=true"。但并不是所有数据库都支持MARS, 常用的Sql server2000数据库就是一个例子, 而且启用MARS会大大降低系统的性能。当数据库不支持MARS时或出于性能上的考虑又或者不是读取而是进行写操作, 最常用的做法就是每一个数据操作都实例化一个数据库连接。

然而, 看似合理的做法又引来了新的问题。首先服务器资源是有限的, 每次数据操作都实例化一个连接都会占用服务器资源, 特别是在长时间的数据存取操作上。如果实例化并打开了一个数据连接, 但忘记关闭, 将占用服务器的连接直到垃圾回收机制自动回收的时候才会释放当前占用的连接, 容易造成所谓的连接泄露。其次, 客户端进行异步调用的时候往往无法预测并发的数量, 无限制发起异步操作并同时进行将导致服务器超负荷工作, 不仅没有起到优化的作用, 还带来了更多负面的影响 (如:连接超时、响应变慢、内存不足等一些列问题) 。

如果能实现一个通用的对象池, 管理、分配数据库连接, 同时控制最大的并发数, 就可以避免上述问题的发生。

3、解决的办法和实现

一般的思想是, 数据库连接的打开耗费的资源大, 所以通常情况下简单的数据库连接池实现都是直接创建打开连接, 存入池中, 按照优先级策略获取可用连接。但是这种连接池的实现方式并不能从根本上解决上述问题。Ado.net本身已实现了连接池, 并提供了一个健壮的策略。在向数据库发送请求时, Ado.ne连接池只是重新使用处于打开状态的现有连接, 而不是创建新的连接。它使用一个连接管理器来维护一个包含可用连接的列表 (连接池) , 并提供了负载平衡控制。但是Ado.ne并不自动关闭数据库连接, 在打开连接却忘记关闭它时, 则会发生连接泄露问题。

根据以上描述, 可以发现在应用程序级别上需要解决的问题如下:1、控制被实例化的连接数。2、自动创建、分配可用的数据库连接的实例。3、分配的每一个数据连接都是独占的。4、自动管理数据库连接的生存周期。另一方面, Ado.net本身为了提高效率, 对数据库连接进行了缓存。因此在用对象池实现连接池的时候应该转换一下思路, 从利用数据库连接池池减少打开、关闭连接的耗费, 转移到利用对象池减少同一时间并发的数据库操作数, 并在实际应用中控制实例化数据库连接数的方向上。

首先, 实现一个通用的独占式对象池。对象池技术基本原理的核心有两点:缓存和共享, 即对于那些被频繁使用的对象, 在使用完后, 不立即将它们释放, 而是将它们缓存起来, 以供后续的应用程序重复使用, 从而减少创建对象和释放对象的次数, 进而改善应用程序的性能。事实上, 由于对象池技术将对象限制在一定的数量, 也有效地减少了应用程序内存上的开销。同时为了避免反复的类型转换, 因此采用了.net2.0新增的泛型技术来实现对象池。

实现通用对象池的关键对象如下:

1) 对象池的元素类public abstract class ExclusivePoolItem<T>

该对象包含的主要信息如下:

·PooledObject:池中实际缓存的对象

·ReferenceCount:当前元素的引用计数

·IsTimeOut:当前元素是否过期 (必须有派生类视具体的缓存对象实现)

·IsFree:当前元素是否空闲

该对象包含的主要方法如下:

·Free:空闲当前对象

·Lock:锁定当前对象

·Release:释放当前对象

·该对象包含的主要事件如下:

·PoolItemAction:当池的元素发生动作时触发的事件

2) 对象池类public class ExclusivePool<I, T>

该对象包含的主要信息如下:

·PoolSize:池的大小

·ClearUpInterval:对池进行清理的时间间隔

·WaitInterval:当池里的所有对象都被使用时, 开始下一次检索的时间间隔

·LatestClearUpTime:最后一次清理的时间

·PoolPolicy:池的策略

该对象包含的主要方法如下:

·DoClearUp:执行清理操作

·GetObject:从池中获取对象

·FreeObject:将对象归还给池

·ReleasePool:释放池中所有对象

该对象包含的主要事件如下:

·PoolItemAction:当池的元素发生动作时触发的事件

·PoolAction:当池有动作发生时触发的事件

对象池的主要工作流程如下:

除了每次从池中获取对象时检查是否需要清理外, 还在实例化对象池时建立一个轮询线程, 定时对池进行清理, 以保证资源的释放。到此为止, 一个通用的对象池就已经完成了。

有了通用的对象池, 实现数据库连接池就简单了。首先从ExclusivePoolItem<T>派生出一个子类即SqlConnectionPoolItem<SqlConnection>。使用数据库连接池时之需要简单地实现PoolItemAction事件的响应, 在动作类型为QueryObject时返回SqlConnection的实例即可。

示例代码如下:

从示例代码可以看出, 进行了10000次异步调用。如果采用常规的做法, 必然将实例化10000个SqlConnection, 这无疑也是一个很大的开销。换一个角度思考, 进行应用程序开发时, 如此进行不加控制的异步调用, 必将导致服务器负荷加重, 导致对其他用户的响应变慢。而利用连接池后, 一方面可以很简单、快速地将实例化SqlConnection的次数控制在池的大小范围内;另一方面, 限制了客户端同时对服务器发起操作的数量限制, 有效地控制了服务器资源的使用。

通过实际的观察, 如果按照示例进行异步的小数据量查询, 并不需要实例化10000个SqlConnection。而且, 10000个异步操作并发时, 连接超时的几率大大增加, 却并不会带来更高的效率。因此控制异步操作时同一时间并发的操作数也是很有必要的。

4、结束语

恰当地使用对象池技术, 能有效地改善应用程序的性能。目前, 对象池技术已得到广泛的应用, 如对于Web、网络和数据库等, 一般都会采用对象池技术。

Ado.net本身实现了连接池, 并为我们提供了一个高效、健壮的机制。因此在Ado.net开发时应该将主要的精力放在如何控制并发的数量和优化SQL语句上以及事务的处理上。

参考文献

[1]、Bob Beauchemin.ADO.NET本质论.清华大学出版社

[2]、Glenn Johnson.ADO.NET2.0高级编程.清华大学出版社

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

【ADO对象模型】相关文章:

Excel对象模型05-08

基于面向对象的GIS空间数据特征模型研究09-11

刑法中的行为对象与犯罪对象的若干研究09-11

对象构建05-22

实践对象05-22

工程对象05-31

对象关系06-30

发展对象07-03

比较对象07-10

数据对象07-17

上一篇:质量管理理论下一篇:情景化项目教学