8.2 连接对象
8.2.1 创建连接对象
在使用连接对象前,必须先调用
Server.CreateObject方法创建该对象 。
调用格式如下,
<%
Setconn=Server.CreateObject("ADODB.
Connection")
%>
8.2,2 连接对象的属性和方法
连接对象包括着丰富的属性和方法
集 。 在连接数据库之前通常需要对连接
对象的属性进行必要的设置, 例如, 通
过设置 ConnectionString的属性, 就能够
构造包含连接信息的字符串, 然后将这
一信息发送给会话对象, 应用于整个应
用程序, 使得开发应用程序更加快捷 。
1 连接对象的属性
( 1) Attributes属性
Attributes属性定义了连接对象的事务处理方
式, 控制事务成功或失败后连接对象向数据库写数
据的方式 。 该属性可以设置为以下两个值,
第一种是,adXactCommitRetaining 在成功调用
CommitTrans方法, 事务被写入数据库后, 自动启动
一个新事务 。 这种方式称为保留提交 。
第二种是,adXactAbortRetaining 在成功调用
RollbackTrans方法, 事务被取消后, 自动启动一个
新事务 。 这种方法称为保留取消 。
如果想同时达到以上两种效果, 则可以将该
属性的值设置为 adXactCommitRetaining与
adXactAbortRetaining之和 。
( 2) CursorLocation属性
CursorLocation有两个取值,一个是 adUseClient,
另一个是 adUseServer( 默认)。前者是使用客户端
的游标,表示将数据库服务器的处理结果保留在服务
器做处理。后者是 使用服务器端的游标,表示将数据
库服务器的处理结果返回服务器端以供处理。连接对
象与 Recordset对象均有此属性,由连接对象产生的
Recordset对象会自动继承这个属性。当使用值为
adUseServer类型的游标时,游标只能向前移动,为
了能使游标在 Recordset对象内自由移动,连接对象
的 CursorLocation属性值必须设置为 adUseClient才
行。另外,要让此属性对 Connection 和 Recordset对
象的实例起作用,必须在打开它们之前先进行定义。
( 3) ConnectionString属性
ConnectionString用于在打开一个 Connection实例之
前设定数据库的连接信息 。 这些信息包括,Provider
参数, Data Source参数, User ID参数, Password参
数以及 File Name参数等, 分述如下,
1 Provider,表示与数据库连接缺省的 provider名称 。
2 Data Source/DSN,表示 ODBC中数据源名称 ( DSN) 。
3 User ID/UID,表示连接数据库的用户帐号 。
4 Password/PWD,表示连接数据库的用户密码 。
5 File Name,表示指定连接到的数据文件名称 。 该
属性不能与 Provider同时设置 。
每一个项目以, 参数名 =值, 的形式存放在该属性中,
项目和项目之间使用, ;” 分隔 。
在上面的例子中使用了一条语句 conn.open strConn,
其中 strConn就是 ConnectionString,因此上面的语
句也可写成,
Conn.ConnectionString=strConn
Conn.open
( 4) ConnectionTimeOut属性
ConnectionTimeOut用于设定连接对象的 Open方法与
数据库连接的最长等待时间, 缺省值为 15秒 。 如果
ConnectionTimeOut属性设置为 0,则表示系统会一直
等待, 直到连接成功 。 在这种情况下, 如果不能够连
接上数据库, 就会让用户一直等待下去, 因此在实际
应用中应避免这种情况发生 。
ConnectionTimeOut属性在连接关闭时是可读写的,
而在连接对象启动时其属性是只读的, 故
ConnectionTimeOut的属性设置必须在连接前或取消
连接后 。 ConnectionTimeOut属性的语法格式如下,
Connection.ConnectionTimeOut=seconds
( 5) CommandTimeOut属性
CommandTimeOut 属 性 用 于 设 定 连 接 对 象 的
Execute方法运行的最长等待时间, 缺省值为 30秒 。
如果希望没有时间限制, 则可以将其设置为 0。
在运行时 CommandTimeOut属性是可读写的, 而运行中
其属性是只读的, 故其属性的设置必须在 Execute
方法运行前 。 它的语法格式如下,
Connection.CommandTimeOut=seconds
( 6) Provider属性
Provider属性可以用来返回或设置连接对象的提
供者名称, 这里所谓的提供者名称是指内定数据库管
理程序名称 。 ADO缺省的 Provider属性值为 MSDASQL
( Microsoft OLE DB Provider for ODBC), 它负责
管理所有以 ODBC连接的数据库, 其语法格式如下,
Connection.Provider=ProviderName
可用下面的脚本输出连接对象的数据提供者名称,
< % Response.write "The Provider is" &
conn.Provider& "<br>" %>
( 7) DefaultDatabase属性
DefaultDatabase属性用来设置连接对象的默认
数据库名称 。 如果存在默认数据库, SQL查询字串中
不需要再指定所操作的数据库, ADO对象会自动使用
本属性所设置的数据库 。 当需要访问其他数据库时,
可以将 DefaultDatabase属性设置为该数据库的名称,
或直接在 SQL查询命令中指定数据库, 如,
Select * from 数据库名,表名
( 8) IsolationLevel属性
IsolationLevel属性是用来设置连接对象运行事
务时机的 。 IsolationLevel包含属性如下,
1,adXactCursorStability 只允许读其它事务已提
交的改变 ( 默认值 ),
adXactBrowse 允许读其它事务未提交的改变
2.adXactChaos 本事务不会覆盖其它位于更高隔离程
度的事务所做的改变
3.adXactIsolated 所有事务相互独立
4.adXactReadCommit等同于 adXactCursorStability
5.adXactReadUncommitted 等同于 adXactBrowse
6.adXactRepeatableRead禁止读其它事务的改变, 可
通过重复查询带回一个新记录集
7.adXactSerializable 等同于 adXactIsolated
8.adXactUnspecified 不能确定提供者的事务隔离
程度
( 9) Mode属性
Mode属性被用于设置连接的权限,诸如只读或读
写。这个属性还可以被设置为拒绝访问其它数据库。
adModeUnknown 权限未设置或不能确定 ( 默认值 ) 。
adModeRead 连接是只读的 。
adModeReadWrite 连接是可读写的 。
adModeShareDenyNone 禁止其他用户以任何权限建
立连接 。
adModeShareDenyRead禁止其他用户以读取权限建立
连接 。
adModeShareDenyWrite禁止其他用户以写入权限建立
连接。
adModeShareExclusive 禁止其他用户建立连接 。
adModeWrite 连接是只写的
( 10) Version属性
属性 Version 用于返回 ADO版本号 。
2 连接对象的方法
(1),打开与数据库的连接
在创建连接对象后,就可以调用连接对象的 Open
方法来建立与数据库的连接。只有与数据源成功地建
立了连接后,连接对象才会存在,才可以通过命令对
数据源进行必要的操作。 为了建立与数据源的连接,
通常 Open方法有以下三种使用方法,
1) DSN连接方式 a,直接将连接字串传给 Open方法
需要注意的是必须同时使用 DSN,UID和 PWD标志,
否则将会出错 。 另外, 无论在等号 ( =) 之前还是之
后, DSN字符串都不能包含空格 。
b,利用连接对象的 ConnectionString属性
c,文件 DSN 方式
2) 直接连接数据库 OLE DB Providers方式
前两种连接方法必须先用 ODBC数据源管理器来建立一
个数据源后方可使用 。 如不想建数据源, 也可以使用
ASP提供的直接在脚本中指定连接数据库的方法 。
( 3) 使用 ODBC连接字符串的 ODBC DSN LESS 连接方

