650 likes | 857 Views
第 7 章 ADO 在 ASP 中的应用. 【 本章教学目的、要求 】 1 、 学会创建数据库掌握基本的 SQL 语法; 2 、 认识 ADO ,掌握使用 ADO 连接数据库的方法; 3 、熟练掌握几个重要的 ADO 对象; 4 、编写复杂的 ASP 数据库程序。 【 本章教学重点、难点 】 ADO 连接数据库的方法、常用 ADO 对象的使用。 【 本章教学安排 】 6 学时. 本章教学内容. 7.0 前言 7.1 活动数据对象 ADO 7.2 连接数据库 Connection 对象 7.3 检索数据 RecordSet 对象
E N D
第7章 ADO在ASP中的应用 【本章教学目的、要求】 1、学会创建数据库掌握基本的SQL语法; 2、认识ADO,掌握使用ADO连接数据库的方法; 3、熟练掌握几个重要的ADO对象; 4、编写复杂的ASP数据库程序。 【本章教学重点、难点】 ADO连接数据库的方法、常用ADO对象的使用。 【本章教学安排】 6学时
本章教学内容 • 7.0 前言 • 7.1 活动数据对象ADO • 7.2 连接数据库Connection对象 • 7.3 检索数据RecordSet对象 • 7.4 增强处理能力Command对象 • 7.5 ADO对象库的集合 • 7.6 综合实例:用户注册登录系统 • 7.7 本章小结 • 7.8 上机练习与习题
7.0 前言 • ADO(ActiveX Data Object)是Microsoft为数据库应用程序开发的一种面向对象的、与语言无关的通用的数据库访问接口,是建立在OLE DB之上的高层数据库技术。 • ASP强大的数据库访问功能正是由ADO来完成的。在ASP中,只要访问一个数据库,就要用到ADO组件及结构化查询语句SQL,即使用SQL语言来查询和操作数据库。 • ASP与ADO相结合,完整地解决了网页与数据库的连接与集成问题,实现了客户端浏览器对Web数据库灵活而有效地访问,从而提供了对各种Web应用的强大支持。 Return
7.1 活动数据对象ADO • 7.1.1 ADO连接数据库的方法 • 7.1.2 ADO开发数据库的流程 Return
7.1.1 ADO连接数据库的方法 • ADO访问数据库有两种方式: • (1)通过ODBC; • (2)直接使用OLE DB数据库驱动程序。图7-11 • 什么是ODBC呢? • ODBC(开放数据库连接 Open DataBase Connecivity):是一套API(应用程序接口),用这套API允许用户书写可以应用在各种RDBMS服务器上的应用。简言之,ODBC就是一种访问数据库的方法,只要系统中有相应的ODBC驱动程序,任何程序都可以通过ODBC操纵驱动程序的数据库。但它主要是基于SQL语言的。 • 什么是OLE DB? • OLE DB位于ODBC层与应用程序之间。在你的ASP页面里,ADO是位于OLE DB之上的“应用程序”。 你的ADO调用先被送到OLE DB,然后再交由ODBC处理.。你可以直接连接到OLE DB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升。 Return
图7-11 使用ADO访问数据库 OLE DB的ODBC驱动程序 OLE DB的数据库驱动程序 ODBC ODBC的数据库驱动程序 ADO OLE DB 数据库 Return
7.1.2 ADO开发数据库的流程 • 在ASP中,ADO可以看作是一个数据库访问组件(Database Access),ADO包含一般在ASP中使用的所有对象。ADO是由ADO DB对象库与表7-24中所示的子对象及数据集合组成。 • ADO访问数据库的基本流程如下: • (1)引入ADO库定义文件,即创建数据库访问Database Access组件。 • (2)利用Dababase Access组件中的Connection对象连接数据库。 • (3)利用建立好的连接,通过组件中的其他对象执行SQL命令。 • (4)使用完毕后关闭数据库连接,并释放对象。 Return
表7-24 ADO对象 Return
7.2 连接数据库Connection对象 • Connection对象负责与数据库实际的连接动作,其他所有对象都必须依赖该对象实现的连接才能发挥各自的功能。由于Connection对象是属于ADO组件的对象,因而需要首先用Server对象的CreateObject方法创建一个对应的实例之后才可使用。 • 7.2.1 Connection对象的创建 • 7.2.2 连接数据源的两种方法 • 7.2.3 Connection对象的方法 • 7.2.4 Connection对象的属性 Return
7.2.1 Connection对象的创建 • 创建Connection对象实例的语法格式为: Set conn = Server. CreateObject("ADODB.Connection") • 创建一个Connection对象后,并不表示在应用程序和数据源之间真正地建立了连接,其具体工作分两步进行。 • 第一步:创建一个Connection对象,相当于定义一个可以用于与数据源连接的变量。 • 第二步:打开Connection对象,真正与数据源建立连接,并对数据库执行查询、添加和删除等相关操作。 Return
7.2.2 连接数据源的两种方法(1) • 1、第一种方法,通过ODBC建立与数据库的连接。 • 下面建立一个名为“q1”的数据源,数据库为Access创建的“a1.mdb”。 • 打开:控制面板 / 管理工具 / ODBC管理器 • 连接的语法格式: • Conn.open “dsn=q1”
7.2.2 连接数据源的两种方法(2) • 2、第二种方法,直接使用OLE DB数据库驱动程序建立与数据库的连接。 • (1)连接“Microsoft Access”创建的数据库 • 格式: Conn.open “Driver={Microsoft Access Driver (*.mdb)};Dbq=“ & server.mappath(“a1.mdb”) • (2)连接“SQL Server”创建的数据库 • 格式: Conn.open “Provider=SQLOLEDB;UID=用户名;PWD=密码;Initial Catalog=数据库名称;Data Source=服务器名称” Return
7.2.3 Connection对象的方法(1) • 使用Connection对象的方法可以打开Connection对象,真正与数据库建立连接,并对数据库执行查询、添加、删除等相关操作。 • 1、Open方法 • 作用:打开与数据库的连接,在该方法成功完成后,连接才真正建立,才能对数据源发出命令并且处理结果。 • 语法格式: • Conn.Open [ConnectionString][,UserID][,Password][,Option] • 其中: • (1)ConnectionString包含用于建立连接数据源的信息。 • (2)UserID包含建立连接时所使用用户名。 • (3)Password包含建立连接时所使用密码。
7.2.3 Connection对象的方法(2) • 注意:如果在ConnectionString参数中包括了用户名和密码信息,而同时UserID及Password参数也存在,那么UserID和Password参数将覆盖ConnectionString中指定相应的信息。 • 如: • (1)配置好了q1数据源,并连接a1.mdb数据库 • 如例子7_0.asp • (2)直接使用字符串连接a1.mdb数据库 • 如例子7_0_1.asp • (2)Close方法 • 作用:关闭Connection对象以释放所有关联的系统资源。若要从内存当中完全删除此对象,可将对象变量设置为Nothing。如 • 例子:7_0.asp及7_0_1.asp
7.2.3 Connection对象的方法(3) • 3、Execute方法 • 作用:执行指定的查询、SQL语句、存储过程或特定提供者的文本等内容。语法格式: • Conn.Execute CommandText [,RecordsAffected] [,Options] • 其中: • (1)CommandText是一个字符串,包含要执行的SQL语句、表名、存储过程或特定提供者的文本; • (2)RecordsAffected是长整型变量类型,返回本次操作所影响的记录数; • (3)Options参数表示对数据库请求的类型( CommandText),常有四个取值,各项含义如下表7-25所示: • 例子:7-1.asp(向a1.mdb数据库中添加一条新的记录) • 例子:7-2.asp(更改a1.mdb数据库中姓名为“tx”的记录,将其改名为“小陶”。)
7.2.3 Connection对象的方法(4) • 4、BegginTrans,CommitTrans,RollbackTrans方法 • 这3种方法是对ADO进行事务管理。即一次操作中对数据库的多次写操作。 • 事务是一最小的工作单元,不认成功与否都作为一个整体进行工作。当一组语句构成一个事务处理时,如果一个语句没有执行成功,则所有的语句都不成功。因些如果一个事务作为一人整体是成功的,则事务中的每个任务都必须成功。 • 当事务失败时,系统返回到事务开始前的状态 ,并取消所有变化的过程(称“回滚”)。比如:一个事务成功地更新三个表后,在更新第4个表的时候失败,则系统将前三次更新恢复原状,并返回到原始的状态。 • 在打开的事务中进行更改时可确保只能选择进行全部更改或不作任何更改。以上三个方法的作用如下:
7.2.3 Connection对象的方法(5) • BeginTrans:开始新事务; • CommitTrans:保存任何更改并结束当前事务。 • RollbackTrans:取消当前事务中所作的任何更改并结束事务。 • 如例子:shiwu.asp • 5、Cancel方法 • 作用:取消异步操作中还末执行完成的Execute操作和Open操作。语法结构为: • Conn.Cancel() • 此方法允许用户查询非常有用,它提供一个取消按钮,以便当查询的等待时间过长时用户可取消该查询。 Return
表7-25 Options参数可选值 Return
7.2.4 Connection对象的属性(1) • Connection对象的属性控制高层的数据处理,如ADO如何与数据源提供者相连接以及事务如何被执行等。 • 1、CommandTimeout属性与ConnectionTimeout属性 • (1)ConnectionTimeout属性是设置Connection对象的Open方法与数据库连接时的最长等待时间,其属性值为一个长整形变量,缺省值为15秒。如果设为0,系统会一直等到连接成功为止。 • (2)CommandTimeout属性是设置Connection对象的Execute方法运行的最长执行时间,其属性值为一个长整形变量,默认值为30秒。若其值为0,系统会一直等到运行结束为止。语法: • Connection.connectiontimeout = seconds • Connection.commandtimeout= seconds
7.2.4 Connection对象的属性(2) • 2、ConnectionString属性 • 作用:用来设置Connection对象的数据库连接信息。使用ConnectionString属性,通过传递包含一系列做好事分隔的argument=value语句的详细连接字符串可指定数据源。 • 如表7-26所示。 ConnectionString属性
7.2.4 Connection对象的属性(3) • 3、Mode属性 • 作用:用来指示Connection中修改数据的可用权限,即可设置或返回当前连接上提供者正在使用的访问权限。它的设置或返回值如表7-27中某个Mode的值。
7.2.4 Connection对象的属性(4) • 4、Provider属性 • 该属性可以用来取得或设置Connection对象的提供者(内定数据库管理程序的名称),默认值为MSDASQL(Microsoft OLE Db Provider For DOBC),它负责管理所有以DOBC连接的数据库,语法: • Connection.Provider = ProviderName • 例子provider.asp是利用此属性来连接现有的数据库。 • 如:显示数据源提供者 <% response.write(cn1.Provider) %>
7.2.4 Connection对象的属性(5) • 5、Version属性 • 此属性是一个只读属性,使用该属性返回ADO执行的版本号,返回字符串值,如:显示ADO版本号 • <% response.write(cn1.version)%> Return
7.3 检索数据RecordSet对象 • Recordset对象负责从数据库中取得所需的记录数据并创建一个记录集合。用户在访问数据库时,一般先通过Connection对象建立与指定数据库的连接,再按所需的要求通过相应的SQL命令从数据库中提取数据创建一个Recordset记录集合,然后即可利用Recordset对象的各种属性和方法对这个记录集合中的数据进行各种操作处理。 • 7.3.1 RecordSet对象的创建 • 7.3.2 RecordSet对象的方法 • 7.3.3 RecordSet对象的属性 • 7.3.4 实例:分布显示数据库表中记录 Return
7.3.1 RecordSet对象的创建(1) • 在使用RecordSet对象之前,必须先创建它,其创建方法有以下两种: • (1)使用Server.CreateObject方法显示地创建RecordSet对象实例,如代码所示: <% ‘创建RecordSet对象实例rs Set rs = Server.CreateObject(“ ADODB.RecordSet”) Rs.Open “数据查询SQL语句”,“数据库ODBC中数据源名称” … %>
7.3.1 RecordSet对象的创建(2) • (2)使用Connection.Execute方法隐式地创建RecordSet对象实例,如下面代码所示: <% Set cn1 = Server.CreateObject(“AODDB.Connection”) Cn1.Open “dsn = q1” Abc = “insert into s(姓名) values(‘tx’)” Set rs = cn1.execute(abc) %> • 如例子:7-3.asp 查询并显示a1.mdb数据库中的记录。
7.3.1 RecordSet对象的创建(3) • 从程序运行结果看,只显示一条数据记录,那么能不能显示数据库中所有的数据呢? • 游标(指针):当打开数据库表时,如果这个表中包含若干个记录,则当前记录指针指向第一个记录。 • 如例子:7-4.asp 查询并显示a1.mdb数据库中的所有记录 Return
7.3.2 RecordSet对象的方法(1) • 可以将RecordSet对象方法分为3类: • 1、打开、关闭和复制方法 • (1)Open方法 • 作用:用来打开指定的数据源,并从中提取Recordset记录集中的数据内容,其语法如下: • Rs.open [Source],[ActiveConnection],[CursorType],[LockType],[Option] • 其中: • (1)参数Source可以是Command对象、SQL语句、表名、存储过程或调用的完整文件路径名。 • (2)ActiveConnection可以是Connection对象名或一个有效的数据源连接字符串。 • (3)CursorType用来确定服务器打开RecordSet时应该使用的游标类型,游标指定了对记录集的操作类型,同时指定了其他用户对一个记录集可以进行的操作。见表7-28所示。
7.3.2 RecordSet对象的方法(2) • (4) 参数LockType用来确定服务器打开RecordSet时应该使用 的锁定类型的值,锁定类型指定了当不止一个用户同时试图(并发)改变一个记录集时数据库的处理方式。见表7-29。 • (5) 参数Options指定了打开记录集的命令字符串的类型。 见表7-30所示。 • (2)Close方法 • 同Connection对象的Close方法用法一样。 • (3)Clone方法 • 作用:创建一个RecordSet对象的完全拷贝。
7.3.2 RecordSet对象的方法(3) • 2、用来在记录集中移动或刷新数据的方法 • (1)MoveFirst方法 • 作用:把RecrodSet记录指针移动到第一条记录。 • (2)MoveLast方法 • 作用:把RecrodSet记录指针移动到最后一条记录。 • (3)MoveNext方法 • 作用:把RecrodSet记录指针向后移动一条记录。 • (4)MovePrevious方法 • 作用:把RecrodSet记录指针向前移动一条记录。
7.3.2 RecordSet对象的方法(4) • (5)Move方法 • 作用:能够在记录集中向前或向后移动给定的记录个数。格式: • Rs.move n,[start] • 其中: • (1)参数n为整数,表示要移动的记录数,这个值可正可负,正代表向前移动,负代表向后移动。 • (2)参数start可以是一个有效的书签或是如下BookmarkEnum常数值之一: • adBookmarkCurrent:默认。从当前记录开始移动; • adBookmarkFirst:从第一条记录开始; • adBookmarkLast:从最后一条记录开始。
7.3.2 RecordSet对象的方法(5) • (6)Requery方法 • 作用:重新发出命令再次检索数据。 • 3、编辑修改数据的方法 Return
表7-28 参数CursorType属性值 Return
表7-29 Locktype属性 Return
图7-30 Option参数 Return
7.3.3 RecordSet对象的属性(1) • RecordSet对象的属性可以分为改下3类: • (1)位置属性:与对象记录集中当前记录位置有关的属性。 • (2)配置属性:用于设置和显示对象记录集的配置属性。 • (3)可视能力属性:决定对象记录集的哪些部分可以被查看。 • 1、CursorType属性 • 作用:用来设置或返回RecordSet对象所使用的光标类型。其取值见表7-28所示。 • 语法:rs.CursorType = CursorTypenum
7.3.3 RecordSet对象的属性(2) • 2、LockType属性 • 作用:指示编辑过程中对记录使用的锁定类型,见表7-29。 • 语法结构: • Rs.LockType = LockTypenum • 3、 RecordCount • 作用:RecordCount属性可确定RecordSet对象中记录的数目,当ADO无法确定记录数时,或者DBMS或游标类型不支持RecordCount,则该属性返回-1,语法如下: • LongInt = RecordSet.RecordCount
7.3.3 RecordSet对象的属性(3) • 4、MaxRecords属性 • 用来设置每次从数据库中取得记录的最大数目。如果为0,表示返回所有的数据。语法: • RecordSet. MaxRecords = LongInt 或 • LongInt = RecordSet. MaxRecords • 4、PageSize属性 • 设置RecordSet对象内每一个逻辑页的记录条数。 语法: RecordSet.PageSize = LongInt 或 LongInt = RecordSet.PageSize • 5、PageCount属性 • 返回RecordSet对象的逻辑页数,即分页时的总页数。 • 语法:LongInt = RecordSet.PageCount
7.3.3 RecordSet对象的属性(4) • 6、AbsolutePage属性 • 取得当前数据游标在RecordSet对象中的绝对页数。 • 语法:LongInt = RecordSet. AbsolutePage • 7、AbsolutePosition属性 • 取得当前数据游标在RecordSet对象中的位置。 • 语法: LongInt = RecordSet. AbsolutePosition • 注意:AbsolutePosition从1开始,并在当前记录为RecordSet中第一条记录时等于1。 • 如:把当前记录设置为第5条记录。 • <% rs.AbsolutePosition = 5 %>
7.3.3 RecordSet对象的属性(5) • 例子:7-5.asp 对a1.mdb中将工资为1200元的记录修改为1500元。(仅修改当前指针指向的第一条记录) • 其中AdCmdText 、AdCmdTable等常量是在一个advobs.inc的特殊文件中定义的。此文件包含ADO使用的所有VBScript常量,一般它位于\Program Files\Common Files\System\ADO目录下。在使用时,将该文件复制到网站所在的目录下,并且在ASP页面中使用INCLUDE命令将该文件包含进来。 • 例子:7-6.asp 删除a1.mdb数据库表中工资为1400元的记录。(仅删除当前指针指向的第一条记录) Return
7.3.4 实例:分布显示数据库表中记录(1) • 利用RecordSet对象相应的属性和方法来实现分页程序设计,分页功能实现的关键知识: • (1)PageSize:每页记录大小; • (2)Absolutepage;光标定位到那一页。比如20条记录,分成两页,每页10条,那么Absolutepage=1,从第1条记录开始;而Absolutepage=2,则从第11条记录开始。 • 首先可以为PageSize属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过RecordCount属性来确定记录的总数;再用记录总数除以Pagesize就可得到所显示的页面总数;最后通过AbsolutePage属性就能完成对指定页的访问。 • 1、下面我们先建一个数据库名字为: pagebook.mdb,其中有一张表为:book表。
7.3.4 实例:分布显示数据库表中记录(2) • 2、程序实现的分页功能如下: • (1)可以选择第一页、下一页、上一页和最后一页等。 • (2)可以在浏览器的地址栏中输入页数。 • (3)可以在一个文本框中输入要到达的页数。 • 3、程序分为以下几个功能模块: • (1)显示图书作息的Show()过程,名字为:go.asp。 • (2)调用Show()过程的字程序为了:page.asp Return
7.4 增强处理能力Command对象 • Command对象是控制对数据库发出的请求信息。 • ADO的Connection对象提供客户端应用程序与数据库之间的连接通道,RecordSet对象用来记录由数据库取得的数据集对象,而Command对象所担任的是整个应用程序系统的“信息传递”角色,它对数据库提出数据查询信息,告诉数据库:“请为我搜索某个表中的数据,搜索某个字段中的数据,搜索的数据应该满足什么条件,把这些符合要求的数据分别存放在RecordSet对象内然后返回到浏览器上。” • 7.4.1 Command对象的创建及工作过程 • 7.4.2 Command对象的属性 • 7.4.3 Command对象的方法 Return
7.4.1 Command对象的创建及工作过程(1) • 1、创始Command对象并连接数据库 • (1)通过隐式创建Connection对象来创建Command对象 <% Set cm = Server.CreateObject(“ADODB.Command”) cm.ActiveConnectin = “DSN=q1;” %> • (2)通过显式创建Connection对象来创建Command对象 <% Set cn = Server.CreateObject(“ADODB.Connection”) cn.Open “DSN=q1;” Set cm = Server.CreateObject(“ADODB.Command”) cm.ActiveConnectin = cn %>
7.4.1 Command对象的创建及工作过程(2) • 2、设置数据库操作字符串 • 使用CommandText属性设置数据库操作字符串,该字符串交由Command对象的Execute方法执行时提交给数据提供者处理。如 <% nm = request.form(“name”) Set cm = Server.CreateObject(“ADODB.RecordSet”) cm.CommandText = “Select * form S where 姓名=‘” & nm & “’” %>
7.4.1 Command对象的创建及工作过程(3) • 3、执行指定的操作 • (1)使用Command对象的Execute方法来执行一个在CommandText属性中已经定义好的查询,可以把执行结果放在一个RecordSet对象中,如: <% Set cn = Server.CreateObject(“ADODB.Connection”) Nm = request.form(“name”) Cn.open “DSN=q1;” Set cm = Server.CreateObject(“ADODB.Command”) cm.ActiveConnection = cn cm.CommandText = “Select * form S where 姓名=‘ & nm & “’” Set rs = cm.Execute() %>
7.4.1 Command对象的创建及工作过程(4) • (2)使用RecordSet对象的Open方法。如: <% Set cn = Server.CreateObject(“ADODB.Connection”) nm = request.form(“name”) Cn.Open “DSN=q1” Set cm = Server.CreateObject(“ADODB.Command”) cm.ActiveConnection = cn cm.CommandText = “Select * form S where 姓名=‘” & nm & “’” Set rs = Server.CreateObject(“ADODB.RecordSet”) rs.Open(cm,cn) %> Return
7.4.2 Command对象的属性(1) • Command对象的属性用来控制对数据源操作的特性。 • 1、ActiveConnection属性 • 指示Command对象的连接信息。可读/写。如: • (1)ActiveConnection属性可以用来表示一个已经存在的Connection对象。 <% Set cn = Server.CreateObject(“ADODB.Connection”) cn.Open “DSN=q1;” Set cm = Server.CreateObject(“ADODB.Command”) cm.ActiveConnection = cn %>
7.4.2 Command对象的属性(2) • (2)ActiveConnection属性也可以表示一个连接字符串。 <% Set cm = Server.CreateObject(“ADODB.Command”) cm.ActiveConnection = “DSN=q1;” %> • 3、CommandText属性 • 该属性包含一个命令文本,如一个SQL语句,存储过程或者是一个表名。所以一般使用Command对象进行数据操作时,SQL语句都是赋值给这个属性的。如: • (1)用SQL语句指名查询信息: <% cm.CommandText = “select * from S” %> • (2)用数据表名指定查询信息: <% cm.CommandText = “S” %>
7.4.2 Command对象的属性(3) • 3、CommandTimeout属性 • 指示在终止尝试和产生错误之前执行命令期间需等待的时间,默认为30秒。 • 允许由于网络拥塞或服务器负载过重情况产生的延迟而取消Execute方法调用。如果在设置的时间内没有执行完命令将产生错误。如果该属性值设置为0,则ADO将无限期等待直到命令执行完毕。 • 4、CommandType属性 • 指示Command对象所执行命令的类型,优化数据提供者的速度。语法格式为: • Cm.commandType = CommandTypeNum • 如表7-33所示。如下例子: