ODBC数据源创建配置文档解读Word文档格式.docx
《ODBC数据源创建配置文档解读Word文档格式.docx》由会员分享,可在线阅读,更多相关《ODBC数据源创建配置文档解读Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
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”)=strconn
Endsub
在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方法。
例如:
SetConpubs=Server.Createobject(“ADODB.Connection”)
Conpubs.OpenStrconn
Conpubs.Close
也可以使用CONNECTIONSTRING属性:
SetConpubs=Server.Createojbect(“ADODB.Connection”)
Conpubs.Connectionstring=Strconn
Conpubs.Open
这两种实现方法之间没有什么区别,如果使用前一种方法来实现连接,ConnetionString属性同时也被赋值。
值得注意的是,一旦与数据存储建立了连接,ADO可能会改变ConnectionString属性值。
不必担心,ADO只填写一些额外的属性值。
记录集
前面已经提到,记录集是ADO中最常用的对象,这并不值得奇怪。
毕竟,他们包含着数据。
但是,对于记录集还有比想象的更多的内容,知道数据如何保存和处理很重要,因为这为选择使用哪种记录集提供了更多的参考。
记录集有不同的类型,在一些细小的地方存在着差异,很容易造成失误。
首先需要认真谈论的是光标的概念。
光标
光标用来管理记录集和记录集的当前位置
能用光标做什么是由光标的类型决定的
1.光标类型
光标的类型标识了光标所能够提供的功能。
这里有四种类型的光标:
•静态(adOpenStatic)。
静态光标含有对记录的静态拷贝。
这意味着在记录集建立之后,记录集的内容就固定了。
其他用户对记录的更改、添加和删除都是不可见的。
允许在记录集中向前、向后移动。
•只许前移(adOpenForwardOnly)。
缺省的光标类型,除了只允许向前移动外,其余的与静态光标相同。
•动态(adOpenDynamic)。
动态的光标没有固定的记录集。
其他用户的更改、添加或删除操作在记录集中是可见的。
•键集(adOpenKeyset)。
键集类型的光标除了记录集是固定的,其余的与动态光标相似。
可以看到其他用户的修改,但新记录却不可见。
如果别的用户删除了记录,那么这些记录在记录集中将会变得不可访问。
这项功能是通过标识记录集的键来实现的,所以键一直保留着,即使改变或删除记录。
锁定
锁定就是如何确保数据的完整性,确保更改不会被覆盖。
我们需要避免的典型情况是多次更新,比如一个用户改动了一些数据,接着另一个用户立即又将其做了修改。
为了对这种情况加以保护,要锁定记录,有许多不同的方法可以保证记录得到保护。
可通过锁定类型来设置这些方法。
1.锁定类型
锁定类型决定更新记录时记录是否或如何被锁定。
有四种类型的锁定:
•只读(adLockReadOnly):
缺省锁定类型,记录集是只读的,不能修改记录。
•悲观的(adLockPessimistic):
当修改记录时,数据提供者将尝试锁定记录以确保成功地
编辑记录。
只要编辑一开始,则立即锁住记录。
•乐观的(adLockOptimistic):
直到用Update方法提交更新记录时才锁定记录。
•批量乐观的(adLockBatchOptimistic):
允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。
当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。
对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,数据在这段时间被更新。
这减少了资源的使用。
悲观的锁定提高了数据的完整性,但却是以牺牲并发性为代价的。
并发性是许多用户在同一时间查阅数据的能力。
锁定的记录对其他用户是不可见的,因而数据的并发性降低了。
乐观的锁定只在一小段时间内锁定记录,所以增强了数据的并发性,但同时其他用户修改数据的几率也增加了。
创建记录集
创建一个记录集十分容易,通过调用Recordset对象的Open方法来实现:
Recordset.Open[Source],[Activeconnection],[Cursortype],[Locktype],[Options]
其参数及说明如表所示
Source
数据源。
可以是数据库中的表名、存储的查询或过程、SQL字符串、Command对象或适用于提供者的其他命令对象
ActiveConnection
记录集使用的连接。
可以是一个连接字符串或者一个打开的Connection对象
CursorType
使用的光标类型。
必须是定义的光标类型中的一种,缺省值为adForwardOnly
LockType
使用的锁定类型。
必须是定义的锁定类型中的一种,缺省值为adLockReadOnly
告诉提供者Source参数的内容是什么,如表、文本字符串等等
例如,要打开数据库pubs中authors表上的记录集:
DimRsauthors
SetRsauthors=Server.Createobject(“ADODB.Recordset”)
Rsauthors.Open“Authors”,Strconn
Rsauthors.Close
SetRsauthors=Nothing
注意,有几个参数没有指定。
实际上,所有的参数都是可选的,可以在打开记录集之前为它们设置相应的属性值:
WithRsauthors
.Source=”Authors”
.Activeconnection=Strconn
.Cursortype=Adopenforwardonly
.Locktype=Adlockreadonly
.Open
EndWith
一旦打开记录集,当前指针自动地位于第一条记录上。
如果在记录集中没有记录,那么EOF和BOF属性都是True:
1.Options参数
Open方法的Options参数允许指定命令文本内容。
它可以是以下CommandTypeEnum常数
之一:
•adCmdText:
文本命令,比如SQL字符串。
•adCmdTable:
表名。
•adCmdStoredProc:
存储过程名。
•adCmdFile:
保存的记录集的文件名。
•adCmdTableDirect:
•adCmdURLBind:
URL地址
Options参数可以是以上常数中的任一个,但也可以加入下列ExecuteOptionEnum常数:
•adAsyncExcute:
异步地执行命令。
•adAsyncFetch:
取得初始的行集后,异步地获取剩下的行。
•adAsyncFetchNonBlocking:
除了获取记录不阻止命令运行以外,其他与adAsyncFetch相似。
•adExecuteNoRecords:
命令不返回任何记录。
为了加入这些选项之一,可以使用Or符号(等同于加号“+”)
adcmdStoredProcOradExecuteNoRecords
2.在记录集中移动
一旦打开了一个记录集,经常需要遍历每一条记录。
这需要使用EOF属性。
当到达记录
集的末尾时,EOF就变为True,因此可以这样创建一个循环:
WhileNotRsauthors.Eof
Response.WriteRsauthors(“Au_Lname”)&
“,”&
Rsauthors(“Au_Fname”)&
“<
Br>
Rsauthors.Movenext
Wend
如果记录集允许向后移动,则可以使用MovePrevious方法。
在这种情况下,循环中需要检测BOF属性值。
另外分别还有移动到第一条和最后一条记录的MoveFirst和MoveLast方法
3.使用Fields集合
Fields集合包含记录集中每一字段(列)的Fields对象。
Fields集合是记录集的缺省集合,因此在访问字段时可以省略,就如同上面的While.Wend例子中的情况。
因此,有多种访问字段的方法:
Rsauthors.Fields(“Au_Lname”).Value
Rsauthors(“Au_Lname”).Value
Rsauthors
(1).Value
Rsauthors.Fields
(1).Value
可以使用字段名,或使用它在集合中的位置。
使用名字是最好的,因为这样将使代码更
易于维护。
Value属性是字段的缺省属性,因此也可以省略,比如:
rsAuthors(“au_lname”)
如果想遍历所有字段,可以使用ForEach结构:
ForEachFldInRsauthors.Fields
Response.WriteFld.Name&
“:
”&
Fld.Value&
BR>
Next
这个例子将打印每一个字段的名字和值。
4.书签
当在记录集中移动时,可能需要保留记录的位置,以后再移回来。
同真实的书签相似,
一个记录集书签是一个指向单个记录的唯一的指针。
为了使用书签,只需将Bookmark属性值赋予一个变量:
varbkmk=rsAuthors.Bookmark
然后,可以在记录集中移动,以后可以通过相反的命令将记录移到做过书签标记的相应记录上:
Rsauthors.Bookmark=Varbkmk
5.支持的功能
如上所述,并非所有的记录集都支持书签。
还有许多其他的记录集选项也不是被所有的提供者或记录集类型支持的,因此可以用Supports方法验证一下。
Supports方法使用一个或多个CursorOptionEnum值作为参数,返回True或False表明是否支持该选项。
过滤记录集
过滤是一种暂时地限定记录集中可见记录的一种方法。
如果仅显示记录集中的某些记录,
但又不需要每次都重新查询数据库,这种方法非常有用。
1.使用条件过滤
Filter属性拥有多个参数,其中一个就是条件表达式,它非常像SQL中Where字句:
rsAuthors.Filter=”state=’ca’”
这个语句限定记录集只显示州名为ca的记录。
使用这个过滤条件将使当前指针回到第一条匹配记录上。
可以遍历记录集中的全部记录,并且只有匹配条件的记录才可见。
不仅仅限于单一条件,还可以使用And或Or把多个条件连接在一起:
rsAuthors.Filetr=”au_lname=’Homer’orau_lname=’Francis’”
这将过滤出姓为Francis或Homer的记录。
上面的例子显示了一个列匹配一个值的过滤方法,也可以使用下面操作符中的任何一种:
:
小于。
>
大于。
=:
小于等于。
大于等于。
不等于。
LIKE:
通配符。
当使用通配符操作时,可以使用“*”或“%”符号。
rsAuthors.Filter=”au_lnameLINK‘Ho%’”
“*”或“%”作为一个通配符,匹配任何字符,因此上面的例子会匹配au_lname字段中
以“Ho”字符开始的所有记录。
可以使用空字符串清空过滤条件,这样将显示全部记录:
rsAuthors.Filter=””
2.使用常数过滤
Filter属性也能用FilterGroupEnum常数作为其参数
•adFilterNone:
清空当前过滤条件,与使用一个空字符串的效果相同。
•adFilterPendingRecords:
只显示那些已改变的,但还没有送到服务器的记录,只在成批更新模式下可用。
•adFilterAffectedRecords:
只显示那些受上一次调用Delete、Resync、UpdateBatch和CancelBatch方法影响的记录。
•adFilterFetchedRecords:
显示高速缓存中的记录,即上一次调用读取记录的命令时的结果。
•adFilterConflictingRecords:
显示在上一次成批更新中更新失败的记录。
3.使用书签过滤
最后一种过滤记录集的方法是使用一个书签数组。
可以使用这个技术创建一个记录列表,
然后再应用一个过滤条件对其过滤。
rsAuthors.Open‘authors’,strconn,adopenkeyset,adlockreadonly,adcmdtabledirect
‘保存书签
avarbkmk(0)=rsAuthors.bookmark
rsauthors.movenext
avarbkmk
(1)=rsauthors.bookmark
rsauthors.movelast
avarbkmk
(2)=rsauthors.bookmark
‘应用过滤
rsquthors.filter=array(avarbkmk(0),avarbkmk
(1),avarbkmk
(2))
whilenotrsauthors.eof
response.writersauthors(“au_lname”)&
rsauthors.movenext
wend
当循环至记录集末尾位置时,会发现只有三条记录,因为只有三个书签应用于过滤条件
注意,不能直接使用数组avarBkmk,必须使用Array函数将各个书签转换成不同的数组。
查找记录
查找单个的记录由Find方法来完成。
它类似于使用条件的过滤方法:
rsAuthors.Find“au_lname=’lloyd’”
它们之间最主要的区别在于这种方法只能有一个条件,不允许使用And或Or。
可以使用可选的参数指定一些额外的选项,其完整的语法如下:
recordset.findcriteria,[skiprows],[searchdirection],[start]
SkipRows是一个数字,表示在开始查找记录前跳过的行数。
缺省为0,查询从当前行开始。
SearchDirection可以是adSearchForwad,表示向前搜索记录;
或者adSearchBackward,表示向后搜索记录。
Start是一个书签,指出开始查找记录的位置。
如果找到相应的记录,当前指针将位于匹配的记录上,如果没有找到记录,那么将位于下面两个位置中的一个:
•如果是向前搜索,则位于记录集末尾位置的后面,EOF被设置为True。
•如果是向后搜索,则位于记录集开始位置的前面,BOF被设置为True。
如果没有找到相应的记录,记录的重新定位可以由书签轻松解决,因为可以为当前位置制作书签,如果在查找记录过程中没有找到所需的记录,那么再移回到上次保存的位置。
‘保存当前记录号
varbkmk=rsauthors.bookmark
‘查找记录
rsauthors.find“au_lname=’sussman’”
‘是否找到
ifnotrsauthors.EOFthen
response.write“Found:
rsAuthors(“au_lname”)&
rsauthors(“au_f