为了提供向后兼容, ODBC的 OLE DB 提供者还支持
ODBC连接字串语言 。
( 2), 关闭与数据库的连接
当与数据源的连接完成任务后, 应调用 Close方
法关闭与数据源的连接, 以便释放与该连接有关的
系统资源 。
但需要注意, 调用 Close方法只是释放与该连接
有关的系统资源, 而该连接对象 Connection本身并
没有释放 。 因此一个关闭的连接对象还可以继续使
用 Open方法打开连接, 而不再需要重新创建一个连
接对象 。
在使用 Close方法关闭与数据源的连接后, 若要
释放连接对象本身, 可以给已经创建的连接对象赋
值 Nothing,将连接对象彻底从内存中清除 。 如,
<% Set MyConn=Nothing %>
在连接对象赋值 Nothing后,如果还需要继续使
用连接对象,则必须使用 Server.CreateObject方法
重新创建一个。
( 3), 通过打开的连接执行 SQL语句
在创建连接对象并将它和一个数据库成功地建立
连接后, 用户可以通过连接对象的 Execute方法执行
SQL语句或存储过程从而直接与数据库对话, 完成对
数据库的插入, 更新和删除数据操作, 这些操作不
返回数据 。 但当利用连接对象返回数据时, 只能得
到一个只能向前读取的游标 。
语法格式如下,
Conn.Execute CommandText,RecordsAffected,Option
连接对象的 Execute方法有 CommandText,
RecordsAffected,Option三个参数,分述如下,
?CommandText,是包含表名,SQL语句或存储过程名
称等的一个字符串。通常 SQL命令包括可以使用数据
操作语言( DML,Data Manipulation Language) 来
操作数据源的数据。例如 INSERT( 增加记录)、
DELETE( 删除记录),UPDATE( 更新记录)、或是
SELECT( 以 Recordset的形式提取数据等)。除此之
外,也可以通过 CommandText参数对数据库发出数据
定义语言( DDL,Data Definition Language),例
如 CREATE TABLE( 建立数据表),DROP TABLE( 删除
数据表)或 ALTER TABLE( 修改数据表的表结构)等。
?RecordsAffected,是一个可选的变量参数,表示
当对数据库提出请求时所返回或影响的记录数。例如,
若想知道在执行一个 SQL语句时到底删除了多少条
记录,只需要把一个变量传给 RecordsAffected参
数,执行完该方法后,通过检查该变量的值便可知
道共删除了几条记录。
?Options,是一个可选参数,用来指定
CommandText参数的性质。可以使用下面的常量作
为 Options参数,
adCmdTable,此参数表明 CommandText是一个表名 。
adCmdText,此参数表明 CommandText是一个 SQL命
令串 。
adCmdStoredProc,此参数表明 CommandText是一个
存储过程 。
adCmdUnknown,不指定字符串的内容 。 ( 这是缺省
值 )
为避免每次打开一个新连接时都要输入系统数据
源的路径和名字,可以 把这个字符串
分配给一个 session变量或者在一个包含文件中把
它定义为一个常量, 这样只需要键入一个变量名即可,
而不必输入文件数据源的完整名称 。
要定义一个包含有文件数据源名字的 session变量,
可以在文件 Global.asa中定义 。 例如, 可以把下面的内
容添加到文件 Global.asa的 session_onstart脚本中,
session("connectionstring")=
"dsn=vod;uid=sa;pwd=mypassword;"
建立了这个 session变量后, 就可以用如下的脚本
打开一个连接,
<%
Set MyConn=Server.CreateObject("ADODB.Connection")
MyConn.Open Session("connectionstring")
%>
把文件数据源的名字分配给一个 session变量的另一个
优点是, 将来可以很容易地改变数据源 。
在一个 ASP网页中使用这些常量之前, 必须先包含一
个名为 ADOVBS.inc的特殊文件 。 这个文件中包含 ADO
使用的所有 VBsript常量 。 其引用方法如例 9.2中的第一
行语句 。
一般来说,ADOVBS.inc被安装在 c:\Program
Files\Common Files\System\ADO目录下。如果要使用该
文件的常量,只要将该文件拷入 ASP程序所在的目录
即可。但如果使用的是 JavaScript,而不是 VBsript,
ADO常量的包含文件应该是 ADOJAVAS.inc。
连接对象可以通过 Execute方法产生 Recordset
对象 。 在例 9.2脚本中, 因没有结果返回, 故可不必
使用 Recordset对象来取得运行结果 。 但有些时候,
连接对象 Execute方法所运行的 SQL命令或存储过程会
以 列 为 单 位 返 回 运 行 结 果, 这 时 就 必 须 利 用
Recordset对象来返回连接对象 Execute方法运行结果,
其语法格式如下,
Set Recordset=conn.Execute(CommandText,RecordsAffected,Options)
第二种语法格式用来从数据库中返回信息, 当不
需要返回信息时, 则使用第一种语法格式 。
8.2.3 创建事务处理
事务是整体成功或失败的操作 。 事务处理
用于对数据库进行可靠的更新 。
在对数据库进行许多相关更改或同时更新
多个数据库时, 要保证所有更改都被正确执行,
如果这些更改中的任何一个失败, 则都需要恢
复到数据库表的原始状态, 也就是说, 在一次
事物活动中, 要么所有的操作都成功, 要么所
有的操作都失败, 从而保证
关系数据库中数据的完整性 。 特别是在一些商业应用
程序中更需要具有在事务内部运行脚本和组件的能力 。
它的事务是一种服务器操作, 即使该操作包括很多步
骤 ( 如定货, 查看帐单, 付款等 ), 都只能整体返回
操作是成功还是失败 。 用户可以创建在事务内部运行
的 ASP脚本程序, 如果脚本的任何一部分执行失败,
那么整个事务都应该终止 。
( 1), 开始一个事务 —— BeginTrans方法
BeginTrans方法开始一个事务, 使用 CommitTrans
方法提交一个事务, 使用 RollbackTrans方法取消一
个事务 。
ADO的一个重要功能就是执行并控制数据源的事务
操作。也可以将事务简单地定义为在一操作中对数据
库的多次操作。例如,在 VOD点播系统中的两个表,
点播记录表 Order-log数据库和会员消费记录表
Consumption,当会员点播节目后,点播记录被写入
Order-log表,但同时还须更新会员的消费记录表
Consumption。 这时我们就可以将两个操作放在同一
个事务中。
此外, 使用一个事物的另一个原因是:它可以
提供一个机会, 优化对数据源进行写操作的过程 。
当调用 BeginTrans方法开始一个事务时, 告诉 ADO先
将任何对数据源的修改都存储在服务器的内存缓冲
区中, 而不是操作一次就将修改的数据直接存盘 。
因为缓冲区的写操作速度要比硬盘快的多, 这样可
以大大提高系统的性能 。
在实际应用中, 事务往往是嵌套的, 即在一个事务
还没有处理完成前又开始了另一个事务, 这样高层
的事务在提交自己的修改以前就可以判断底层的
事物是否成功提交或取消 。
通常 BeginTrans方法返回一个整型值, 表示该事务
所在的嵌套层 。 最高层的事务将返回 1。
( 2), 提交一个事务 —— CommitTrans方法
调用 BeginTrans方法以后, 由于数据的操作并不
是直接存盘, 而是缓存在内存中, 为了将缓存中的修
改数据存入数据库, 就需要调用 CommitTrans方法将
此次事务中对数据源的修改操作一次性全部写入磁盘,
事务成功提交后, 此次事务将自动关闭 。
( 3), 取消一个事务 —— RollbackTrans方法
RollbackTrans方法的作用与 CommitTrans方法相反,
该方法用来取消此次事务以来所有对数据源所做的操
作, 所有的修改将作废, 这有点类似于编辑软件中的
undo( 撤销 ) 功能 。 与 CommitTrans方法一样, 调用
RollbackTrans方法后, 本次事务将结束 。
8.2.3 连接对象的数据集合
连接对象提供 Errors与 Properties两种数
据集合,前者表示连接对象运行时最近
一次的错误或警告信息,后者表示连接
对象所定义的相关属性。
1 Errors数据集合与 Error对象
( 1), Errors集合
在程序调试和实际运行时, 难免会发生错误 。 使
用 ADO对象时发生的运行错误都收集在 Errors集合中 。
Connenction,RecordSet 和 Command 对 象 都 有 各自 的
Errors集合 ( 使用语法为:对象名,Errors) 。 Errors集合
无须用 Set语句创建, 它由系统自动创建 。 如果没有
错误, 则它是一个空集合 。 如果非空, 则其中每个成
员是一个 Error对象 。
Errors集合包含因运行命令而引起的上一次 ADO或
OLE DB提供者错误的详细内容, 只能被连接对象访问,
但也可以通过 Command和 Recordset的 ActiveConnection属
性访问隐含的连接对象, 这意味着可以这样得到
Errors集合,
Rs,ActiveConnection,Errors
Errors集合所提供的属性与方法有 Count属性, Clear
方法及 Item方法等 。
Count属性:可用来取得 Errors数据集合中所包含的
Error对象的个数 。
Clear方法:可用来清除 Errors数据集合中所包含 的
所有 Errors对象 。
Item方法:可用来取得 Errors数据集合中所包含的所有
Errors对象, 使之成为空集 。
其中 Count属性是长整数类型。如果错误存在,
可以通过索引号 index获得错误对象 —— Error对象。
index的取值是从 0到 XX.Errors.Count-1的一个长整数。
获得错误对象有 Errors集合的 Item方法,语法如下,
Set 对象名 = XX.Errors.Item(index)
或简单地写成
Set 对象名 = XX.Errors(index)
例如,
Set MyError = Conn.Errors.Item(0)
Set MyError = rs.Errors(1)
Errors 集合的 Clear() 方法无参数, 语 法 格 式 为,
XX.Errors.Clear()。
(2),Error对象
Error对象是发生, 运行时错误, 时由系统生成的对象,
是负责存储一个系统运行时所发生的错误或警告的,
一个对象储存着一条错误的所有信息 。 Error对象没有
,方法,, 只有若干只读的属性用来储存错误信息 。
其中最重要的属性是 Description,它包含了关于该错
误的描述 。 想要获得错误信息, 可在可能发生错误
的语句后面捕获和显示错误 。
Error对象提供了 Description属性,Number属性,Source
属性,NativeError属性,SQLState属性,HelpContext属
性及 HelpFile属性等,分述如下,
?Description属性:该属性表示错误或警告所发生的
原因或描述。
?Number属性:该属性表示所发生错误或警告代码,
即包含错误常量的长整型整数值。
?Source属性:该属性表示造成系统发生错误或警告
的来源。在向数据源发出请求之后,如果 Errors 集
合中有多个 Error 对象,则将会用到该属性。
?SQLState 和 NativeError 属性:提供来自 SQL
数据源的信息。
需要注意的是任何涉及 ADO 对象的操作都会生成一
个或多个提供者错误 。 每个错误出现时, 一个或多个
Error 对象将被放到 Connection 对象的 Errors 集
合中 。 当另一个 ADO 操作产生错误时, Errors 集合
将被清空, 并在其中放入新的 Error 对象集 。
出现提供者错误时, Error 对 象 将 被 放 在
Connection 对象的 Errors集合中 。 ADO 支持由单个
ADO 操作返回多个错误, 以便显示特定提供者的错误
信息 。 要在错误处理程序中获得丰富的错误信息, 可
使用相应的语言或所在工作环境下的错误捕获功能,
然后使用嵌套循环枚举出 Errors 集合的每个 Error
对象的属性 。
某些属性和方法返回的警告以 Errors 集合中的
Error 对象的方式出现, 但并不中止程序的执行 。 在
调用 Recordset 对象的 Resync,UpdateBatch,或
CancelBatch 方法, 或 Connection 对象的 Open 方
法, 或者在设置 Recordset 对象的 Filter 属性之
前, 可通过调用 Errors 集合的 Clear 方法 。 这样
就可以读取 Errors 集合的 Count 属性, 以测试返
回的警告 。
(3),错误处理
代码执行过程中, 可能因各种原因而发生错误, 如:
代码本身有问题, 网络断开等等, 所以在程序中设置
错误捕获和处理是非常必要的 。 在 ASP中, 可以通过
连接对象的 Errors数据集合取得代码运行时所发生的
错误或警告信息, 其使用方法如下,
1) 直接对连接对象来使用,
Set Errs = Cnn.Errors
或者
Cnn.Errors
2) 建立 Recordset对象或 Command对象后, 再通过其
ActiveConnection属性来使用连接对象,
Set Errs = rsTest.ActiveConnection.Errors
或者
rsTest.ActiveConnection.Errors
2 Properties数据集合与 Property对象
在第 8 章中曾经说明 Connection 对象,
Command对象, Recordset对象与 Field对象都
包含一个 Properties 数据集合 。 在
Properties数据集合中包含有与 Connection
对象, Command对象, Recordset对象及 Field
对象对应的 Property对象 。
(1),Properties数据集合
Properties数据集合所提供的方法与属性有
Count属性,Refresh方法与 Item方法等,
分述如下,
?Count属性:该属性可用来取得 Properties数据集
合中所包含 Property对象个数 。
?Refresh方法:该方法可重新取得 Properties数据集
合中所包含的所有 Property对象 。
?Item方法:该方法可用来取得 Properties数据集合
中所包含 Property对象个数 。 该方法有一个参数,
表示所要取得的 Property对象索引值, 这个索引值
通常介于 0到 Count属性值 -1之间 。
(2),Property对象
Property对象是负责记录连接对象, Command对象,
Recordset对象与 Field对象的每一项属性值 。 Property
对象提供了 Name属性, Value属性, Type
属性及 Attribute属性等, 分述如下,
l Name属性:该属性表示对象属性的名称 。
l Value属性:该属性表示对象属性的属性值 。
l Type属性:该属性表示对象属性的数据类型 。
l Attribute属性:该属性表示对象的特性, 是指示特定于
提供者的属性特征 的长整型值 。
8.2.4 ASP与其它数据库连接的几种方法
根据不同的系统需求,以及应用数据量
的大小,程序员有可能采用不同的数据
库系统,如 Sybase或 Access等,这里给
出几种常用的 ADO连接方式。
1 ODBC DSN 连接方式
(1),DSN方式
oConn.Open "DSN=mySystemDSN;" & _
"Uid=myUsername;" & _
"Pwd=myPassword,
(2),文件 DSN
oConn.Open "FILEDSN=c:\somepath\mydb.dsn;" &
_
"Uid=myUsername;" & _
"Pwd=myPassword"
2 ODBC DSN LESS 连接方式
(1),ODBC Driver for Access
oConn.Open "Driver={Microsoft Access Driver
(*.mdb)};" & _
"Dbq=c:\somepath\mydb.mdb;" & _
"Uid=admin;" & _
"Pwd="
其中, Dbq直接设定 Access数据库的真实路径文件名 。
也可以使用 Server.MapPath( " 数据库文件名" )
以取得数据库的真实路径文件, 如下,
oConn.Open "Driver={Microsoft Access Driver
(*.mdb)};" & _
"Dbq=Server.MapPath( "mydb.mdb") ;"
(2),ODBC Driver for dBASE
oConn.Open "Driver={Microsoft dBASE Driver (*.dbf)};" & _
"DriverID=277;" & _
"Dbq=c:\somepath"
(3),ODBC Driver for Informix
如果是 INFORMIX 3.30 ODBC Driver
oConn.Open "Dsn='';" & _
"Driver={INFORMIX 3.30 32 BIT};" & _
"Host=myHostname;" & _
"Server=myServerName;" & _
"Service=myServiceName;" & _
"Protocol=olsoctcp;" & _
"Database=myDbName;" & _
"UID=myUsername;" & _
"PWD=myPassword" & _
否则
oConn.Open "Dsn=myDsn;" & _
"Host=myHostname;" & _
"Server=myServerName;" & _
"Service=myServiceName;" & _
"Protocol=onsoctcp;" & _
"Database=myDbName;" & _
"Uid=myUsername;" & _
"Pwd=myPassword"
(4),ODBC Driver for MySQL
oConn.Open "Driver={mySQL};" & _
"Server=MyServerName;" & _
"Option=161034;" & _
"Database=mydb"
(5),ODBC Driver for Oracle
( 1) Oracle ODBC Driver from Microsoft
oConn.Open "Driver={Microsoft ODBC for Oracle};" & _
"Server=OracleServer.world;" & _
"Uid=myUsername;" & _
"Pwd=myPassword"
( 2) ODBC Driver for Oracle (from Oracle)
oConn.Open "Driver={Oracle ODBC Driver};" & _
"Dbq=myDBName;" & _
"Uid=myUsername;" & _
"Pwd=myPassword"
(6),ODBC Driver for Sybase
oConn.Open "Driver={SYBASE ASE ODBC Driver};" & _
"Srvr=myServerName;" & _
"Uid=myUsername;" & _
"Pwd=myPassword"
(7),ODBC Driver for Text
oConn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=c:\somepath\;" & _
"Extensions=asc,csv,tab,txt"
(8),ODBC Driver for Visual FoxPro
1) With a database container
oConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBC;" & _
"SourceDB=c:\somepath\mySourceDb.dbc;" & _
"Exclusive=No"
由 Foxpro生成的 DBC数据库与 MDB数据库相似,
都是一个数据库包含几个数据表的形式,所以对
DBC数据库的存取方法与 MDB数据库相似。
2) Without a database container
oConn.Open "Driver={Microsoft Visual FoxPro Driver};" & _
"SourceType=DBF;" & _
"SourceDB=c:\somepath\mySourceDbFolder;" & _
"Exclusive=No"
DBF文件不是一个标准的数据库文件, 只相当于标准
数据库文件中的一个数据表, 所以为了使用 DBF文件,
采用把所有的 DBF文件放在一个目录下, 这样把目录
名看成标准数据中的数据库表, 每一个 DBF文件相当
于标准数据库的数据表 。
(9),ODBC Driver for Excel
oConn.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
"DriverId=790;" & _
"Dbq=c:\somepath\mySpreadsheet.xls;" & _
"DefaultDir=c:\somepath"
将 Excel97或 Excel2000生成的 XLS文件( book) 看成一
个数据库,其中的每一个工作表 (sheet)看成数据库表。
3 OLE DB Providers方法
(1),OLE DB connection for Access
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source= c:\\somepath\\dbname.mdb;" & _
"User Id=myUsername;" & _
"Password=myPassword"
(2),OLE DB Provider for Informix,
1) Informix 3.30,
oConn.Open "Dsn='';Driver={INFORMIX 3.30 32
BIT};Host=hostname; " & _
"Server=myserver;Service=service-
name;Protocol=olsoctcp; " & _
"Database=mydb;UID=username;PWD=myPwd "
2) Informix-CLI 2.5,
oConn.Open "Driver={Informix-CLI 2.5 (32
Bit)};Server=myserver; " & _
"Database=mydb;Uid=username;Pwd=myPwd"
(3),OLE DB Provider for MySQL
oConn.Open "Provider=MySQLProv;" & _
"Data Source=mySQLDB;" & _
"User Id=myUsername;" & _
"Password=myPassword"
(4),OLE DB Provider for Oracle (from Oracle)
oConn.Open "Provider=OraOLEDB.Oracle;" & _
"Data Source=MyOracleDB;" & _
"User Id=myUsername;" & _
"Password=myPassword"
(5),OLE DB Provider for IBM DB2
1) TCP/IP
oConn.Open "Provider=DB2OLEDB;Network Transport
Library=TCPIP; " & _
"NetworkAddress=XXX.XXX.XXX.XXX;InitialCatalog
=MyCtlg; " & _
"Package Collection=MyPkgCol;Default
Schema=Schema; " & _
"User ID=MyUser; Password=MyPW"
2) APPC
oConn.Open "Provider=DB2OLEDB;APPC Local LU
Alias=MyAlias; " & _
"APPC Remote LU
Alias=MyRemote;InitialCatalog=MyCtlg; " & _
"Package Collection=MyPkgCol;Default
Schema=Schema; " & _
"User ID=MyUser;Password=MyPW"
(6),OLE DB Provider for EXCEL,
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\MyExcel.xls;Extended
Properties=Excel 9.0;HDR=Yes;"
4 MS Remote方式
(1),MS Remote - Access (Jet)
1) ODBC DSN
oConn.Open "Provider=MS Remote;" & _
"Remote Server=http://myServerName;" & _
"Remote Provider=MSDASQL;" & _
"DSN=AdvWorks;" & _
"Uid=myUsername;" & _
"Pwd=myPassword"
2) OLE DB Provider,
oConn.Open "Provider=MS Remote;" & _
"Remote Server=http://myServerName;" & _
"Remote Provider=Microsoft.Jet.OLEDB.4.0;" &
_
"Data Source=c:\somepath\mydb.mdb","admin",
""
3) OLE DB Provider自定义事务对象
oConn.Open "Provider=MS Remote;" & _
"Remote Server=http://myServerName;" & _
"Handler=MSDFMAP.Handler;" & _
"Data Source=MyAdvworksConn"
(2),MS Remote-SQL Server
1) ODBC DSN
oConn.Open "Provider=MS Remote;" & _
"Remote Server=http://myServerName;" & _
"Remote Provider=MSDASQL;" & _
"DSN=myDatabaseName;" & _
"Uid=myUsername;" & _
"Pwd=myPassword"
2) OLE DB Provider
oConn.Open "Provider=MS Remote;" & _
"Remote Server=http://myServerName;" & _
"Remote Provider=SQLOLEDB;" & _
"Data Source=myServerName;" & _
"Initial Catalog=myDatabaseName;" & _
"User ID=myUsername;" & _
"Password=myPassword"
3) OLE DB Provider自定义事务对象
oConn.Open "Provider=MS Remote;" & _
"Remote Server=http://myServerName;" & _
"Handler=MSDFMAP.Handler;" & _
"Data Source=MyPubsConn"
利用上面连接数据库的方法就可以打开常用类型
的数据库,然后利用 ADO的 Recordset对象的增加记
录、删除记录、修改记录等功能就可以对数据库进行
操作。但是要说明的是,在实际开发中,如果使用
DBF,DBC,Excel数据库,执行效率没有 MDB数据
库效率高,因此最好用 MDB类型数据库。
如果用 DBF,DBC,Excel数据库,要注意:
Excel数据库只能读取、增加记录、修改记录,但不
能删除记录; DBF,DBC可以读取记录、增加记录、
删除记录、修改记录,但是在增加记录时,任何一个
字段值都不能为空,由此可看出局限性很大,所以尽
可能地用 MDB或 SQL数据库。
8.2.5 管理数据库连接
一个 Web 数据库应用程序 ( 例如为几千个客户
服务的联机购物应用程序 ) 是否能经得起考验,
关键在于如何合理地管理数据库连接 。 即便是
在没有任何信息传输时, 打开并且保持数据库
连接, 也会严重耗费数据库服务器的资源并且
可能会导致连接性问题 。 因此, 设计良好的
Web数据库应用程序将会回收数据库连接并能
够补偿由于网络堵塞造成的延迟 。
1 使连接超时
连接活动的增长可能使数据库服务器的负担加
重, 大量增加建立数据库连接的时间 。 过长连接
延时的结果是降低数据库的性能 。
用连接对象的 ConnectionTimeout,可以限制放
弃连接尝试并发出错误消息之前应用程序等待的
时间 。 例如, 下面的脚本设置 ConnectionTimeout
属性, 在取消连接尝试之前等待 20 秒,
<%
Set
MyConn=Sever.CreateObject("ADODB.Connecti
on") '创建连接对象
MyConn.ConnectionTimeOut=20
MyConn.Open
"DSN=mySystemDSN;Uid=myUsername;Pwd=m
yPassword"
%>
需要注意的是,在将 ConnectionTimeout属性合
并到数据库应用程序之前,一定要确保连接提供程
序和数据源以支持该属性。
2 共享连接
经常建立和中断数据库连接的 Web数据库应用程
序也会降低数据库服务器的性能 。 ASP支持用 ODBC
3.5的共享特性来有效地管理连接 。 连接共享维持打
开的数据库连接并管理不同的用户共享该连接, 以
维持其性能和减少空闲的连接数 。 对每一个连接请
求, 连接池首先确定池中是否存在空闲的连接, 如
果存在, 连接池返回连接而不是建立到数据库的新
连接 。 为了将 ODBC驱动程序加入到共享连接中, 需

配置数据库驱动程序并在 Windows注册表中设
置驱动程序的 CPTimeout属性 。 当 ODBC断开连接时,
连接被存入池中, 而不是被断开 。 CPTimeout属性决
定在连接池中的连接保留的时间长度 。 如果在池中连
接保留的时间比 CPTimeout设置的时间长, 则连接将
被关闭并且从池中删除 。
可以通过创建如下设置的注册表键来有选择地
设置 CPTimeout的属性,从而启用特定 ODBC数据库
驱动程序的连接池,
\ HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.I
NI\driver-name\CPTimeout
= timeout(REG_SZ,units are in seconds)
例如, 下面的键将 SQL Server驱动程序的连接池的超
时设置定为 1100秒 ( 3分钟 ) 。
\ HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\OD
BCINST.INI\SQL Server\CPTimeout = 1100
默认情况下, 通过将 CPTimeout设置为 60 秒, Web服
务器将激活 SQL Server的连接池 。
3 使用跨页连接
尽管可以通过存储 ASP的 Application对象的连接
重复使用跨页连接, 但没有必要始终使连接保持打
开 。 如果有许多用户需要连接到同一个 ASP数据库应
用程序, 一个好的方法就是将跨页连接字符串置于
ASP的 Application对象中, 重复使用数据库连接 。 例
如, 可以在 Global.asa文件的 Application_OnStart事件
过程中指定连接字符串, 如下面的脚本所示,
Application.lock
Application("ConnectionString") =
"DSN=mySystemDSN; " & _
"Uid=myUsername;Pwd=myPassword"
Application.unlock
然后, 在每一个访问数据库的 ASP 文件中写入,
< OBJECT RUNAT=Server ID=cn
PROGID="ADODB.Connection"> </OBJECT>
要想创建连接对象的实例, 使用以下脚本,
cn.Open Application("ConnectionString")
对于打开的连接, 可以在页尾写入以下脚本, 关闭连
接,
cn.Close
在单个用户需要重复使用跨页连接的情况下, 使用
Session对象连接比使用 Application对象更好 。
4 关闭连接
要想更好地使用连接池, 就应尽快地关闭数据库连
接 。 默认情况下, 当脚本执行完以后, 连接将被终
止 。 当不再需要连接时将其关闭, 可以减少对数据
库服务器的要求并可以使其他用户能够使用该连接 。
可以使用连接对象的 Close方法终止连接对象与数据
库之间的连接 。 下面的脚本建立并打开连接, 然后
将其关闭,
<%
strDSN
="DSN=mySystemDSN;Uid=myUsername;Pwd=
myPassword"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open
cn.Close
%>