教学前言
课程介绍
师资介绍
教材介绍
课程计划
教学大纲
教学计划
实训计划
课程总表
教学内容
作业考试
作业上传
在线测试
测验考试
互动讨论
学习论坛
疑难解答
意见建议
 
 
章节:
第6章 ASP与数据库的集成
6.2 Connection连接对象 FLASH版演示教案
教学目的:
掌握Connection连接对象的创建、方法和属性;

了解事务处理
重点:
Connection连接对象的创建、方法和属性
难点:
事务处理
内容:

通常我们打电话要经过拨号连接、会话、会话结束后挂断等操作步骤,对Web数据库的操作也是如此,即建立与数据库的连接、操作数据库和关闭与数据库的连接。Connection对象就是用于建立并管理与数据库的连接,使ASP程序与数据库进行沟通。对数据库的操作都需要建立一个Connection连接对象,连接建立后,才可以利用Command命令对象和Recordset记录集对象对数据库进行操作,因此Connection连接对象是ADO的基础。
6.2.1 创建Connection连接对象
首先,利用ASP中的Server对象的CreateObject方法建立连接对象。在用Connection对象做任何事之前,必须首先创建这个对象。要注意创建与打开这个对象是两回事。建立与数据库连接的语法如下:
Set 连接对象名=Server.CreateObject("ADODB.Connection")
例如我们创建一个名为db的连接对象。
Set db=Server.CreateObject("ADODB.Connection")
注意:为了说明问题的方便,给连接对象取名为db,本书下面的实例中连接对象名均为db。
连接对象建立后,再使用连接对象的Open方法打开数据库并与之建立连接,语法如下:
db.Open 连接参数
语句中可能要用到的连接参数见表6-3。

表6-3 连接对象的Open方法的连接参数
参数
说明
Dsn ODBC 数据源名
User 数据库登录名
Password 数据库登录密码
Driver 驱动程序名(指明数据库类型)
Provider 数据提供者
Dbq 数据库的物理路径

实际代码的编写中,以上参数并不是全部都要用到,比如一般情况下,Access数据库不会设置登录名和密码;而有的参数不能同时使用,比如指定了DSN数据源,就用不上Driver、Dbq和Provider等。如果用上多个参数,参数之间用分号相隔,顺序没有关系。
常用的连接方式有两种,一种是在ASP代码中直接指定数据库和驱动程序来建立连接,即没有ODBC数据源方式;另一种是利用ODBC数据源与ASP建立连接。
假如有江西盛达电脑公司网站,其主目录位于C:\Inetpub\wwwroot\,站点文件夹结构如图所示。

