第10章 数据库访问

172

Click here to load reader

description

第10章 数据库访问 . 主要内容 . 几乎所有的基于 Web 的应用程序都使用到数据库, 本章主要讨论 与数据库有关的技术 SQL 语言中的常用语句 通过 ADO 使用数据库 通过 ADO 中的记录集使用数据库. 本章目录. 10.1 网站数据库技术概述. 本章小结. 10.2 设置 ODBC 数据源. 习题. 10.3 使用 SQL 语言. 10.4 通过 ADO 使用数据库 . 例1:显示通讯录中全部记录. 例4:删除满足条件的记录. 例 5: 通过选择来删除记录. 例2:插入一条静态记录 . 例6:更改某一记录. - PowerPoint PPT Presentation

Transcript of 第10章 数据库访问

Page 1: 第10章 数据库访问

第 10章 数据库访问

Page 2: 第10章 数据库访问

主要内容 •几乎所有的基于Web的应用程序都使用到数据库,本章主要讨论

– 与数据库有关的技术 – SQL 语言中的常用语句 – 通过 ADO 使用数据库 – 通过 ADO 中的记录集使用数据库

Page 3: 第10章 数据库访问

本章目录

例 2 :插入一条静态记录 例 1 :显示通讯录中全部记录

10.2 设置 ODBC 数据源

例 3 :将表单中的输入插入到数据表中

10.1 网站数据库技术概述 本章小结 习题10.3 使用 SQL 语言 例 5 :通过选择来删除记录例 6 :更改某一记录例 4 :删除满足条件的记录例 7 :通过表单输入修改内容

例 8 :记录的显示和添加例 9 :修改数据例 10 :成批修改记录

10.4 通过 ADO 使用数据库

10.5 通过记录集对象使用数据库 例 11 :删除数据 例 12 :分页显示记录

Page 4: 第10章 数据库访问

10.1 网站数据库技术概述 •数据库是存放大量用户信息的场所,几乎所有的基于 Web 的应用程序都使用到数据库,通过网页形式访问数据库也是本课程中必不可少的内容。 •这里介绍 CGI,IDC,ASP 中与数据库有关的技术

Page 5: 第10章 数据库访问

CGI 程序与数据库•在使用 VB 编写的 CGI 程序中,可以使

用 DAO 和 RDO 提供的对象,直接打开数据库并创建记录集,形式如下:set DB=OpenDatabase(“ 数据库文件路径” )set rs=DB.OpenRecordSet(“ 数据库中的表名” )

•由于使用实际的文件路径,应用程序和数据的提供者密切相关。 参考:网页中使用 CGI 程序例

Page 6: 第10章 数据库访问

IDC 技术与数据库•引 入 IDC ( Internet Database

Connector )之后,人们使用 IDC 技术,在ODBC (开放式数据库连接)的支持下,通过执行 SQL (结构化查询语言)语句,完成对数据库记录的查询、添加、更新和删除操作,并通过模板文件来规定结果的输出形式。

Page 7: 第10章 数据库访问

IDC 技术与数据库•使用 IDC 技术,可以方便地完成数据库应用系统的编程,应用程序和数据提供者无关。•但 IDC 技术的缺点是交互性较差。

参考:网页中使用 IDC 技术例

Page 8: 第10章 数据库访问

ASP 中的数据库 •ADO ( ActiveX Data Objects )是一组接口,它通过系统级编程接口 OLE DB ,提供了一个应用程序级的数据访问对象,它易于使用,与编程语言无关,与提供者无关,它通过 ODBC 支持,可以访问几乎所有类型的数据库。

Page 9: 第10章 数据库访问

ASP 中的数据库•当 ASP 脚本中需要访问数据库时,可以创建 ADO 数据对象,再通过在数据对象上执行 SQL 语句,来操作数据库,或者通过进一步创建功能强大的记录集对象,通过记录集对象上的有关方法,方便、灵活地操作数据库中的数据。最后得到的结果可以组织成 html 文档发送到客户端。

Page 10: 第10章 数据库访问

ASP 中的数据库•在 ASP 中访问数据库,需要掌握以下有关内容:– 数据库及数据表的建立– ODBC 数据源的设置方法– SQL 语句编写– ADO 数据对象的创建和操作– 记录集对象的创建和操作– 数据的组织与输出

Page 11: 第10章 数据库访问

10.2 设置 ODBC 数据源 • 通过设置 ODBC 数据源, ASP 脚本程序可以用统一的方式使用各种不同类型的数据库。这样,当数据库环境发生变化时,只需简单地重新设置 ODBC 数据源,就可以在新的数据库环境下使用了。应用程序几乎不要作任何改动。

Page 12: 第10章 数据库访问

10.2 设置 ODBC 数据源 • ODBC 实质上只是一个中间软件,它能够将通用的 SQL 语句转换为对某种数据库的具体操作。 • 要设置 ODBC 数据源,可通过系统的控制面板来实现,具体操作步骤如下:

Page 13: 第10章 数据库访问

打开控制面板• 单击开始、设置、控制面板显示如图:

Page 14: 第10章 数据库访问

10.2 设置 ODBC 数据源 注意: Windows2000 中设置 ODBC数据源在控制面板中的管理工具下进行:

Page 15: 第10章 数据库访问

10.2 设置 ODBC 数据源 双击 ODBC 数据源 (3

2bit)图标,出现如图所示。

Page 16: 第10章 数据库访问

10.2 设置 ODBC 数据源 为确保计算机的所有用户都能访问新的 ODBC数据源,选择系统 DSN有。

Page 17: 第10章 数据库访问

10.2 设置 ODBC 数据源 (3) 单击添加,创建一个新的数据源。

Page 18: 第10章 数据库访问

创建一个新的数据源• 出现如下图:

Page 19: 第10章 数据库访问

ODBC Access 设置窗口• 单击完成,出现如下图:

Page 20: 第10章 数据库访问

命名数据源• 填写数据源名,如 Northwind 。并输入需要的描述(可省):

Page 21: 第10章 数据库访问

选择数据库文件• 通过标准打开文件对话框,选择作为数据源的数据库文件。

Page 22: 第10章 数据库访问

确定设置• 确定设置,显示如下图:

Page 23: 第10章 数据库访问

完成设置• 完成设置,可看到已设置的数据源:

Page 24: 第10章 数据库访问

10.2 设置 ODBC 数据源 注意:若你刚使用 Access 数据库环境创建数据库及表,还没有退出这一环境时,这步“选取”数据库操作可能会得到“非法目录”的提示。此时只需先关闭数据库,并退出 Access 环境即可。

Page 25: 第10章 数据库访问

10.3 使用 SQL 语言 • SQL(Structured Query Language) ,结构化查询语言,用于查询、更新和操作关系数据库。本节主要讨论 SQL 的四个基本语句,即:

– 查询 (SELECT)– 插入 (INSERT)– 删除 (DELETE)– 修改 (UPDATE)

Page 26: 第10章 数据库访问

准备知识 • 在讨论之前,有必要对数据库的基本概念作一介绍。 (1) 表 (2) 记录 (3) 索引 (4) 数据库

Page 27: 第10章 数据库访问

(1) 表 • 表是一种按行与列排列的相关信息的逻辑组,例如某厂的人事挡案表。• 表中每一列在数据库中称作一个字段。表中有什么样的字段,每个字段中可以存放什么类型数据,这些信息决定了一个表的基本结构。

Page 28: 第10章 数据库访问

(2) 记录 • 在表中,每个工作人员的相关信息都存放在表的一行中,被称为一个记录。一个表也就成了一个记录的集合

( RecordSet )• 一般来说,数据库中表的任意两行都不能完全相同。

Page 29: 第10章 数据库访问

