Transcript Document

第6章 ADO数据访问接口
内容提要



本章介绍ADO的基本概念,以及如何在ASP程
序中使用ADO的对象。
介绍ADO的对象Connection、RecordSet和
Command的使用。
介绍SQL语句的基本概念及如何利用SQL语句
操作数据库。并介绍访问数据库的三个基本格
式。
ADO数据访问接口概述

ADO常用的四种对象及其功能如下。





(1) 连接对象(Connection):用来连接数据库。
(2)记录集对象(RecordSet):用来保存查询语句返回的
结果。
( 3 ) 命 令 对 象 ( Command): 用 来 执 行 SQL(Structured
Query Language)语句或者SQL Server的存储过程。
(4)参数对象(Parameter):用来为存储过程或查询提供
参数。
下面介绍常用的连接对象(Connection)、记录集对
象(RecordSet)、命令对象(Command)。
Connection数据对象


与数据库的所有通信都通过一个打开的Connection对象进行。对
一个数据库进行数据的插入和读取之前,必须先打开数据库的连
接
数据库表是由行和列组成的一个二维表,当使用ADO打开数据库
的时候,会有一个指针指向某一行记录,默认的情况下该指针指
向数据库表的第一行。假定该指针叫“rs”,如果要访问数据库表
的字段,可以用图6-1所示的方法。
关系型数据库表与指针

其 中 : 写 法 rs(0)、rs(“ 学 号 ” ) 、 rs.Fields(0) 和
rs.Fields(“学号”)是相同的,写法rs(3)、rs(“语文”)、
rs.Fields(3)和rs.Fields(“语文”)是相同的,其余类推。
根据上表和注释:





rs(4).Name 等价于 rs.Fields(4).Name 等价于 "数学"
rs(1).Name等价于rs.Fields(1).Name等价于"性别"
假设当前的指针指向第三行记录,那么
rs(2).Value等价于rs("姓名")等价于rs(2) 等价于"小张"
rs(4).Value等价于rs(4) 等价于rs("数学")等价于60
打开和关闭数据库连接


要建立与一个数据库的连接,首先创建
Connection对象的一个实例,然后调用
Connection对象的Open方法打开一个连接
通过程序6-01.asp输出数据库的表头。
数据库调用的基本格式


格式一:数据库调用的基本格式
格式说明:利用Execute方法执行SQL语句











'第一步:建立Connection对象
set conn = Server.CreateObject("ADODB.Connection")
'第二步:使用Connection对象的Open方法建立数据库连接
conn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" &_
Server.MapPath("person.mdb"))
'第三步:使用Connection对象的Execute方法执行SQL语句
'如果执行查询语句
set rs = conn.Execute( "数据查询语句" )
'如果执行数据操纵语句
conn.Execute( "数据操纵语句" )
格式一的特点


格式一的特点是:RecordSet对象的实例rs是利
用Connection对象的Execute方法建立的,建立
的rs对象的指针只能向后,不能向前移动。
第一步建立了Connection对象的一个实例,第
二步利用Open方法和用Access数据驱动程序打
开服务器上的某个Access数据库,第三步执行
SQL语句。
Connection对象
参数
说明
用法
Dsn
ODBC数据源的名称
Dsn="ODBC名称"
User
数据库登录的用户名
User="Database User"
Password
数据库登录的密码
Password ="User Password"
Driver
数据库驱动程序的类型
Access用Access的驱动,其他数据库用其他驱动。
Dbq
数据库的物理路径
Dbq = "C:\accdb.mdb"
Provider
数据提供者
Provider="Microsoft.Jet.OLEDB.4.0"
其他类型的数据库连接
连接的数据库
说明
Oracle
Driver={Microsoft ODBC for Oracle};Server=服务器地址;User=;Password=
SQL Server
Server=服务器地址;Database=数据库名;uid=用户名;pwd=''
Excel
Driver={Microsoft Excel Driver(*.xls)};Dbq=Excel文件的物理路径
文本文件
Driver={Microsoft Text Driver(*.txt;*.csv)};DefaultDir=文件的物理路径
Connection对象的方法和属性
方法名称
说明
用法
Open()
建立连接
Conn.Open("数据库连接串")
Close()
关闭与数据库连接
Conn.Close()
Execute()
执行数据库查询
Conn.Execute(SQL语句或者表名)
BeginTrans()
开始事务处理
Conn.BeginTrans()
CommitTrans()
提交事务处理
Conn.CommitTrans()
RollbackTrans()
取消事务处理
Conn.RollbackTRans()
Connection对象的属性
属性名称
说明
用法
CommandTimeout
Execute方法最长执行时间
默认值为30秒钟,可以修改
ConnectionTimeout
Open方法最长执行时间
默认值为15秒,可以修改
ConnectionString
数据库的连接串
可以将连接串赋值给该属性
Mode
用来设置操作权限
1为只读、2为只写、3为可读可写
Version
获取ADO的版本信息
Conn.Version
向浏览器输出数据库内容