网站中的公司论坛采用ASP+Access技术,数据库sdbbs.mdb与论坛的ASP页面文件位于同一层,在文件夹sdbbs下。
下面给出没有ODBC数据源的连接代码。这种方式是在没有建立数据源的情况下,在代码中指定Dbq参数和Driver参数来连接数据库。
范例6-2:没有ODBC数据源的连接方式
<%
' 创建名为db的连接对象
Set db=Server.CreateObject("ADODB.Connection")
' 利用连接对象的Open方法打开数据库
' 指出数据库文件位置及文件名,指出数据库的驱动程序
db.Open"Dbq=C:\Inetpub\wwwroot\Sd-web\sdbbs.mdb;Driver={microsoft Access Driver(*.mdb)}"
%>
说明:
上例中数据库文件位置用物理路径来表示,为了程序移植方便,可以用虚拟路径表示,即用Server对象的MapPath方法,将数据库文件的虚拟路径转换成绝对路径。
<%
Set db=Server.CreateObject("ADODB.Connection")
' 利用Server对象的Mappath方法取得数据库的绝对路径
db.Open"Dbq="&Server.Mappath("sdbbs.mdb")&";Driver={Microsoft Access Driver (*.mdb)}"
%>
使用Mappath方法可以方便程序的移植,但是要注意容易出现数据库路径错误,上面的例子中sdbbs.mdb数据库与论坛的ASP页面在同一层文件夹sdbbs下,如果不是,假如数据库在文件夹sdbbs的下一层文件夹sdbbsmdb下,则应该改成 “sdbbsmdb/sdbbs.mdb”或“sdbbsmdb\sdbbs.mdb”。
这种连接方式的优点表现在方便程序的移植,它不用在服务器上设置数据源,比较适合于远程服务器使用。而这种方式的缺点则表现在代码相比复杂,容易造成错误,在连接数据库的书写格式和数据库的路径方面容易造成错误。因为本例中数据库和程序放在同一层,因而路径问题不易出现,但是如果这两者不在文件夹的同一层,就有可能出现路径方面的表达错误。这种方式的另一个缺点表现在安全性比较差,程序代码中有数据库的名称和位置,如果源程序泄露,则数据库的名称和位置就暴露,容易被不怀好意的人盗取数据库里的信息。特别是安全性要求比较高的电子商务网站或电子政务网站要注意这点。
例,某单位在搜狐申请主页空间,选择的是支持ASP+Access技术的高级型虚拟主机,系统为Windows2000操作系统。为了保障虚机安全,虚机目录采取了一些必要的安全策略。
空间有两个目录,htdocs目录是虚机页面文件根目录,对该目录文件拥有读/执行权限,但是没有写权限;database目录是虚机数据库目录,对该目录文件拥有读/写权限,但是没有执行权限。也就是说asp是无法直接对htdocs目录进行文件写操作的,这是为了保障虚机安全所采取的必要措施,但是asp是可以对和htdocs目录同级的database目录进行文件读/写操作的,即可以通过IE运行htdocs目录下的asp来对database目录下数据库文件进行读和写操作。按照ISP的要求,.mdb文件必须放在和htdocs目录同级的database目录下, 而不是放在htdocs目录及其子目录下;而所有.htm/.asp页面文件必须放在和database目录同级的htdocs目录下,因为这是虚机页面文件根目录。在这种情况下,ASP所操作的数据库位置则必须是通过server.mappath("..\database\yourfiledb.mdb")来指明。
下面给出有数据源的连接方式的代码。这种方式是通过在服务器上创建并配置数据源的形式建立连接,ODBC是微软推出用于开发数据库系统应用程序的编程接口规范,只要系统有相应的ODBC驱动,就可以通过ODBC与该数据库连接并访问数据库中的信息。假如对sdbbs.mdb数据库进行了数据源的设置,数据源名为zbsdbbszb。
范例6-3:有数据源的连接方式
<%
' 创建名为db的连接对象
Set db=Server.CreateObject("ADODB.Connection")
' 利用连接对象的Open方法打开zbsdbbszb数据源中代表的数据库
db.Open"Dsn=zbsdbbszb"
%>
可以简写为:
<%
set db=Server.CreateObject("ADODB.connection")
db.open"zbsdbbszb"
%>
这种连接方式必须先用ODBC数据源管理器来建立一个数据源之后才可以使用,就是创建系统的DSN(Data Source Name,数据源名称)文件,数据库驱动程序是通过DSN定位和标识数据库。DSN包含了ODBC连接的信息,包含了数据库文件名、所在目录、数据库驱动程序、数据库用户名、密码等。因此,采用这种方式建立连接,不用考虑数据库文件名及其位置,只需提供在ODBC中的DSN即可。一个DSN连接需要服务器的系统管理员在服务器上进行相应的设置。
这种方式的优点是稳定与安全性相对比较好,DSN中可以设置一个与数据库本身名字不同的数据源名,比如数据库名字为sdbbs,数据源名字为zbsdbbszb,这样可以有效地防止由于源程序泄露而可能出现的数据库被窃取;代码简单,不易出错;不管数据库移动到哪里,只要设置一下数据源,程序不用改变。而这种方式的缺点则表现在不方便移植,如果程序移植到另外的服务器上,则需要重新设置数据源。
如果从安全与稳定的角度出发,应该选择利用ODBC数据源建立连接的方式;如果从方便移植的角度出发,可以选择在ASP代码中直接指定数据库的驱动程序来建立连接。
SQL数据库的连接方式与Access的基本一样,不过SQL数据库一般有登录账号和密码,因此需要在代码中表示出来。例如有一个SQL 数据库,数据源名为zbsdbbszb,数据库登录账号为sdzb,密码为123456。
范例6-4:SQL 数据库的连接方式
<%
Set db=Server.CreateObject("ADODB.Connection")
db.Open"zbsdbbszb","sdzb","123456"
%>
连接数据库的代码要插入到运用数据库的各个ASP页面的html代码之中,如果ASP页面数比较多,可以采用包含连接文件的方式进行连接。例,将上述连接代码转成一个连接文件conn_db.asp,然后在ASP页面<html>标签前面写上 <!--#include file="conn_db.asp"-->。
6.2.2 Connection连接对象的属性
Connection连接对象的常用属性见表6-4。