(3) 索引 • 为了更快地访问数据,大多数数据库都使用索引。• 数据库表的索引类似于书的目录一样,它也是一个表,索引表中按照一定的顺序存放了数据表中经常要查询的一些重要数据及这些数据对应于表中的位置。• 对数据库进行查询时,系统可以首先查找索引表,再根据索引表中的记录位置找到数据记录。

Page 30: 第10章 数据库访问

(4) 数据库• 通常一个数据库由若干个表构成。或者说数据库是表的集合。• 以下分别介绍 SQL 中的常用语句。

Page 31: 第10章 数据库访问

1 .查询 (SELECT) • Select 语句用于从数据库中获得一些信息,如从一个表中获得部分记录的部分字段内容,从多个表中组合形成一个新的记录集等。

Page 32: 第10章 数据库访问

1 .查询 (SELECT) •Select 语句的一般格式如下:

SELECT [DISTINCT]项目名称表FROM 表名 1[ ,表名 2 ,… ]WHERE 条件GROUP BY 表达式HAVING 条件ORDER BY 字段名 [DESC|ASC]

Page 33: 第10章 数据库访问

1 .查询 (SELECT) •其中: (1) DISTINCT 指出若结果记录集中有重复记录时,只取其中一条。例如:为了从基本情况表中了解本单位有多少种不同的职称,可使用如下查询形式:

SELECT DISTINCT 职称 FROM 基本情况表其中“基本情况表”是数据库中的一个表名,而“职称”为该表中的一个字段名。

Page 34: 第10章 数据库访问

1 .查询 (SELECT) (2) 项目名称表可以由多个项目用逗号分隔,每个项目可以是字段名或表达式,字段名前可以指出字段所属的表名。

例如:为了得到基本情况表中的所有记录,形式如下: SELECT * FROM 基本情况表例如:为了得到学习情况表中的学号和总分数据: SELECT 学号,数学 + 语文 +学习情况表 .英语AS 总分 FROM 学习情况表

Page 35: 第10章 数据库访问

1 .查询 (SELECT) 当选择内容是一个表达式时,后面用 AS引导一个名称,作为结果记录集的字段名。例如:为了从学习成绩表中得到全部同学的数学平均分,可使用如下形式:

SELECT AVG( 数学 ) AS 平均分 FROM 学习情况表其中: AVG 是 SQL 中可以使用的集合函数

作为结果记录集的字段名

Page 36: 第10章 数据库访问

1 .查询 (SELECT) 项目 名称表 中 常 用 的 集合函数还有COUNT (求记录条数)、 SUM (求和)、MAX (求最大值)和 MIN (求最小值)等。当需要表示选择全部字段时,用“ *” 表示。

Page 37: 第10章 数据库访问

1 .查询 (SELECT) (3) WHERE 后的条件可以是简单的关系式,如:职称 =‘工程师’也可以是由“ AND” “、 OR” 和“ NOT”连接起来的几个关系式,如:SELECT 书名 FROM 书目表 WHERE 类型 =‘文学’ AND 价格 >25

Page 38: 第10章 数据库访问

1 .查询 (SELECT) (4) GROUP BY 项可根据某一表达式的值将记录分组,而 HAVING 可确定某一组是否满足条件。例如:为了从选修课程学生名单表中得到选修人数大于 40 的课程号和人数,可使用如下形式的查询:

SELECT 课程号, COUNT (课程号) AS 人 数 FROM 名 单 GROUP BY 课 程号 HAVING COUNT (课程号) >=40

Page 39: 第10章 数据库访问

1 .查询 (SELECT) (5) ORDER BY 项用于将结果记录按某一字段值进行排序输出, ASC 选项表示升序,DESC 表示降序。例如:为了将学习成绩表按数学成绩从高到低输出,可使用如下形式查询:

SELECT * FROM 学习成绩表 ORDER BY 数学 DESC

Page 40: 第10章 数据库访问

1 .查询 (SELECT) (6) 除 了 以 上 基 本格式外,还可 以 在SELECT 后 面 直 接 跟 “ TOP n [PERCENT]” 来指出只返回特定数目的记录,或前面一定百分比的记录。 例如:要从学生基本情况表中返回 2000年入学的前 25 名学生的姓名,可使用如下形式:

SELECT 姓名 TOP 25 FROM 基本情况表 WHERE 入学年份 = 1994

Page 41: 第10章 数据库访问

2 .插入 (INSERT) •Insert 语句用于向表中添加一个或多个记录。可以将一组值作为一个记录追加到表中,形式为:

INSERT INTO 表名 [(字段名表 )] VALUES (值的列表 )

•其中:如果“值的列表”中包含了所有字段的值,则格式中字段名表可以省略。“字段名表”和“值的列表”中各数据的类型必须保持一致,个数也要保持一致。

Page 42: 第10章 数据库访问

2 .插入 (INSERT) •例如:在只包含姓名和年龄的学生表中插入一个姓名为“张三”,年龄为 23 的记录的形式如下:INSERT INTO 学生表 VALUES ‘( 张三’, 23 )

•其中字符型常量“张三”用单引号括起来,数值型常量 23 不用定界符。如果学生表中还有其它字段,则上述语句执行时会产生错误。

Page 43: 第10章 数据库访问

2 .插入 (INSERT) •可以将查询的结果插入到一个表中,形式如下:

INSERT INTO 目标表 [(字段名表 )] SELECT 子句部分

Page 44: 第10章 数据库访问

3 .删除 (DELETE) •Delete 语句可从表中删除满足一定条件的一个记录或一组记录。使用形式如下:

DELETE FROM 表名 WHERE 条件•其中,表名指出需要删除一个或多个记录的数据表名称。该命令一次可能删除多个记录。

Page 45: 第10章 数据库访问

3 .删除 (DELETE) •例如:由于老职工的退休,需要从工资表中删除年龄大于 60岁的全部人员,可以使用如下形式的 SQL 语句:

DELETE FROM 工资表 WHERE 年龄 >=60

Page 46: 第10章 数据库访问

3 .删除 (DELETE) •注意:

当删除记录之后,不能取消此操作。如果想要知道哪些记录将被删除,可以首先使用相同条件的查询观察结果,然后运行删除操作。随时将数据做备份副本。如果误删除记录,可以从备份副本中将数据恢复。

Page 47: 第10章 数据库访问

4 .修改 (UPDATE ) •Update命令可以更改指定表中,满足指定条件的一个或多个记录的某些字段的值。使用形式如下:

UPDATE 表名 SET 字段 = 值 [, 字段 = 值 ,…] WHERE 条件 •其 中 , 表 名 指 出 要 更 改 的 数 据 表名, SET子句后的“字段 =值”表示将某个值赋给对应的字段。 WHERE 后的条件用来指出被更新的记录应符合的条件。

Page 48: 第10章 数据库访问

4 .修改 (UPDATE ) •例如需要为联合王国的一家公司增加 10%的订货量和 3%的货运,对应的 SQL 语句如下:

UPDATE 订货表SET 订货量 = 订货量 * 1.1, 货运 = 货运 * 1.03WHERE 公司名称 = 'UK'

•注意: UPDATE 不生成结果记录集。而且当使用更新操作更新记录之后,不能取消这次操作。如果想知道哪些记录将被更新,只能事先用相同条件的查询操作来观察。

Page 49: 第10章 数据库访问

4 .修改 (UPDATE ) •注意:

–随时注意维护数据的复制备份。如果更新错了记录,可从备份副本中恢复这些数据。

Page 50: 第10章 数据库访问

5 .建立数据表和删除数据表 •可以使用 CREATE命令来创建一个新的表格,其使用形式为:

CREATE TABLE 表 名 ( 字段名 数 据 类 型 [NOT NULL][ ,字段名 数据类型 [NOT NULL] ,… ])

•例如:CREATE TABLE 学生 ( 学号 INTEGER ,姓名

CHAR(8) ,性别 CHAR(2))

Page 51: 第10章 数据库访问

5 .建立数据表和删除数据表 •一旦创建了一个数据表,就可以使用上面介绍的 INSERT命令进行添加数据,以及用其它命令进行相应的操作。•如果一个数据表不再有用了,可以使用

DROP命令来删除这个数据表。其使用格式为:DROP TABLE 表名

•注意:删除表同时也将表中的全部数据删除,应谨慎使用。

Page 52: 第10章 数据库访问

10.4 通过 ADO 使用数据库 • 应用 ADO(ActiveX Data Object) 技术实现网站数据库查询的操作的几个步骤 :

– 建立数据库– 在数据库中创建数据表– 建立 ODBC 数据源(见第 2节)– 在脚本中利用 ADO 对象进行数据库中表的操作

用任意一种数据库

Page 53: 第10章 数据库访问

10.4 通过 ADO 使用数据库 • 应用 ADO 进行数据库设计一般有两种方式,一种是直接在连接对象上执行 SQL语句,完成相应的操作。•另一种方式是通过创建功能强大的记录集对象,再在记录集对象上进行相应的操作。

Page 54: 第10章 数据库访问

10.4 通过 ADO 使用数据库 •第一种方式主要用于能使用简单的 SQL语句直接能完成操作的场合,如插入一条已知数据的记录,删除一些满足简单条件的记录,对某一记录进行简单的更改,或单纯显示满足简单条件的记录,在这种方式下,除了查询操作外,不生成记录集就能完成所需的操作。本节只讨论这种方式。

Page 55: 第10章 数据库访问

1 .打开数据库 •在使用控制面板建立好 ODBC 数据源后,就可以使用“ Server.CreateObject” 建立一个数据库连接对象,形式如下:

Set Conn=Server.CreateObject(“ADODB.Connection”)

•其 中 : Conn 为 连 接 对 象 变 量名, Server 为系统内置的服务器对象。

Page 56: 第10章 数据库访问

1 .打开数据库 •通过连接对象的“ Open” 方法打开数据库,形式如下:

Conn.Open “DSN= 数据源名称; UID=sa ; PWD= ”;

•其中:数据源名称即建立 ODBC 数据源时给出的名称,如: Conn.Open “DSN=TXL;UID=sa;PWD=;”

•UID 后指出用户标识, sa 是 Access 数据库中的缺省用户, PWD 后面指出用户 sa 的口令, Access 中用户 sa 的默认口令为空,所以直接用分号。

Page 57: 第10章 数据库访问

1 .打开数据库 •在 SQL Server 中一般要求为用户 sa 设置口令,若设有口令,则在格式中应写出口令。•在 Access 数据库中,当使用缺省的用户 sa时,可以将连接对象的打开操作简写为如下形式:

连接对象变量名 .Open “ 数据源名称”•而对于 SQL 数据库环境,连接对象的“ Open”方法需要指出完整的参数。

Page 58: 第10章 数据库访问

不设置 ODBC 打开 Access 数据库• Set

Conn=Server.CreateObject(“ADODB.Connection”)

• Conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;User Id=sa;Password=;" 

• 其中 :mydb.mdb 为当前目录中的数据库,sa 为用户名,口令为空。

Page 59: 第10章 数据库访问

打开 SQL Server 数据库• set

conn=server.createobject("adodb.connection")

• conn.open "PROVIDER=MSDASQL;DRIVER={SQL Server};SERVER=(local);DATABASE=cyq;UID=sa;PWD=; "

Page 60: 第10章 数据库访问

2 .执行 SQL 语句 •可 以 通 过 ( 上 面 创 建 的 ) 连 接 对 象的“ Exceute” 方法来执行一条 SQL 语句,以实现对数据库的操作,如下所示:

Set RS=Conn.Execute(SQL 语句 )•这里的“ SQL 语句”可以是任何一条语句, Conn 是已创建并打开的数据库连接对象名。这条指令建立了一个 RecordSet( 记录集 ) 对象 RS ,通过这一对象,可实现显示数据库记录内容。

Page 61: 第10章 数据库访问

2 .执行 SQL 语句 •由于除查询操作外不生成结果记录集,所以对于像删除、修改或插入操作,可以使用如下形式:

Conn.Execute(SQL 语句 )•即不返回记录集。

Page 62: 第10章 数据库访问

3 .显示结果 •刚生成的记录集是自动打开的,记录指针指向第一条记录,假设记录集变量名为

RS ,则可以使用如下各种形式获得数据:– RS(“字段名” )===> 读取当前记录中指定字段的值 – RS(i)===> 当前记录中第 i个字段的值– RS(i).Name ===> 第 i个字段的名称 (I 从 0 开始)– RS.Fields.Count ===> 当前记录集的字段总数

Page 63: 第10章 数据库访问

3 .显示结果 •显示完当前记录内容后,可使用以下方式移动记录指针:–RS.MoveFirst 将数据指针指向第一个记录–RS.MoveLast 将数据指针指向最后一个记录–RS.MoveNext 将数据指针指向下一个记录–RS.MovePrev 将数据指针指向前一个记录

•使用 RS.EOF判别记录是否结束。一般情况,在开始显示前应首先用它来判别记录集是否为空。

Page 64: 第10章 数据库访问

4 .关闭数据库 • 在所有操作和显示结束后,需要使用下述指令关闭记录集和数据库连接:

– RS.Close – Conn.Close

• 由于 Access 数据库同时只能维持一个连接,如果用户不关闭连接,将使其它用户无法打开它。

注意次序

Page 65: 第10章 数据库访问

5 .释放对象 • 可以使用如下形式来释放对象所占的资源:

– Set RS=nothing – Set Conn=nothing

Page 66: 第10章 数据库访问

使用例子 • 例 1 :显示通讯录中全部记录• 网页内容

<% Option Explicit Dim objConn, objRS Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "txl" Set objRS = objConn.Execute("SELECT * FROM txlb")%><html><body>全部人员名单如下 : <br /><br />姓 名 &nbsp; 性 别 &nbsp; 出 生 日 期 &nbsp; 联 系 电 话&nbsp;&nbsp;&nbsp;&nbsp;爱好 <br />

建立连接,并打开

选择全部记录

Page 67: 第10章 数据库访问

使用例子 • 例 1 :显示通讯录中全部记录• 网页内容(续)

<%While Not objRS.EOF Response.Write objRS("姓名 ") & "&nbsp;" & objRS(" 性别 ") & "&nbsp;" Response.Write objRS(" 出 生日期 ") & "&nbsp;" &

objRS("联系电话 ") & "&nbsp;" Response.Write objRS("爱好 ")& "<br />" objRS.MoveNext Wend objRS.close: objConn.close Set objRS = Nothing Set objConn = Nothing%></body></html>

关闭并撤消记录集,关闭并撤消连接

依次显示个记录内容

Page 68: 第10章 数据库访问

例 1 :显示通讯录中全部记录•浏览结果

为了得到如图结果,需要完成以下工作:

Page 69: 第10章 数据库访问

例 1 :显示通讯录中全部记录•准备工作

– 为了测试本例的结果,需要首先通过某种数据库环境来建立数据库及数据表,数据表(名为 txlb) 中包含“姓名”、“性别”、“出生日期”、“联系电话”和“爱好”五个字段,出生日期为日期 / 时间类型,其它均为文本类型。在表中输入若干个记录,为便于验证以后各例的结果,输入内容可参照表 10-2 中的数据。

Page 70: 第10章 数据库访问

例 1 :显示通讯录中全部记录•准备工作

– 通过控制面板,设置名为“ txl”的系统DNS ,指向建立的数据库。

– 本例代码必须小心输入,任何错误都是致命的 。 – 如果你使用的是 Windows 2000 操作系统的话,还要设置使用不是默认的缓冲输出方式。

Page 71: 第10章 数据库访问

在 Internet 信息服务管理器窗中,右击默认 Web站点,选择属性。

例 1 :显示通讯录中全部记录在属性对话框的主目录选项卡中单击配置。

点击测试

在应用程序配置对话框的应用程序选项卡中关闭“启用缓冲”复选框。

Page 72: 第10章 数据库访问

使用例子 • 例 2 :插入一条静态记录 • 网页内容<% Option Explicit

Dim objConn, objRS, strQ Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "txl" strQ = "INSERT INTO txlb(姓名 ,性别 ,出生日期 ,联系电话 ,爱好 ) VALUES " strQ = strQ & "(' 李想 ',' 女 ',#89/11/18#,'0519-3344557',' 音乐 ')" objConn.Execute strQ objConn.close Set objConn = Nothing%><html><body> 插入完成 </body></html>

在 SQL Server 数据库中,改为‘ 99-11-12’

建立连接,并打开

关闭并撤消连接

实现插入

Page 73: 第10章 数据库访问

例 2 :插入一条静态记录• 本例作用为:

– 在数据表 txlb 中插入一条已知记录,其中姓名为“李想”,性别为“女”,出生日期为“ 89-11-18” ,联系电话为“ 0519-3344557” ,爱好为“音乐”。

– 本例完成后可用上例查看结果。执行本例 执行上例查看结果

Page 74: 第10章 数据库访问

使用例子 • 例 3 :将表单中的输入插入到数据表中 • 网页结构

<% Option Explicit Dim objConn, objRS, strQ if request.servervariables("CONTENT_LENGTH")<>0

then ‘获得表单内容,构造 SQL 语句,实现插入 else ‘ 显示表单,等待输入end if%>

是否有表单输入

变量声明

Page 75: 第10章 数据库访问

例 3 :将表单中的输入插入到数据表中• 获得表单内容,构造 SQL 语句,实现插入

Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "txl" strQ = "INSERT INTO txlb(姓名 ,性别 ,出生日期 ,联系电话 ,爱好 ) VALUES " strQ = strQ & "('" & request("xm") & "','" & request("xb") &

"',#" strQ = strQ & request("csrq") & "#,'" & request("lxdh") &

"','“ strQ = strQ & request("ah") & "')" objConn.Execute strQ objConn.close Set objConn = Nothing%>插入完成

构造SQL语句

实现插入

建立连接,并打开

关闭并撤消连接

Page 76: 第10章 数据库访问

例 3 :将表单中的输入插入到数据表中• 显示表单,等待输入

<h2> 添加记录 </h2><hr><form method="POST" action="<

%=request.servervariables("SCRIPT_NAME")%>">姓名: <input type="text" name="xm"><br>性别: <input type="text" name="xb"><br>出生日期 : <input type="text" name="csrq"><br> 联系电话: <input type="text" name="lxdh"><br>爱好: <input type="text" name="ah"><br><input type="submit" value=" 提交 " name="submit"></form>

表单发送到自己

Page 77: 第10章 数据库访问

例 3 :将表单中的输入插入到数据表中•浏览结果

单击测试本例

注意:表单中输入内容时不能空缺。

Page 78: 第10章 数据库访问

例 3 :将表单中的输入插入到数据表中•验证本例

为验证本例先用“ response.write strQ”代替“ objConn.Execute strQ” ,并插入一条“ response.end” ,观察生成的 SQL 语句的正确性。当你在表单中输入如上图的数据时,正确的 SQL 语句应该如下: INSERT INTO txlb( 姓名 ,性别 ,出生日期 , 联系电话 , 爱好 )