向浏览器输出了表头后,可以利用
RecordSet记录集返回数据库表中的数据,
如程序6-02.asp所示。
输出表中所有数据


用一个循环输出数据库中所有的数据。当数据库打开
时,rs对象定位在数据库表的第一条记录上,输出第
一条记录的内容;要想输出第二条记录,必须执行
rs.MoveNext()指令,让它移动到下一条记录。
rs.BOF(Begin Of File,文件开头)和rs.EOF(End Of
File,文件结尾)这两条指令判断记录指针是否移动最
前面和最后面,BOF的位置是在第一条记录之前,EOF
是在最后一条记录之后。如果rs指针在最后一条记录
上,再执行一次MoveNext()时则rs.EOF为真。如果
rs.EOF或者rs.BOF为真,这时读取数据会出错。
数据库表的结构
使用事务



事务在实际编程中使用比较频繁。事务典型的特征是:
事务中一般包含几个事件,只有几个事件同时执行成
功,整个事务才被执行,否则事务中的事件将不被执
行。
比如:在ATM机上取200元,需要执行两个操作,1、
从银行账户上减去200;2、ATM机将钱返给用户。这
两个事件将构成事务。在实际编程中,需要同时成功,
同时失败。
使用方法如程序6-05.asp所示。
Connection对象中的Errors集合


Error对象是Connection对象的子对象。数据库
程序运行的时候,一个错误就是一个Error对象,
所有的Error对象就组成了Errors集合,又称为
错误集合。
可以利用Errors集合的Count属性来判断是否有
错误发生,还可以提取出错误的描述,最后根
据错误的类型,给出相应的解决措施。Errors
对象提供一些属性来得到错误信息
Error对象的属性
参数
说明
用法
Number
错误编号
Err.Number
Description
错误描述
Err.Description
Source
发生错误的原因
Err.Source
HelpContext
错误的提示文字
Err.HelpContext
HelpFile
错误的提示文件
Err.HelpFile
NativeError
数据库服务器产生的错误
Err.NativeError
RecordSet数据对象


记录集可以用来代替表中的记录。一个记录集
包含一条或多条记录(行),每条记录包括一
个或多个域(字段)。在任何时刻,只有一条
记录是当前记录。
创建记录集对象的一个实例,可以使用
Connection对象的Execute()方法,用Execute()
创建的记录集指针只能向下,而不能向上移动,
即不能执行MoveFirst()和MovePrevious()指令。
RecordSet对象的属性及方法

利用RecordSet对象的属性和方法可以完
全操作一个数据库,理论上只要SQL语句
可以完成的操作利用RecordSet对象都可
以实现。RecordSet对象的属性和方法很
多,常用的方法如表6-6所示。
RecordSet对象的方法
方法
说明
用法
Open()
打开记录集
rs.Open()
Close()
关闭记录集
rs.Close()
Requery
重新打开记录集
rs.Requery()
Move()
当前记录前后移动条数
rs.Move(4) 向后面移动4行
MoveFirst()
移动到第一条记录
rs.MoveFirst()
MoveNext()
移动到下一条记录
rs.MoveNext()
MovePrevious()
移动到记录集中的上一条记录
rs. MovePrevious()
MoveLast()
移动到记录集的最后一条记录
rs. MoveLast()
AddNew()
向记录集中添加一条新记录
rs.AddNew()
Delete()
从记录集中删除当前记录
rs. Delete()
Update()
保存对当前记录所做的修改
rs. Update()
UpdateBatch()
保存对一个或多个记录的修改
rs. UpdateBatch()
CancelBatch()
取消一批更新
rs. CancelBatch()
RecordSet对象的属性
属性
说明
用法
ActiveConnection
当前记录集用的数据连接
rs. ActiveConnection = conn
RecordCounts
记录集的总数
rs.RecordCounts
BOF
记录集的开头
rs.BOF
EOF
记录集的结尾
rs.EOF
PageCount
返回记录集中的逻辑页数
rs.PageCount
PageSize
返回逻辑页中的记录个数
rs.PageSize 默认值是10
AbsolutePage
指定当前的页
rs.AbsolutePage
AbsolutePosition
指定当前的记录
rs.AbsolutePosition
使用RecordSet对象打开数据库