表6-4 Connection连接对象的常用属性
属性
说明
ConnectionTimeout 连接操作的最长执行时间
CommandTimeout Execute方法的最长执行时间
ConnectionString 数据库连接信息
Mode 设置连接数据库的权限
DefaultDatabase 指定连接对象的默认数据库
Attributes 设置连接对象控制事务处理时的行为
IsolationLevel 设置连接对象事务处理的时机
CursorLocation 设置光标的类型
Provider 设置连接对象默认的数据库管理程序名称
Version 显示ADO对象的版本信息

下面介绍几种常用的属性。
1. ConnectionTimeout
用于指定连接对象执行与数据库连接的最长时间,如果超过时间数据库没有连上,则停止执行,语法如下:
db.ConnectionTimeout=秒数
默认值15秒。如果设置为0,则会无限等待直到连接到数据库,当然一般不要这样设置。如果数据库比较慢,可以设置允许连接时间长些,例如设置时间为30秒。
<% db.ConnectionTimeout=30 %>
2. CommandTimeout
设置Connection对象的Execute方法的最长执行时间,默认值为30秒。执行数据库操作时,如果时间到了仍然无法正确执行,将结束操作,语法如下:
db.CommandTimeout=秒数
可以根据需要设置时间,如果设置为0,则会无限等待直到执行。如果数据库比较慢,可以设置允许操作的时间长些,例如设置时间为60秒。
<% db.CommandTimeout=60 %>
3. ConnectionString
用于指定连接对象的数据库连接信息。除了上面所介绍的数据库连接方式,还可以设置ConnectionString属性来连接和打开数据库,不过这种连接方法一般用的比较少。
范例6.5:使用ConnectionString属性连接数据库
<%
Set db=Server.CreateObject("ADOBD.Connection")
db.ConnectionString="Dbq="&Server.Mappath("sdbbs.mdb")&";Driver={Microsoft Access Driver(*.mdb)}"
db.Open
%>
4. Mode
用于设置连接数据库的权限,默认情况下,是可读可写,Mode值见表6-5。

表6-5 Mode值
参数
Mode值
说明
AdModeUnknown 0 没有定义
AdModeRead 1 只读权限
AdModeWrite 2 只写权限
AdModeReadWrite 3 可读可写权限

范例6-6:连接数据库后,设定只能对其读操作而不能进行添加、删除、更新等操作。
<%
Set db=Server.CreateObject("ADOBD.Connection")
db.Mode=1
db.Open"Dbq="&Server.Mappath("sdadd.mdb")&”;Driver={Microsoft Access Driver(*.mdb)} "
%>
如果不想对数据库进行修改操作,可以设置连接数据库的权限为只读,这样数据库安全性能好。
5. DefaultDatabase
一般只有一个数据库,而有的数据提供者却能提供多个数据库,在这种情况下,可以用DefaultDatabase属性来指定连接对象的默认数据库。
6. Version
用于显示ADO对象的版本信息。
例如,<% Response.Write db.Version%>,则会输出ADO对象的版本信息。
6.2.3 Connection连接对象的方法
Connection连接对象的常用方法见表6-6。

表6-6 Connection连接对象的常用方法
方法
说明
Open 建立连接对象与数据库的连接
Close 关闭连接对象与数据库的连接
Execute 用于执行数据库的查询操作
BeginTrans 开始事务处理
CommitTrans 提交事务处理结果
RollbackTrans 取消事务处理结果