VALUES (‘张三’ ,‘男’ ,#90-03-12#,‘0519-1234567’,‘胡闹’ )当正常插入后,使用第 1 个例子的脚本检查添加的正确性。 执行前例查看结果

Page 79: 第10章 数据库访问

使用例子例 4 :删除一些满足条件的记录• 网页结构<% Option ExplicitDim objConn, objRS, strQif request.servervariables("CONTENT_LENGTH")<>0

then ‘ 接受表单输入,完成删除操作 else ‘ 显示表单,等待输入end if%>

变量声明

判断条件是否已经输入

Page 80: 第10章 数据库访问

例 4 :删除一些满足条件的记录• 显示表单,等待输入

<h2> 删除记录 </h2> <hr> <form action="<

%=request.servervariables("SCRIPT_NAME")%>"method="POST" > 姓名: <input type="text" name="xm"><br> 性别: <input type="text" name="xb"><br> 爱好: <input type="text" name="ah"><br> <input type="submit" value=" 提 交 "

name="submit"> </form>

表单发送到自己

Page 81: 第10章 数据库访问

例 4 :删除一些满足条件的记录• 接受表单输入,完成删除操作 Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "txl" strQ = "DELETE FROM txlb " if request.form("xm")<>"" then ‘获得输入的姓名,形成 SQL字符串,实现删除操作 elseif request("xb")<>"" and request("ah")<>"" then ‘获得输入的性别和爱好,形成 SQL字符串,实现删除操作 else ‘ 显示没有按要求选择要删除的记录 end if objConn.close Set objConn = Nothing

表单中输入了姓名

建立连接,并打开

表单中输入了性别和爱好关闭并撤消连接

Page 82: 第10章 数据库访问

例 4 :删除一些满足条件的记录• 获得输入的姓名,形成 SQL字符串,实现删除操作

strQ = "DELETE FROM txlb " strQ = strQ & "WHERE 姓 名 Like '%" &

request.form("xm") & "%' " objConn.Execute strQ response.write " 删除完成 "

采用模糊查询

获取表单中输入的姓名

Page 83: 第10章 数据库访问

例 4 :删除一些满足条件的记录• 获得输入的性别和爱好,形成 SQL字符串,实现删除操作

strQ = "DELETE FROM txlb " strQ = strQ & "WHERE 性别 ='"& request("xb") &"'

AND 爱好 ='" strQ = strQ & request("ah") & "'" objConn.Execute strQ response.write " 删除完成 " 获取表单中输入的性别

获取表单中输入的爱好

Page 84: 第10章 数据库访问

例 4 :删除一些满足条件的记录•浏览结果

– 本例中实现了删除姓名中包含某些特定符号的人员,或删除指定性别并且具有指定爱好的人员。输入形式有如下两种:

单击这里运行本例单击这里查看结果

Page 85: 第10章 数据库访问

使用例子例 5 :通过选择来删除记录• 网页结构<%

strURL=request.servervariables("SCRIPT_NAME")set objConn=server.CreateObject("ADODB.Connection")objConn.open "txl"if request.servervariables("QUERY_STRING")="" then ‘ 显示全部记录,并舔加删除该记录的超连接else ‘ 删除选择的记录,并提供选择下一个记录的超连接end ifobjConn.closeset objConn=nothing%>

获得脚本文件名建立连接,并打开

没有选定记录时关闭并撤消连接

Page 86: 第10章 数据库访问

例 5 :通过选择来删除记录•显示全部记录,并舔加删除该记录的超连接

Set RS= objConn.Execute("SELECT 姓名 ,性别 FROM txlb") do while not RS.EOF response.write "<br />" & RS("姓名 ") & " " & RS(" 性别 ") response.write "<a href='" & strURL & "?xm=" & rs("姓名 ") & "'>删除 </a>" RS.movenext loop RS.close set RS=nothing

获得所有记录

建立超连接

把姓名作为参数关闭并撤消记录集

Page 87: 第10章 数据库访问

例 5 :通过选择来删除记录•删除选择的记录,并提供选择下一个记录的超连接

sqlstr="delete from txlb where 姓 名 ='" & request("xm") & "'" objConn.execute(sqlstr) response.write " 删除完成 <br />" response.write "<a href='" & strURL & "'>继续删除其它记录 </a>"

执行删除操作

根据姓名形成 SQL 语句

提供超连接

Page 88: 第10章 数据库访问

例 5 :通过选择来删除记录•浏览结果

单击这里测试本例

Page 89: 第10章 数据库访问

使用例子例 6 :更改某一记录,将“李梦”的性别改为“女”,联系电话改为“ 0519-4373633” 。 • 网页内容<% Option Explicit

Dim objConn,strQ Set objConn =

Server.CreateObject("ADODB.Connection") objConn.Open "txl" strQ = "UPDATE txlb SET 性别 =' 女 ', 联系电话 ='0519-4373633' WHERE 姓名 =' 李梦 '" objConn.Execute strQ response.write " 更新完成 " objConn.close Set objConn = Nothing%>

建立连接,并打开

按指定要求完成对表的修改关闭并撤消连接

Page 90: 第10章 数据库访问

例 6 :更改某一记录•浏览结果

– 本例浏览无显示,执行后可通过执行例 1 来观察

运行本例 运行例 1 ,观看结果

Page 91: 第10章 数据库访问

使用例子例 7 :通过表单输入修改内容

<%strURL=request.servervariables("SCRIPT_NAME")set Conn=server.CreateObject("ADODB.Connection")Conn.open "txl"if request.servervariables("CONTENT_LENGTH")=0 then ‘显示记录供选择,选择后显示表单供输入新内容else‘修改指定记录end ifconn.closeset conn=nothing%>

建立连接,并打开

是否输入了新内容关闭并撤消连接

Page 92: 第10章 数据库访问

例 7 :通过表单输入修改内容• 显示记录供选择,选择后显示表单供输入新内容

if request.servervariables("QUERY_STRING")="" then ‘ 显示全部记录,并舔加修改该记录的超连接Else ‘读取所选择记录,作为初始内容显示表单 end if

是否已经指定记录

Page 93: 第10章 数据库访问

例 7 :通过表单输入修改内容• 显示全部记录,并舔加修改该记录的超连接

Set RS= Conn.Execute("SELECT 姓名 , 性别 FROM txlb")

response.write "请选择要修改的记录 <br />" do while not RS.EOF response.write "<br />" & RS(" 姓名 ") & " " & RS(" 性别 ") & " "

response.write "<a href='" & strURL & "?xm=" & rs("姓名 ") & "'> 修改 </a>"

RS.movenext loop RS.close set RS=nothing

获得所有记录

建立超连接

把姓名作为参数关闭并撤消记录集

Page 94: 第10章 数据库访问

例 7 :通过表单输入修改内容• 读取所选择记录,作为初始内容显示表单

Set RS=Conn.Execute("SELECT * from txlb where 姓名='"&request("xm") & "'")%> 请输入新的内容 <form action="<%=strURL%>" method="POST"> <input type="hidden" name=xm value=<%=RS(" 姓名 ")%>> 姓名: <%=RS("姓名 ")%><br /> 性别: <input type=text name=xb value=<%=RS(" 性别 ")%>><br /> 联系电话: <input type=text name=lxdh value=<

%=RS("联系电话 ")%>><br /> <input type="submit" value=" 提交 "> <input type="reset" value=" 重填 "> </form><% RS.close: set RS=nothing

获得指定姓名的记录 把姓名作为参数用隐藏对象传送关闭并撤消记录集

Page 95: 第10章 数据库访问

例 7 :通过表单输入修改内容•浏览结果•首先显示如图

Page 96: 第10章 数据库访问

例 7 :通过表单输入修改内容•浏览结果• 选择记录后显示如图

Page 97: 第10章 数据库访问

例 7 :通过表单输入修改内容•浏览结果• 最后显示如图

验证本例

Page 98: 第10章 数据库访问

10.5 通过记录集对象使用数据库 • 在上一节我们已经讨论了在连接对象上执行 SQL 语句完成对数据库的操作。•但当这种方法用于完成复杂的操作时,需要构造一个复杂的 SQL 语句,非常困难,容易写错;•另一方面,创建的记录集不能直接用于修改、删除或更新操作,使用不方便。• 为此,本节讨论第二种方式,创建独立的记录集对象。

Page 99: 第10章 数据库访问

10.5 通过记录集对象使用数据库 • 通过创建记录集进行数据库操作的基本步骤如下:

1.打开数据库 2.创建记录集对象并打开其实例 3.操作记录集 4.关闭记录集和连接

Page 100: 第10章 数据库访问

1.打开数据库 •在使用 ODBC 建立好一个数据源后,就可以使用“ Server.CreateObject” 建立一个数据库连接,并通过该连接的“ Open” 方法打开该数据库,如下所示:

Set Conn=Server.CreateObject(" ADODB.Connection")

Conn.Open "DNS_Name"•其中, DNS_Name 为已经建立的

ODBC 数据源名称,如 TXL 。

Page 101: 第10章 数据库访问

2.创建记录集对象并打开其实例 •通过服务器对象的 CreateObject 可创建记录集对象。形式如下:

Set objRS=Server.CreateObject(" ADODB.Recordset")•其中: objRS 表示记录集变量名,为了方便表示,以后叙述中也用它表示记录集变量。 ADODB.Recordset 表示要创建的是 ADODB中的 Recordset 对象。

Page 102: 第10章 数据库访问

2.创建记录集对象并打开其实例 •再通过该对象的 Open 方法来打开一个记录集实例,格式如下:

objRS.Open 数据源,连接名称, [游标类型 ] , [锁定方式 ] ,[ 数据源类型 ]

•各参数也可通过直接对相应属性的赋值来实现。使用如下形式: objRS.Source= 数据源 objRS.ActiveConnection= 连接名称 objRS.CursorType=游标类型 objRS.LockType=锁定方式 objRS.CursorLocation=游标位置 objRS.Open

Page 103: 第10章 数据库访问

2.创建记录集对象并打开其实例 •其中:(1) 数据源 (Source) 可以是一个 SQL 语句或一个表的名称,当然也可以是一个 Command 对象或者一个存储过程。(2) 活 动 连 接 (ActiveConnection) 设 定 一 个RecordSet 对象与哪一个连接对象相关,即创建的记录集与哪个数据库相关。

Page 104: 第10章 数据库访问

2.创建记录集对象并打开其实例 (3) 游标类型 (CursorType) 它反映了所需创建的记录集应具有的操作特性。一般有四种值:

– adOpenForwardOnly :称为向前游标。 – adOpenStatic :称为静态游标。 – adOpenDynamic :称为动态游标。 – adOpenKeyset :称为关键游标。

Page 105: 第10章 数据库访问

游标类型 (CursorType)•adOpenForwardOnly :称为向前游标,即作为记录指针的游标只能往前移动 (向记录号大的方向 ) 。对于具有这种类型游标的记录集,不能求记录的总条数和记录的页数。

Page 106: 第10章 数据库访问

游标类型 (CursorType)•adOpenStatic :称为静态游标,它能向前或向后移动,也能求记录的总条数和页数,但和向前游标一样,具有这种游标的记录集只是原记录集的静态副本,当其他用户对记录进行修改、删除或添加时,并不自动地更新这些记录集。

Page 107: 第10章 数据库访问

游标类型 (CursorType)•adOpenDynamic :称为动态游标,当其它用户对记录集进行改变、删除或添加新记录后,能自动地反映到本记录集中。

Page 108: 第10章 数据库访问

游标类型 (CursorType)•adOpenKeyset :称为关键游标,只有当其他用户对记录集做改变或删除动作时才自动更新本记录集,而当其它用户做添加新记录操作时不进行自动更新。 •其它用户对本用户记录集的影响只有当多个用户并发访问数据库时才会发生,它对于网页的设计影响不大。

Page 109: 第10章 数据库访问

2.创建记录集对象并打开其实例(4) LockType指明当打开一个记录集 (RecordSet)时,对编辑中的记录的锁定方式,一旦记录被某一用户锁定,其它用户就不能同时进行读或写该记录。该属性一般可以有下述四种取值:

adLockBatchOptimistic :执行成批修改时才锁定记录。adLockOptimistic :当执行 Update 方法时,才锁定记录。adLockPessimistic :开始编辑数据时就锁定记录。adLockReadOnly :数据不能改变 ( 缺省值 ) 。

Page 110: 第10章 数据库访问

2.创建记录集对象并打开其实例(5) 记录源类型的两种标识分别为 adCmdTable( 表 )和 adCmdText(SQL 语句 )。(6) 打开记录集前,通常还需要指定游标所在的位置,它有两个可选的值,即服务器游标 adUesServer 和客户端游标 adUseClient 。服务器游标包含在数据库中,而客户端游标包含在 OLE DB 接口中。以上各常量名的说明包含在文件“ adovbs.inc” 中。读者可以从“ Program Files\Common Files\System\ado”中找到该文件,并把它复制到网页文件所存放的目录中,其后你可以象例中那样把该文件包含到网页中。

Page 111: 第10章 数据库访问

3.操作记录集 •打开记录集后,可以使用记录集上的有关方法来操作记录集,主要有:

– AddNew 向一个可更新的 RecordSet 对象中增加一条记录。– Delete 删除一个 RecordSet 对象的当前记录。– Update 把对打开的 RecordSet 对象数据的变动存储到数据库。– CancelUpdate 取消对数据表所做的变动。

Page 112: 第10章 数据库访问

3.操作记录集 •另外可以使用赋值的形式改变当前记录的某一字段值。形式如下: 记录集变量名 (“字段名” )=值•同样可以用以下方法移动记录指针:

– Move 在 RecordSet 对象中移动当前记录指针。– MoveFirst 移动当前记录指针到记录集的首记录。– MoveLast 移动当前记录指针到记录集的末记录。– MoveNext 移动记录指针到当前记录的下一条记录。– MovePrevious 移动记录指针到当前记录的下一条记录。

Page 113: 第10章 数据库访问

4.关闭记录集和连接• 使用记录集和连接的关闭方法 (Close)可关闭记录集和连接,形式如下:

记录集变量名 .close连接变量名 .close

• 并可同样地释放其所占的资源,形式如下: Set 记录集变量名 =NothingSet 连接变量名 =Nothing

Page 114: 第10章 数据库访问

使用举例例 8 :记录的显示和添加•网页结构

'变量声明,创建连接和记录集If (Request.ServerVariables("CONTENT_LENGTH") > 0) Then

‘获取表单数据,并添加到数据表中End If'显示数据表中的全部记录'提供一个输入新记录的表单

Page 115: 第10章 数据库访问

例 8 :记录的显示和添加• 变量声明,创建连接和记录集<% @LANGUAGE = VBScript %><% Option Explicit %><!--#include file="adovbs.inc"--><%Dim objConn,objRS,strOutDim strXM, strDhSet objConn =

Server.CreateObject("ADODB.Connection")objConn.Open "txl"Set objRS = Server.CreateObject("ADODB.Recordset")

嵌入常量说明文件

创建记录集对象

建立连接,并打开

Page 116: 第10章 数据库访问

例 8 :记录的显示和添加• 获取表单数据,并添加到数据表中

strXM = Left(Trim(Request.Form("xm")),40)If Len(strXM) > 0 Then objRS.CursorLocation = adUseServer objRS.Open "txlb", objConn, adOpenKeyset,

adLockOptimistic, adCmdTable objRS.AddNew objRS("姓名 ") = strXM strDh = Left(Trim(Request.Form("lxdh")),24) If Len(strDh) > 0 Then objRS("联系电话 ") = strDh End If

取姓名前40 个符号

添加记录

打开记录集

保存姓名

保存联系电话

Page 117: 第10章 数据库访问

例 8 :记录的显示和添加• 获取表单数据,并添加到数据表中(续)

If isdate(Request.Form("csrq")) then objRS(" 出生日期 ")=Request.Form("csrq") end if If Request.Form("xb")<>"" then objRS(" 性别 ")=request.Form("xb") If Request.Form("ah")<>"" then objRS(" 爱好 ")=request.form("ah") objRS.Update objRS.CloseElse Response.Write "请提供你的姓名 !<br /><br />"End If

保存出生日期

更新记录集

保存性别

保存爱好关闭记录集

Page 118: 第10章 数据库访问

例 8 :记录的显示和添加• 显示数据表中的全部记录

objRS.CursorLocation = adUseClientobjRS.CursorType = adOpenForwardOnlyobjRS.LockType = adLockReadOnlyobjRS.Open "SELECT * FROM txlb",

objConn, , , adCmdText%><html><body>姓名 &nbsp; &nbsp; 性别 &nbsp; 出生日期 &nbsp;联系电话 &nbsp;&nbsp;爱好<br />

设置客户端游标

打开记录集

设置记录只读

显示标题行

设置向前游标

Page 119: 第10章 数据库访问

例 8 :记录的显示和添加• 显示数据表中的全部记录

<%While Not objRS.EOF strOut = objRS(" 姓名 ") & ": " & objRS(" 性别 ") & " " &

objRS(" 出生日期 ") strOut = strOut & " " & objRS(" 联系电话 ") & " " &

objRS("爱好 ") Response.Write Server.htmlEncode(strOut) & "<br />" objRS.MoveNextWendobjRS.close : objConn.closeSet objRS = Nothing : Set objConn = Nothing

关闭和释放记录集和连接

显示各个记录

Page 120: 第10章 数据库访问

例 8 :记录的显示和添加• 提供一个输入新记录的表单

<br /><HR><FORM ACTION="<%=

Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">姓名: <input type="text" name="xm"><br>性别: <input type="text" name="xb"><br>出生日期 : <input type="text" name="csrq"><br> 联系电话: <input type="text" name="lxdh"><br>爱好: <input type="text" name="ah"><br>

<input type="submit" value=" 提交 " name="submit"></FORM></body></html>

发送到自身

Page 121: 第10章 数据库访问

例 8 :记录的显示和添加• 本例在执行时首先显示如图所示。

Page 122: 第10章 数据库访问

例 8 :记录的显示和添加• 当在表单中输入如图的内容后,单击表单

Page 123: 第10章 数据库访问

例 8 :记录的显示和添加• 显示形式如图所示。

•可以看出,记录已经添加进去了。

验证本例

Page 124: 第10章 数据库访问

使用举例例 9 :修改数据,将“李梦”的联系电话从 7位升至 8位,规则是在前面加上原来的最高位。 • 网页内容<% Option Explicit %>

<!--#include file="adovbs.inc"--><% Dim objConn, objRS, strOut,lxdh Set objConn =

Server.CreateObject("ADODB.Connection") objConn.Open "txl"%><html><body>脚本改变表中 &quot;李梦 &quot; 的联系电话<br /><br />

嵌入常量说明文件

建立连接,并打开

Page 125: 第10章 数据库访问

例 9 :修改数据• 网页内容(续)

<% Set objRS = Server.CreateObject("ADODB.Recordset") objRS.CursorLocation = adUseServer objRS.CursorType = adOpenForwardOnly objRS.LockType = adLockOptimistic objRS.Open "SELECT * FROM txlb WHERE 姓名 =' 李梦 '", objConn, , , adCmdText lxdh=objRS("联系电话 ") objRS("联系电话 ") = left(lxdh,6) & mid(lxdh,6) Response.Write "联系电话改成了 " & objRS("联系电话 ") & "."

创建记录集对象

打开记录集

修改联系电话

Page 126: 第10章 数据库访问

例 9 :修改数据• 网页内容(续)

if len(objRS("联系电话 "))=13 then objRS.Update Response.Write "<br /> 记录集被更新 .<br />" else objRS.CancelUpdate Response.Write "<br />取消对记录集的更新 .<br />" end if Response.Write " 现在的联系电话是: " & objRS("联系电话 ") & ".<br />" objRS.Requery%><br /><br />

联系电话特殊处理

更新内存

Page 127: 第10章 数据库访问

例 9 :修改数据• 网页内容(续)重新显示记录内容: <br /><br />

<% strOut = objRS(" 姓名 ") & " " & objRS("联系电话 ") Response.Write Server.htmlEncode(strOut) &

"<br />" objRS.close : objConn.close Set objRS = Nothing : Set objConn = Nothing%></body></html> 关闭和释放记录集和连接

Page 128: 第10章 数据库访问

例 9 :修改数据• 本脚本可连续执行两次,观察不同的结果,完成后可以用例 1 中的脚本显示全部记录,本例代码显示结果如图所示。

执行本例执行例 1显示全部记录执行例 6将数据记录还原

Page 129: 第10章 数据库访问

使用举例例 10 :成批修改记录,将所有区号为“ 0519”的联系电话进行升位处理。 • 网页内容

<% Option Explicit %><!--#include file="adovbs.inc"--><% Dim objConn, objRS, strOut,lxdh Set objConn =

Server.CreateObject("ADODB.Connection") objConn.Open "txl"%><html><body>脚 本升级 表 中区号为 &quot;0519&quot; 的联系电话 <br

/><br />

嵌入常量说明文件

建立连接,并打开

Page 130: 第10章 数据库访问

例 10 :成批修改记录• 网页内容(续)

<% Set objRS = Server.CreateObject("ADODB.Recordset") objRS.CursorLocation = adUseServer objRS.CursorType = adOpenKeyset objRS.LockType = adLockBatchOptimistic objRS.Open "SELECT * FROM txlb WHERE 联系电话 LIKE

'0519-%'", objConn, _ , , adCmdText while not(objRS.eof) lxdh=objRS("联系电话 ") objRS("联系电话") = left(lxdh,6) & mid(lxdh,6) objRS.MoveNext Wend

创建记录集对象

打开记录集更改记录内容

Page 131: 第10章 数据库访问

例 10 :成批修改记录• 网页内容(续)

objRS.UpdateBatch Response.Write " 记录集更新完成。 " objRS.Requery%><br /><br /> 重新显示记录内容: <br /><br /><% while not(objRS.EOF) strOut = objRS("姓名 ") & " " & objRS("联系电话 ") Response.Write Server.htmlEncode(strOut) & "<br />" objRS.MoveNext Wend objRS.close : objConn.close Set objRS = Nothing : Set objConn = Nothing%></body></html>

成批更新更新内存

关闭和释放记录集和连接

Page 132: 第10章 数据库访问

例 10 :成批修改记录•本例中,记录的锁定类型设置为成批更新时锁定,用赋值的形式逐个更改记录,最后用记录集上的 UpdateBatch 方法一次性更新数据库。本例浏览结果如图所示。

执行本例

Page 133: 第10章 数据库访问

使用举例例 11 :删除数据 • 网页结构

<% Option Explicit%><!--#include file="adovbs.inc"--><% Dim objConn, objRS, strQif request.servervariables("CONTENT_LENGTH")<>0

then ‘ 删除满足条件的记录else ‘ 显示表单,等待输入条件end if%>

是否已经输入条件

Page 134: 第10章 数据库访问

例 11 :删除数据• 删除满足条件的记录

‘ 创建并打开连接,创建并打开记录集 if request.form("xm")<>"" then ‘ 删除特定姓名的记录 elseif request("xb")<>"" and request("ah")<>"" then ‘ 删除特定性别并具有特定爱好的记录 else response.write "没有按要求选择要删除的记录 " end if ‘ 关闭并撤消记录集,关闭并撤消连接

输入姓名时

输入性别和爱好时

Page 135: 第10章 数据库访问

例 11 :删除数据• 创建并打开连接,创建并打开记录集

Set objConn = Server.CreateObject("ADODB.Connection")

objConn.Open "txl" set

objRS=Server.CreateObject("ADODB.Recordset")

objRS.CursorLocation=adUseServer objRS.CursorType=adOpenDynamic objRS.LockType=adLockOptimistic objRS.open "select * from

txlb",objConn,,,adCmdText

建立连接,并打开

创建记录集对象,并打开,选择所有记录

Page 136: 第10章 数据库访问

例 11 :删除数据• 删除特定姓名的记录

objRS.Filter="姓名 like '%" & request.form("xm") & "%' "

if not objRS.EOF then objRS.MoveLast while not objRS.BOF objRS.Delete objRS.MovePrevious wend response.write " 删除完成 "

设置过滤器

从后向前删除记录

Page 137: 第10章 数据库访问

例 11 :删除数据• 删除特定性别并具有特定爱好的记录

while not (objRS.EOF) if objRS(" 性 别 ")=request("xb") and objRS(" 爱好 ")=request("ah") then objRS.Delete end if objRS.MoveNext wend response.write " 删除完成 "

Page 138: 第10章 数据库访问

例 11 :删除数据• 关闭并撤消记录集,关闭并撤消连接

objRS.close:objConn.close Set objRS=Nothing:Set objConn = Nothing

Page 139: 第10章 数据库访问

例 11 :删除数据• 显示表单,等待输入条件

<h2> 删除记录 </h2> <hr> <form action="<

%=request.servervariables("SCRIPT_NAME")%>" method=POST>

姓名: <input type="text" name="xm"><br> 性别: <input type="text" name="xb"><br> 爱好: <input type="text" name="ah"><br> <input type="submit" value=" 提 交 "

name="submit"> </form>

执行本例执行例 1观察结果

Page 140: 第10章 数据库访问

例 11 :删除数据•本例中使用了记录集的以下属性和方法:

( 1) Filter属性:对一个 RecordSet 对象设定过滤条件以过滤数据。 ( 2) BOF属性:如果当前记录的位置位于记录集第一条记录之前时,返回 TRUE;否则返回 FALSE 。( 3) Delete 方法:删除一个 RecordSet 对象的当前记录。 ( 4) MovePrevious 方法:将记录指针向前移动一条记录。它和 MoveNext 方法的移动方向相反。

Page 141: 第10章 数据库访问

使用举例例 12 :分页显示记录• 网页基本思路‘读取表示需要显示的页号 (page)‘创建并打开连接,创建并打开记录集,记录指针定位到指定位置‘显示页号‘显示该页各个记录内容‘显示前一页和后一页按钮

Page 142: 第10章 数据库访问

例 12 :分页显示记录• 网页内容<% Option Explicit %><!--#include file="adovbs.inc"--><% const PageSize=5 Dim Page, objConn, objRS, strQ,TotalPages, intI,scn scn=request.servervariables("SCRIPT_NAME") If Request("Page")="" Then Page = 1 else Page =

CInt(Request("Page")) Set objConn =

Server.CreateObject("ADODB.Connection") objConn.Open "txl"

嵌入常量说明文件设每页 5行

读取页号

建立并打开连接

Page 143: 第10章 数据库访问

例 12 :分页显示记录• 网页内容

Set objRS = Server.CreateObject("ADODB.Recordset") objRS.CursorLocation = adUseClient objRS.CursorType = adOpenStatic objRS.CacheSize = PageSize objRS.Open "SELECT * FROM txlb ORDER BY 出 生日期 ", objConn, , , adCmdText objRS.PageSize = PageSize TotalPages = objRS.PageCount If Not(objRS.EOF) Then objRS.AbsolutePage = Page%><html><body> 转到:

设置每页行数求页数

建立并打开记录集

定位到指定页

Page 144: 第10章 数据库访问

例 12 :分页显示记录• 网页内容

<% For intI=1 to TotalPages response.write "<a href=" & scn & "?page=" & intI & ">" response.write "第" & intI & " 页 </a>&nbsp&nbsp" & vbcrlf Next response.write "<Hr>姓名 &nbsp; 性别&nbsp; 出生日期 &nbsp;联系电

话 <br />" For intI = 1 to objRS.PageSize If objRS.EOF Then Exit For Response.Write objRS(" 姓名 ") & "&nbsp;" & objRS(" 性别 ") & "&nbsp;" Response.Write objRS(" 出生日期 ") & "&nbsp;" & objRS("联系电话 ") & "<br />" objRS.MoveNext Next

显示当前页各记录

列出页的列表便于快速转移

Page 145: 第10章 数据库访问

例 12 :分页显示记录• 网页内容

objRS.Close : objConn.Close Set objRS = Nothing : Set objConn = Nothing response.write "<hr> 共 " & TotalPages & " 页 , 当前为第 " &

page & " 页 <br>" If Page > 1 Then response.write "<a href=" & scn & "?page="& page-1

&">&lt;&lt; 上一页 </a>" end if If Page < TotalPages Then response.write "<a href=" & scn & "?page=" & page+1 & ">下一页 &gt;&gt;</a>" end if%></body></html>

显示当前位置

关闭和释放记录集和连接

显示前一页按钮

显示下一页按钮

Page 146: 第10章 数据库访问

例 12 :分页显示记录• 本例浏览结果如图所示

Page 147: 第10章 数据库访问

例 12 :分页显示记录• 单击下一页后,显示形式如图所示。

执行本例

Page 148: 第10章 数据库访问

例 12 :分页显示记录• 本例中使用的属性和方法主要有: (1) AbsolutePage 方法:设定当前记录的位置是在哪一页。(2) PageCount 属性:如果一个记录集分成多个页,返回在记录集内记录的页数。(3) PageSize 属性:用于设置包含在一个页内记录的数目。(4) CatchSize属性:用于指出允许多少条记录暂存在 Catch 中。

Page 149: 第10章 数据库访问

RecordSet 对象的其他属性和方法 (5) RecordCount属性:显示一个 RecordSet对象中的记录总数。 (6) Move 方法:在 RecordSet 对象中移动当前记录指针。

Page 150: 第10章 数据库访问

本章小结 • 本章讨论了作为一个访问数据库的应用程序所必须实现的一些功能,包括:记录的显示、添加、删除和修改。由于对数据库的访问涉及很多细节问题,一有不慎,就会产生错误,所以,在验证和实现本章所讨论的例子时,必须十分小心,特别应该注意,字段的数据类型,各种对象的名称, SQL 语句的格式等问题。

Page 151: 第10章 数据库访问

本章小结 •对数据库的使用方式可以归纳成两种,即一种是在连接对象上直接执行 SQL 语句来操作数据库,另一种是通过创建记录集对象来操作数据库。前者适合于完成对数据库的简单操作,而后者提供了强大的操作功能,并且使用灵活。在实际应用中可结合使用。

Page 152: 第10章 数据库访问

习题 1.例 10-7 中使用了一个 hidden 表单域,你能不使用它完成相同的功能吗?试修改例 10-7 中的代码。 2.结合第 1 章中关于网页中插入表格的内容,修改本章中的例 10-12 的代码,让其把记录内容以表格形式输出。 3.修改例 10-1 的代码中的 SQL 语句,让其输出时按出生日期从小到大排列。

Page 153: 第10章 数据库访问

CGI (通用网关接口)• CGI 主要用于接收用户的表单信息,进行处理后,结果信息以文档的形式发送。• 可用于编写 CGI 程序的语言有很多,如

C , VB , Perl等。它的基本原理是,以标准输入文件形式接收表单信息,再以标准输出文件形式,输出需向客户发送的文档信息• 其特点是,安全性好,但并发的每个访问各需占用一个进程,并调入多份程序。

Page 154: 第10章 数据库访问

CGI (通用网关接口)举例• 例子中使用 VB 编写了一个 CGI 程序,最后生成了名为 klhd1.exe 的文件(在子目录

10 中,源文件在其中的 CGI子目录中)• 为了让单击以下按钮得到正确的结果,你需要设置子目录 10 的安全属性为对

everyone 是可写入的。(测试完后请改为原来的值)• 另外系统中若没有安装 VB 的话,这个例子也不能正确执行。

单击运行例子

Page 155: 第10章 数据库访问

Internet Database Connector• 简称 IDC ,主要用于对数据库的访问和操作。• 实现 IDC 分成三个部分:

– 网页中调用 IDC 文件– 实现数据库查询、插入等操作的 IDC 文件– IDC 文件输出结果的模板文件

• 另外还需要设置 ODBC 数据源• 以下举一例加以说明

Page 156: 第10章 数据库访问

在网页中调用 IDC 文件形式<html><body><center><h2> 课务查询 </h2></center><hr><form method="get" action="kbcx.idc">课程名称: <input name="ckmc" type="text" ><br>班 级: <input name="bjmc" type="text" ><br>任课教师: <input name="rkjs" type="text" ><br><input type="submit" name="button1" value="确 认 "></form></body></html>

Page 157: 第10章 数据库访问

IDC 文件格式Datasource:kbczTemplate:kbcx.htxSQLStatement:+SELECT DISTINCT 教师 ,班级 , 课名+FROM kb98+WHERE ('%ckmc%'='' AND '%rkjs%'='' AND '%bjmc%'='')+OR ( 课名 like '%%%ckmc%%%' AND '%ckmc%'<>'')+OR (教师 like '%%%rkjs%%%' AND '%rkjs%'<>'')+OR (班级 like '%bjmc%' AND '%bjmc%'<>'')

Page 158: 第10章 数据库访问

HTX 文件格式<html><body><h2 align="center"><u> 查询结果 </u></h2><table border="1" width="100%"><tr><td width="35%" > 课程名称 </td><td width="30%">班 级 </td><td width="30%" >教师姓名 </td></tr><%begindetail%><tr><td ><% 课名 %></td><td ><%班级 %></td><td ><%教师%></td></tr><%enddetail%></table></body></html>

Page 159: 第10章 数据库访问

数据源设置过程

Page 160: 第10章 数据库访问

数据源设置过程

Page 161: 第10章 数据库访问

数据源设置过程

Page 162: 第10章 数据库访问

数据源设置过程

Page 163: 第10章 数据库访问

数据源设置过程

Page 164: 第10章 数据库访问

数据源设置过程

Page 165: 第10章 数据库访问

数据源设置过程

Page 166: 第10章 数据库访问

数据源设置过程

Page 167: 第10章 数据库访问

执行结果

Page 168: 第10章 数据库访问

执行结果

Page 169: 第10章 数据库访问

执行结果

Page 170: 第10章 数据库访问

执行结果

Page 171: 第10章 数据库访问

执行结果

Page 172: 第10章 数据库访问

执行结果

单击测试本例