NO:1ADO使用详解Connection对象Connection对象是使我们能与数据存储相连的对象。只有Connection对象才能指定希望使用的OLEDB提供者、连接到数据存储的安全细节以及其他任何连接到数据存储特有的细节。不必显式创建一个Connection对象以连接到数据存储。没有Connection对象,一样可以创建Command、Recordset和Record对象。如果不创建自己的Connection对象,ADO将会隐含地为你创建一个Connection对象。如果要对提供者运行多条命令,应该显式地创建一个Connection对象,这比每运行一条命令就创建一个连接更有效。除了为数据存储提供连接以外,Connection对象允许针对数据存储执行命令操作。这些命令可以是结构化的或存储的命令(例如,SQL命令或一个存储过程),并且可以有选择地从数据存储中返回一些数据。Command对象Command对象是对数据存储执行命令的对象。看到这里读者可能会产生疑问,Connection对象不也能这样做吗?是的,但是Connection对象在处理命令的功能上受到一定的限制,而Command对象是特别为处理命令的各方面问题而创建的。当从Connection对象中运行一条命令时,已经隐含地创建了一个Command对象。有时其他对象允许向命令传入参数,但在Connection对象中不能指定参数的任何细节。使用Command对象允许指定参数(以及输出参数和命令执行后的返回值)的精确细节(比如,数据类型和长度)。因此,除了执行命令和得到一系列返回记录,也可能得到一些由命令提供的附加信息。对于那些不返回任何记录的命令,如插入新数据或更新数据的SQL查询,Command对象也是有用的。Recordset对象Recordset对象是ADO中使用最为普遍的对象,因为它含有从数据存储中提取的数据集。我们经常运行不返回数据的命令,比如那些增加或更新数据的命令,但在大多数情况下很有可能会取得一系列记录。Recordset对象是拥有这些记录的对象。可以更改(增加、更新和删除)记录集中的记录,上下移动记录,过滤记录并只显示部分内容等等。Recordset对象也包含Fields集合,Fields集合中有记录集中每一个字段(列)的Filed对象。无论是在ASP页面中处理数据,还是利用远程数据服务(RDS)远程使用数据,Recordset对象是必须处理的对象。连接到数据存储连接字符串连接字符串依赖于提供者,因为每个数据提供者可能需要不同的细节。值得注意的重要一点是,ODBC的OLEDB提供者是缺省的,所以,如果不使用Provide=部分,系统将自动地使用ODBC。NO:2下面为不同的提供者列举了连接字符串的例子,在本书的后面将会看到更多的例子。1.微软Access如果使用ODBC,而没有DSN:Driver={MicrosoftAccessDriver(*.mdb)};DBQ=C:\wrox\database_name.mdb对于本地的OLEDB提供者:Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\wrox\database_name.mdb上面的例子说明了Access数据库存放于C:\wrox目录下。虽然读者可能会尝试将数据库作为Web文件存放于相同的目录下,但不要这样做,否则任何人都可以下载整个数据库文件。将数据库存放于Web目录外永远是明智的,没有人可以从外面访问该文件。使用包含文件可以将创建connect对象的语法写入一个asp文件,然后用包含文件的语句将其放入所需要的文件中,例!--#INCLUDEFILE=”Connect.asp”这样不必再为每个ASP页面都输入连接细节,同时方便于更改整个站点都使用的连接。包含文件也是放置METADATA标签的好地方。使用连接状态将连接字符串存入应用程序变量是一个常用的技巧,同使用一个包含文件一样有效。例如,可以在global.asa文件中加入下面的代码:SubApplication_Onstart()Strconn=”Provider=SQLOLEDB;Datasource=WATCHER;”Setapplication(“connectionstring”)=strconnEndsub在ASP页面中,可以使用下面的代码:setconpubs=server.createobject(“ADODB.connection”)conpubs.openapplication(“connectionstring”)连接语法如果使用显式定义的Connection对象,可以使用Open方法,它的语法如下:Connect.Open[Connectionstring],[Userid],[Password],[Options]参数如表所示参数说明ConnectionString包含连接细节的字符串。可以是ODBCDSN的名称、数据链接文件的名称或真实的连接细节UserID连接期间,用户使用的名字。覆盖连接字符串中提供的任何用户名Password用户的口令。覆盖连接字符串中提供的任何口令Options可以是adAsyncConnect,指定异步地建立连接。忽略这个参数,则建立一个同步连接连接的例子下面是几个示例,这里假定strConn包含一个有效的连接字符串。为了打开一个连接,使用Connection对象的Open方法。例如:NO:3SetConpubs=Server.Createobject(“ADODB.Connection”)Conpubs.OpenStrconnConpubs.Close也可以使用CONNECTIONSTRING属性:SetConpubs=Server.Createojbect(“ADODB.Connection”)Conpubs.Connectionstring=StrconnConpubs.OpenConpubs.Close这两种实现方法之间没有什么区别,如果使用前一种方法来实现连接,ConnetionString属性同时也被赋值。值得注意的是,一旦与数据存储建立了连接,ADO可能会改变ConnectionString属性值。不必担心,ADO只填写一些额外的属性值。记录集前面已经提到,记录集是ADO中最常用的对象,这并不值得奇怪。毕竟,他们包含着数据。但是,对于记录集还有比想象的更多的内容,知道数据如何保存和处理很重要,因为这为选择使用哪种记录集提供了更多的参考。记录集有不同的类型,在一些细小的地方存在着差异,很容易造成失误。首先需要认真谈论的是光标的概念。光标光标用来管理记录集和记录集的当前位置能用光标做什么是由光标的类型决定的1.光标类型光标的类型标识了光标所能够提供的功能。这里有四种类型的光标:•静态(adOpenStatic)。静态光标含有对记录的静态拷贝。这意味着在记录集建立之后,记录集的内容就固定了。其他用户对记录的更改、添加和删除都是不可见的。允许在记录集中向前、向后移动。•只许前移(adOpenForwardOnly)。缺省的光标类型,除了只允许向前移动外,其余的与静态光标相同。•动态(adOpenDynamic)。动态的光标没有固定的记录集。其他用户的更改、添加或删除操作在记录集中是可见的。允许在记录集中向前、向后移动。•键集(adOpenKeyset)。键集类型的光标除了记录集是固定的,其余的与动态光标相似。可以看到其他用户的修改,但新记录却不可见。如果别的用户删除了记录,那么这些记录在记录集中将会变得不可访问。这项功能是通过标识记录集的键来实现的,所以键一直保留着,即使改变或删除记录。锁定锁定就是如何确保数据的完整性,确保更改不会被覆盖。我们需要避免的典型情况是多次更新,比如一个用户改动了一些数据,接着另一个用户立即又将其做了修改。为了对这种情况加以保护,要锁定记录,有许多不同的方法可以保证记录得到保护。可通过锁定类型来设置这些方法。1.锁定类型锁定类型决定更新记录时记录是否或如何被锁定。有四种类型的锁定:NO:4•只读(adLockReadOnly):缺省锁定类型,记录集是只读的,不能修改记录。•悲观的(adLockPessimistic):当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。•乐观的(adLockOptimistic):直到用Update方法提交更新记录时才锁定记录。•批量乐观的(adLockBatchOptimistic):允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,数据在这段时间被更新。这减少了资源的使用。悲观的锁定提高了数据的完整性,但却是以牺牲并发性为代价的。并发性是许多用户在同一时间查阅数据的能力。锁定的记录对其他用户是不可见的,因而数据的并发性降低了。乐观的锁定只在一小段时间内锁定记录,所以增强了数据的并发性,但同时其他用户修改数据的几率也增加了。创建记录集创建一个记录集十分容易,通过调用Recordset对象的Open方法来实现:Recordset.Open[Source],[Activeconnection],[Cursortype],[Locktype],[Options]其参数及说明如表所示参数说明Source数据源。可以是数据库中的表名、存储的查询或过程、SQL字符串、Command对象或适用于提供者的其他命令对象ActiveConnection记录集使用的连接。可以是一个连接字符串或者一个打开的Connection对象CursorType使用的光标类型。必须是定义的光标类型中的一种,缺省值为adForwardOnlyLockType使用的锁定类型。必须是定义的锁定类型中的一种,缺省值为adLockReadOnlyOptions告诉提供者Source参数的内容是什么,如表、文本字符串等等例如,要打开数据库pubs中authors表上的记录集:DimRsauthorsSetRsauthors=Server.Createobject(“ADODB.Recordset”)Rsauthors.Open“Authors”,StrconnRsauthors.CloseSetRsauthors=Nothing注意,有几个参数没有指定。实际上,所有的参数都是可选的,可以在打开记录集之前为它们设置相应的属性值:DimRsauthorsSetRsauthors=Server.Createobject(“ADODB.Recordset”)WithRsauthors.Source=”Authors”.Activeconnection=Strconn.Cursortype=AdopenforwardonlyNO:5.Locktype=Adlockreadonly.OpenEndWithRsauthors.CloseSetRsauthors=Nothing一旦打开记录集,当前指针自动地位于第一条记录上。如果在记录集中没有记录,那么EOF和BOF属性都是True:1.Options参数Open方法的Options参数允许指定命令文本内容。它可以是以下CommandTypeEnum常数之一:•adCmdText:文本命令,比如SQL字符串。•adCmdTable:表名。•adCmdStoredProc:存储过程名。•adCmdFile:保存的记录集的文件名。•adCmdTableDirect:表名。•adCmdURLBind:URL地址Options参数可以是以上常数中的任一个,但也可以加入下列ExecuteOptionEnum常数:•adAsyncExcute:异步地执行命令。•adAsyncFetch:取得初始的行集后,异步地获取剩下的行。•adAsyncFetchNonBlocking:除了获取记录