这些方法中最常用的是Open和Execute。下面介绍这些常用方法。
1. Open
用于建立Connection连接对象与数据库的连接。连接建立后,使用连接对象的Open方法打开数据库,才可以继续进行各种数据库操作。语法如下:
db.Open 连接参数
常见的连接参数见表6.2。其具体用法前面已有介绍。
2. Close
用于关闭Connection连接对象与数据库的连接。此方法将切断连接对象与数据库的连接通道,通道切断之后,所有信赖于此连接对象的命令对象和记录集对象也将被切断连接关系,语法如下:
db.Close
当与数据库的连接任务完成之后,应关闭这个连接,以释放与这个连接相关的系统资源。当然,当页面关闭后,连接对象也会自动关闭,Close方法可以省略不写,但最好使用代码形式下达关闭命令。特别是用户量很大的ASP程序应该使用代码形式下达关闭连接对象的命令。
使用Close方法关闭记录集对象,并不会将记录集对象从内存中清除,因此一个关闭的连接还可以使用Open方法来打开连接,而不需要重建连接对象。如果的确不再需要这个对象,可以用Set db=nothing语句清除这个对象,以完全释放所占用的系统资源。
范例6-7:将连接对象彻底清除
<%
db.Close
Set db=nothing
%>
在连接对象赋值nothing后,如果还需要使用连接对象,就必须重新创建。
注意:为了节省版面和使代码简洁,本书大多数实例中没有关闭连接对象的代码。同学们在实际编程之中,应注意编写连接任务完成之后关闭连接对象的代码。
3. Execute
用于使用SQL语句执行数据库的查询操作。当创建了连接对象并且与数据库连接后,就可以通过连接对象的Execute方法直接与数据库对话,对数据库进行添加、更新和删除等操作,Execute方法是连接对象最有用的方法,有两种语法。
第一种,Set rs=db.Execute(SQL字符串)
rs是我们给Recordset对象取的名字,这种方法将返回一个Recordset对象,得到查询操作的记录集。如果对数据库查询操作需要显示记录时就需要用到记录集,一般就要用到这种方法。至于Recordset对象后面将会详细介绍。
范例6-8:返回记录集,并显示记录
<%
Set db=Server.CreateObject("ADODB.Connection")
db.Open"zbsdbbszb"
set rs=db.execute("select * from article where name='张三'")
do while not rs.eof
response.write rs("title")&"<br>"
rs.movenext
loop
%>
说明:
从数据表article中查询用户名为张三的记录,并显示张三所发表的文章标题title。注意SQL字符串要用括号括起来,不然会出现错误。
第二种,db.Execute SQL字符串
这种方法不返回一个Recordset对象。如果对数据库执行的是添加、删除和更新操作,由于没有必要返回记录集,所以可以采用这种方法。
对于第二种方法,还可以添加一个参数number,用于返回此次操作影响的记录数。
范例6-9:执行数据库的删除操作,并返回操作所影响的记录数
<%
Set db=Server.CreateObject("ADODB.Connection")
db.Open"zbsdbbszb"
strsql="delete from article where name='张三'"
db.execute strsql,number
response.write"共删除有关张三的记录"& number &"条"
%>
下面第4、5、6种方法是关于事务处理的。事务是指整体成功或失败的操作,一般性质的数据库操作没有必要考虑事务处理,但是如果是重要的数据库操作则有必要采用事务处理方式以保证进行可靠的数据更新。例如网上商店系统,在进行交易的时候,用户要把费用从自己的账号转到公司的账号,这项操作一般分两步执行,第一步先从该用户账号上删除这笔款项,第二步再在公司的账号上加上这笔款项,如果在第一步执行后发生意外,第二步则无法进行,这样就会出现账面上的错误。为了防止这种错误,可以将分散执行的数据库操作封装成一个整体操作来完成,以保证两步操作均正确执行,否则一步都不执行,从而保证数据库里数据的完整性。
4. BeginTrans
用于表示开始事务处理,启动了页面与数据库的事务处理过程,语法如下:
db.BeginTrans
5. CommitTrans
用于提交事务处理结果,执行CommitTrans才能真正更新数据库,语法如下:
db.CommitTrans
6. RollbackTrans
用于取消事务处理结果,结束事务处理过程,语法如下:
db.RollbackTrans
范例6-10:事务处理的综合运用
<%
' 连接数据库,建立Connection对象
Set db=Server.CreateObject("ADODB.Connection")
db.Open"zbsdbbszb"
On Error Resume Next ' 如果发生错误,跳过执行下一句
db.BeginTrans ' 开始事务处理过程
strSql="Delete from article where name='张三'" ' 删除记录
db.Execute(strSql)
strSql="Insert into article (name) values('李四')" ' 添加记录
db.Execute(strSql)
If db.Errors.Count=0 Then ' 如果没有错误发生,则执行下面语句
db.CommitTrans ' 提交事务处理
Else
db.RollbackTrans ' 如果有错误发生,则取消事务处理
End If
%>
说明:
▲ 本例是将数据库article表中张三的名字改成李四的名字,为了保证操作正确,运用了事务处理,先删除记录,再添加记录。如果没有遇到错误,则提交事务处理结果,如果遇到错误,则取消整体操作。
▲ db.Errors.Count=0
表示没有错误发生,可以提交结果,而db.Errors.Count>0表示发生了错误。关于错误对象我们将在下面讲述。
3.On Error Resume Next
表示如果发生错误,跳过执行下一句。下面将有具体解释。
6.2.4 Errors错误集合与Error错误对象
在上面的范例中,提到了有关Error方面的问题。发生连接的时候,由于某种原因可能存在连接错误,这就要用上Error错误对象与Errors错误集合。
相对来说,连接时发生错误的可能性大,例如,对服务器的要求已经饱和、连接时所指定的数据源打不开等,因此Error对象可以看成连接对象的子对象。
一个错误就是一个Error对象,若干个Error对象就组成了Errors集合。Errors集合是指程序在运行时,可能会发生错误,而ADO对象的错误都收集在Errors集合中。Errors集合不需要建立,如果有错误的发生,系统将自动建立,如果没有错误,Errors集合为空,如果非空,其中的每一个项目均为Error对象。当另一个ADO操作产生错误时,Errors集合将被清空,并在其中放入新的Error对象集。
一个稳定的成熟的ASP程序,应该面对错误并处理它,例如判断有无错误发生,重试,给出错误描述,另外执行一条不出错的程序运行路径,或者是恢复到错误发生前的状况等。
1.Errors集合
Errors集合的属性只有Count。Count返回Errors集合中Error对象数目,可以用于判断是否有错误发生。如果Count=0则表示没有错误发生;Count>0则表示有错误发生,其值为长整型,语法如下:
db.errors.count
例如上面的范例,在进行事务处理时,可以插入判断以明确有无错误发生。
<%
If db.Errors.Count=0 Then