格式二:数据库调用的基本格式
格式说明:利用RecordSet对象打开数据库表










'第一步:建立Connection对象
set conn = Server.CreateObject("ADODB.Connection")
'第二步:使用Connection对象的Open方法建立数据库链接
conn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" &_
Server.MapPath("Access数据库"))
'第三步:建立RecordSet对象
set rs = Server.CreateObject("ADODB.Recordset")
'第四步:利用RecordSet对象的Open方法打开数据库
rs.Open "SQL语句", conn, 打开方式, 锁定类型
打开类型的四个参数:




(1)adOpenFowardOnly:对应的数字是0(默认值),记录集
只能向前移动。这些参数对应的数字,都保存在系统文件
Adovbs.inc中。
(2)adOpenKeyset:对应的数字是1,记录集可以向前或向后移
动。如果另一个用户删除或改变一条记录,记录集中将反映这个
变化。但是,如果另一个用户添加一条新记录,新记录不会出现
在记录集中。
(3)adOpenDynamic:对应的数字是2,使用动态游标,可以在
记录集中向前或向后移动。其他用户造成的记录的任何变化都将
在记录集中有所反映。
(4)adOpenStatic。对应的数字是3,使用静态游标,可以在记
录集中向前或向后移动。但是,静态游标不会对其他用户造成的
记录变化有所反映。
锁定类型的参数如下





( 1)adLockReadOnly: 只读锁定 ,对应的数字是 1(默 认
值),不能修改记录集中的记录。
(2)adLockPessimistic:悲观锁定,对应的数字是2,指定在
编辑一个记录时,立即锁定它。
进入锁定-----
rs("数学") = rs("数学") + 100
rs("语文") = rs("语文") + 100
rs.Update()
------解除锁定
锁定类型的参数











(3)adLockOptimistic:乐观锁定,对应的数字是3,指定只有调用记录
集的Update方法时,才锁定记录。
rs("数学") = rs("数学") + 100
rs("语文") = rs("语文") + 100
进入锁定----rs.Update()
------解除锁定
(4)adLockBatchOptimistic:批次乐观锁定,对应的数字是4,指定记
录只能成批地更新。
For I = 1 to 10
rs ("语文")= rs ("语文") + 100
rs ("数学") = rs ("数学") + 100
rs.MoveNext()
Next
进入锁定----rs.UpdateBatch() ------解除锁定
RecordSet


当数据库第一次打开时,RecordSet指针定
位在第一条记录上,可以利用
AbsolutePosition直接定位到某条记录上,
基本的语法是:AbsolutePosition=N,如程
序6-07.asp文件所示。
AbsolutePage



还有一个属性是AbsolutePage,当调用AbsolutePage时,系
统将对数据记录进行分页,默认每页为10条记录,
AbsolutePage为几,记录指针就自动定位到第几页的第一条
记录上。
比如说,AbsolutePage = 3,则记录指针就自动定位到第21
条记录上去了,此时AbsolutePosition = 21。计算公式为:
AbsolutePosition = (AbsolutePage-1)*PageSize,PageSize
默认是10,也可以设置为其他的值。
使用方法如程序6-08.asp所示
实现数据库的分页显示


数据库中可能有成千上万条记录,如果
一次都显示出来的话消耗的时间太多。
下面通过一个案例分成六个版本实现数
据库的分页显示。
案例6-1 分页显示





首先利用格式二将数据库表中某页的所有记录输出,
如程序pageV1.asp所示。
在程序中加上翻页的超级链接就可以实现翻页,如程
序pageV2.asp所示。
可以利用PageCount属性得到总页数,修正这些可能出
现的错误,得到版本三。如程序pageV3.asp所示。
加入超级链接的版本四如程序pageV4.asp所示,将姓
名一列加上超级链接。
偶数行和奇数行可显示不同的背景颜色。版本五将实
现这些功能,如程序pageV5.asp所示。
Command数据对象


Command对象又称为命令对象,可以执行
SQL语句和执行SQL Server的存储过程。通
过传递SQL指令
对数据库提出操作要求,把得到的结果返回
给RecordSet对象。
Command对象的属性和方法
属性
说明
用法
ActiveConnection
指定Command用的连接
cmd. ActiveConnection = conn
CommandText
指定数据库查询信息
cmd. ActiveConnection =表名或SQL
CommandType
数据查询的类型
cmd. CommandType =1, 2,4
CommandTimeout
执行SQL语句的最长时间
默认为30秒
Prepared
是否预编译,可以加快速度
cmd.Parpared = True/ False
Command对象提供的方法
方法
说明
用法
Execute()
执行SQL语句、表名或者存储过程
cmd.Execute()
CreateParameter()
创建Command对象的参数
cmd.CreateParameter()
格式三


格式三:数据库调用的基本格式
格式说明:利用Command对象的Execute方法建立RecordSet对象















'第一步:建立Connection对象
set conn = Server.CreateObject("ADODB.Connection")
'第二步:使用Connection对象的Open方法建立数据库连接
conn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" +
Server.MapPath("Access数据库"))
'第三步:建立Command对象
cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = sql
'第四步:使用Command对象的Execute方法执行SQL语句
'如果执行查询语句
rs = cmd.Execute()
'如果执行数据操纵语句
cmd.Execute()
使用Command对象

使用Command对象来执行SQL 语句,如
程序6-09.asp所示。
例6-2 分页列表的删除和修改

本案例实现的功能是:为案例6-1的分页
列表添加修改数据和删除数据的功能。
首先为列表添加两列:修改和删除。显
示的主页面如图6-16所示。
案例6-3 分页版本的留言簿


这里再对留言簿作一次升级,在案例5-2
的基础上加入分页功能。
只要更改display.asp文件就可以。
小结


本章重点理解访问数据库的三大基本格式及各
自的特点。掌握Connection,RecordSet和
Command对象的使用方法。
熟练掌握利用格式二实现数据库的分页显示和
利用SQL语句操作数据库的方法。
本章习题
















一、选择题
1. 可以使用ADO来访问的数据库是___________。
A) Microsoft Access
B) Microsoft SQL Server
C) Oracle
D) 以上都可以
2. 命令对象(Command):用来执行___________。
A) SQL语句
B) SQL Server的存储过程
C) 连接数据库
D)返回记录集
3. 语句rs.Fields.Count 返回的值是___________。
A) 记录集的行数
B) 记录集的列数
C) 记录集的行数+1
D) 记录集的列数-1
4. 使用BeginTrans()___________,利用CommitTrans()___________,
如果有错误发生,利用RollbackTrans()来___________。
A) 提交一个事务
B) 总结事务
C) 开始一个事务
D) 取消事务
5. 可以利用Errors集合的___________来判断是否有错误发生
A) Number属性
B) Description属性
C) Count属性
D) Source属性
二、填空题



1. 当执行事务的时候,如果没有错误发生,则
conn.Errors.Cout将为___________。
2. 创建记录集对象的一个实例,可以使用
___________,这种方法创建的记录集指针只
能向下,而不能向上移动,即不能执行
MoveFirst()和MovePrevious()指令。
3. 判断记录集合是否到表的最后, 利用语句
___________。
三、简答题与程序设计题






1. 简述ADO的功能及常用的三大对象的用途。
2. 访问数据库格式一有什么特点?可以执行哪
些SQL语句?
3. 如何实现模糊查询?
4. 如何用变量替换SQL语句的值?
5. 格式二的数据打开方式和锁定方式有几种?
各有什么含义?
6. 比较访问数据库的三个基本格式的异同。