在开发ASP应用程序时,使用最多或者说是必不可少的,应该是ADO组件了,因为它是操纵数据库的重要手段。下面介绍ADO的使用方法及注意事项。
ADO,即Active Data Objects,实际是一种提供访问各种数据类型的连接机制。ADO设计为一种极简单的格式,通过ODBC的方法同数据库接口相连。用户可以使用任何一种ODBC数据源,即不仅适合于SQL Server、Oracle、Access等数据库应用程序,也适合于Excel表格、文本文件、图形文件和无格式的数据文件。ADO是基于OLE DB之上的技术,因此ADO通过其内部的属性和方法提供统一的数据访问接口方法。
ADO提供了一系列的类和方法,用来与数据库建立连接,然后对数据库中的数据进行增、删、改、查各种操作。下面分别介绍ADO中常用的几个类。
Connection类具有以下功能。
l 建立数据库连接。
l 执行SQL语句。
l 执行事务。
连接类(Connection)用来与数据库建立连接。连接成功,Connection以对象的形式存在。应用程序通过一个连接对数据库进行操作。在建立连接前,最主要的是需要设置连接字符串,用来指定连接数据库所用的驱动程序、数据源名称、用户名和密码等。Connection类常用的属性与方法如下。
l ConnectionString属性:连接字符串,在打开连接前需要设置。
l ConnectionTimeout和Mode属性:超时时间和连接模式,一般在打开连接前也需要设置。
l CursorLocation属性:设置或者返回游标位置。
l DefaultDatabase属性:为连接指定一个默认的数据库。
l IsolationLevel属性:确定事务(Transaction)在连接的隔离等级。
l Provider属性:为连接指定一个驱动程序,可以包括在ConnectionString中。
l Version属性:返回ADO的版本。
l Open和Close方法:建立和中断一个连接。
l Execute方法:在连接上执行命令,比如执行一条SQL语句。
l BeginTrans、CommitTrans和RollbackTrans方法:用来管理事务。
l Errors对象:数据源返回的错误信息。
CursorLocation属性取值的含义如下。
l adUseServer:它可以随时反映数据库服务器上的改动,但是系统开销很大。
l adUseClient:没有实时性,但可以对数据做再排序、筛选等操作。
如果对数据的实时性没有要求的话,建议尽量用adUseClient,以提高性能。
创建连接是操纵数据库的第一步,也是数据库优化时大有文章可做之处,有效地管理数据库的连接,可以极大地提高应用程序的效率,这里就关于Connection的合理使用做一个简单的小结,详细的原理见本书“创建高性能的ASP应用程序”一章中关于ADO优化的相关内容。
l 使用OLE DB驱动程序,使用连接池。
l 使用前再创建连接,使用后立即关闭连接,释放对象(其实这里关闭连接是将用后的连接立即放入连接池中)。
l 绝对不要将连接存放在Application或Session中。
l 如果没有返回记录集,在Execute的参数中要加上adExecuteNoRecords,如:
cnn.Execute strSQL,,adCmdText + adExecuteNoRecords
Command类具有以下功能。
l 预编译SQL语句。
l 执行SQL语句。
l 执行存储过程。
l 快速返回整个表的内容。
命令类(Command)定义了对数据库的一系列操作。使用命令行对象来查询数据库并返回数据集(Recordset)对象形式的查询结果。命令类在操纵数据库前需要与一个已经打开的连接对象(Connection)建立关联。Command类常用的属性与方法如下。
l ActiveConnection属性:将一个命令行对象与一个打开的连接关联。
l CommandText属性:定义命令行的内容,比如SQL语句等。
l CommandType属性:指定命令的类型。
l CommandTimeout属性:指定服务器等待一条命令执行的时间。
l Execute方法:执行命令行并返回一个数据集(Recordset)对象。
读者也许已经注意到了,Connection和Command类都有各自的Execute方法,都可以用来执行一条SQL语句,从这方面来讲,二者的差别不大。但Command类功能更为强大,通过指定CommandType属性,还可以执行存储过程等其他操作。 |
提高数据库的操纵性能,除了提高数据库的连接性能外,还可以提高对数据的操纵性能,Command类正是为此而设计的。这里就关于Command的合理使用做一个简单的小结,详细的原理见本书“创建高性能的ASP应用程序”章中关于ADO优化的相关内容。
l 合理设置CommandType属性,以提高执行效率,不建议使用adCmdUnknown。
l 如果没有返回记录集,在CommandType属性上要加上adExecuteNoRecords。
l 如果需要重复的执行类似的SQL语句,可以先将它预编译,提高的效率也很可观。
Recordset类具有以下功能。
l 存放检索结果。
l 操纵数据,对数据进行增、删、改操作。
l 对数据再排序。
数据集类(Recordset)定义了从数据库返回的一系列记录的集合。通过数据集可以对记录及组成记录的列进行各种操作。Recordset类常用属性与方法如下。
l RecordCount属性:返回记录集中记录的条数。
l LockType属性:对记录集的锁定方式,详见下面表2-8中的说明。
l CursorType属性:记录集中游标类型,详见下面表2-9中的说明。
l BOF、EOF属性:返回记录集中游标的当前位置是否是记录集的头或尾。
l MoveNext、MovePre:将记录集中的游标向后、前移动一个位置。
l MoveFirst、MoveNext:将记录集中的游标移动到最前或最后。
表2-8是属性LockType的取值。
表2-8 属性LockType的取值
名 称 |
解 释 |
adLockReadOnly |
=1,默认值,表示以只读方式打开记录集,因而无法更改数据,在这种情况下使用AddNew方法就会发生错误 |
adLockPessimistic |
=2,保守式记录锁定(逐条)。采用在调用Update方法时立即锁定数据源的方式。此时,其他用户不能访问该数据 |
adLockOptimistic |
=3,开放式记录锁定(逐条)。只在调用 Update 方法时锁定记录 |
adLockBatchOptimistic |
=4,开放式批更新。用于成批更新数据,与UpdateBatch方法相对应 |
以上的=1表示其常量值是1,依此类推。 |
表2-9是属性CursorType的取值。
表2-9 属性CursorType的取值
名 称 |
解 释 |
adOpenForwardOnly |
=0,仅向前游标,默认值,只能在记录中向前滚动。这可以节省资源并提高性能 |
adOpenStatic |
=3,静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所做的添加、更改或删除不可见。推荐在ASP中只使用这两种游标 |
adOpenKeyset |
=1,键集游标。键集游标与动态游标相似,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所做的数据更改将依然可见 |
adOpenDynamic |
=2,动态游标。可以看见其他用户所做的添加、更改和删除。允许在记录集中进行所有类型的移动 |
以上的=0表示其常量值是0,依此类推。 |
当Recordset对象有效时,可以使用如例程2-4的方式来获得当前记录某一字段的值。其中“Name_S”是数据表中的字段名。
例程2-4 获得Recordset对象当前记录中某一字段的值
Dim rs
Dim strName as String
……
strName = rs("Name_S").Value
……
RecordSet是专门为数据操纵而设计的,它可以接收Connection和Command类的检索结果,也可以自己向数据库发出检索命令。如果说Command类侧重在数据库方面做优化的话,那么RecordSet专门在用户对检索结果的处理上做优化。这里就关于RecordSet的合理使用做一个简单的小结,详细的原理见本书“创建高性能的ASP应用程序”一章中关于ADO优化的相关内容。
l 合理设置LockType的值,如果只是查看结果,设其值为adLockReadOnly即可。
l 合理设置CursorType的值,如果只用到MoveNext,则设其值为adOpenForwardOnly。
l 如果对数据的实时性没有要求的话,尽量用adUseClient。
l 只有当CursorType设为adOpenKeyset或adOpenStatic时,RecordCount才有效。
[NextPage]
在早些年,有人曾推荐使用adovbs.txt这个文件,以访问 ADO 的各种常量。在要使用常量的每个页面中必须包含此文件。此常量文件相当大,增加了每个 ASP 页面的编译时间和脚本大小,而且编程也比较烦琐。
IIS 5.0 引入了绑定到组件类型库的功能。只需要引用类型库一次,便可将其应用在每个 ASP 页面上。每个页面不再产生编译常量文件的开销,而且开发人员不必在每个ASP文件中都用include加入那个庞大的文件了。
要访问ADOTypeLib,只需在global.asa文件中加入相应的引用即可,有以下两种途径:
<!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library"
TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" -->
或
<!-- METADATA TYPE="TypeLib"
FILE="C:\Program Files\Common Files\system\ado\msado15.dll" -->
这种方法当然也适用于对其他COM的引用,如CDO库,或其他自己开发的COM。 |
使用ADO操纵数据库一般可以分为以下几步。
(1)创建一个到数据源的连接(Connection),连接到数据库;或者开始一个事务(Transaction)。
(2)组织一条SQL语句,此SQL语句中即可进行插入、修改和删除等任何数据库操作,只要你与数据库建立连接时所使用的用户有足够的权限。
(3)执行SQL语句。
(4)如果SQL语句中使用的是SELECT语句,则可以将返回的数据保存在数据集对象Recordset中,以便进一步操作数据。
(5)通过数据集对象对数据进行各种操作,包括获取某一字段值,以及修改、增加、删除记录等。
(6)如果使用数据集对象Recordset对数据库进行了增、删、改的操作,最后必须更新数据源,如果使用事务,确认是否接受事务期间发生的数据变化。
(7)结束连接和事务。
使用SQL语句和使用数据集对象Recordset都可以向数据库中增加、修改、删除记录,两种方法可以说是殊途同归。使用Recordset操作似乎更简单一些,例如不需要处理字符串中的单引号问题等,但使SQL语句功能更为强大且通用。它除了可以操纵数据记录以外,还可以操作表、用户等。笔者在这里建议使用SQL语句来操纵数据记录,这样读者将来在使用其他技术开发数据库时,比如PHP、JSP等,会觉得非常顺畅。 |
下面通过实例的方式说明在Visual Basic中如何使用ADO与数据库建立连接并操纵数据库。
例程2-5完成了与数据库建立连接与关闭连接。基本思路就是先设置连接类Connection的必要属性,尤其是连接字符串ConnectionString,然后调用Connection类的Open方法打开连接,并将其保存在全局变量g_Conn中,以便在其他地方使用。GxcDBType定义为枚举类型,用来表示是连接到Access数据库还是SQL Server数据库。
例程2-5 建立与关闭数据库连接
<%
'更改数据库名字
db="database/database.mdb"
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0; &_
Data Source=" & Server.MapPath(db)
'如果你的服务器采用较老版本Access驱动,请用下面的连接方法
'objConn.ConnectionString="driver={Microsoft Access Driver (*.mdb)}; &_
dbq=" & Server.MapPath(db)
objConn.Open
Function CloseDatabase
objConn.close
Set objConn = Nothing
End Function
%>
与数据库建立连接后,下面便可以操纵数据库中的数据了。例程2-6是使用Connection类的Execute方法来执行一条SQL语句并将返回保存在Recordset中的示例。例程中的“TypeName”表示数据库中的某一字段名。
例程2-6 使用Connection对象操纵数据库
<%
'按输入的参数查询,并返回一个集合类
Dim strSQL
Dim strName
'构造SQL语句
strSQL = "Select * from ClientType "
Dim rs
Set rs = g_Conn.Execute(strSQL)
'往集合中添加查询结果
Dim i
For i = 1 To rs.RecordCount
strName = rs("TypeName").Value
rs.MoveNext
Next i
Set rs = Nothing
%>
至此,关于ADO使用的基本知识就介绍完了,读者可以在以下几章的学习中来体会和实践ADO操纵数据库的一些技巧。
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