%>
Errors集合的方法有Item和Clear。
Item: 用于创建Error错误对象
Clear:清除Errors集合中所包含的Error对象
Item用于创建错误对象,语法如下:
Set err=db.Errors.Item(index)
省略Item为:
Set err=db.Errors (index)
上面语句中index为错误索引值,从0起始,index取值是从0到Errors.Count-1的一个长整数,0值表示第一个错误,类推。
注意:为了说明问题的方便,本书Error对象名为err。
Clear用于清除Errors集合中所包含的Error对象,语法如下:
db.Errors.Clear
2.Error对象
Error对象包含了一条错误的所有信息。它没有方法,只有属性。要获得错误信息,可以在可能发生错误的语句后面捕获及显示错误信息。
Error对象的常用属性见表6-7,最重要的属性为Description和Number。

表6-7 Error对象的常用属性
属性
说明
Description 错误描述
Number 错误编号,取值见表6-8
Source 错误原因
NativeError 数据库服务器产生的原始错误


常见错误编号值如表6-8所示。

表6-8 常见错误编号值
说明
3246 数据传送错误
3251 数据库不支持
3708 参数指定不正确
3704 对象已关闭,无法执行

范例6-11:下面的例子将形成一个连接错误,然后在浏览器上显示错误描述。
<%
On Error Resume Next ' 表示发生错误后,继续执行下一句
Set db=Server.CreateObject("ADODB.Connection")
db.Open "asdfgbbs" ' 故意给出错误的数据源,以形成连接错误
' 用一个循环将所有错误信息输出
Dim I,err
if db.errors.count>0 then
Response.Write "连接时发生了:" & db.errors.count & "个错误<br>"
end if
for i=0 to db.errors.count-1
Set err=db.Errors.Item(I) ' 建立Error对象err
Response.Write "错误编号:" & err.Number & "<br>"
Response.Write "错误描述:" & err.Description & "<br>"
Response.Write "错误原因:" & err.Source & "<br>"
Next
%>
 点击浏览sample6-1.asp形成连接错误的描述。
说明:
On Error Resume Next
表示如果发现错误,则跳过继续执行下一条语句。如果在代码中不加上这句,当程序运行到db.Open "asdfgbbs"时,就会产生错误,并将错误信息记录到错误对象,程序将会中止,不会继续运行下面的语句,这样只能看到错误,而没有对错误进行处理。有了On Error Resume Next,则遇到错误后会继续执行下面的语句,可以根据错误信息进行相应处理。
面对可能发生的错误,如果进行处理呢?错误的存在有多方面的原因,比如代码的错误、网络的不通等,成熟的程序应该面对这些情况进行适当的处理,并在用户端浏览器上显示相应的错误信息,由于篇幅关系,这里不作过多的叙述。


FLASH版演示教案:
FLASH版演示教案
实训作业:
分别编写出有和没有ODBC数据源的数据库连接代码。
在线测试:
在线测试
备注:

成熟稳键的程序要进行错误捕获和错误处理的设置。

附:
提高部分

~ 江西信息应用技术职业学院信息技术系制作 ~

E-Mail:lxlz2050@163.net Tel:0791-5275546