Transcript Document

第10章 数据库访问
主要内容
• 几乎所有的基于Web的应用程序都使用到
数据库,本章主要讨论
–与数据库有关的技术
–SQL语言中的常用语句
–通过ADO使用数据库
–通过ADO中的记录集使用数据库
10.1
10.2
10.3
10.4
本章目录
网站数据库技术概述
设置ODBC数据源
使用SQL语言
通过ADO使用数据库
例1:显示通讯录中全部记录
例2:插入一条静态记录
例3:将表单中的输入插入到
数据表中
本章小结
习题
例4:删除满足条件的记录
例5:通过选择来删除记录
例6:更改某一记录
例7:通过表单输入修改内容
10.5 通过记录集对象使用数据库
例8:记录的显示和添加
例9:修改数据
例10:成批修改记录
例11:删除数据
例12:分页显示记录
10.1 网站数据库技术概述
•数据库是存放大量用户信息的场所,几乎
所有的基于Web的应用程序都使用到数据库,
通过网页形式访问数据库也是本课程中必
不可少的内容。
•这里介绍CGI,IDC,ASP中与数据库有关的
技术
CGI程序与数据库
• 在使用VB编写的CGI程序中,可以使用
DAO和RDO提供的对象,直接打开数据库
并创建记录集,形式如下:
set DB=OpenDatabase(“数据库文件路径”)
set rs=DB.OpenRecordSet(“数据库中的表名”)
• 由于使用实际的文件路径,应用程序和
数据的提供者密切相关。
参考:网页中使用CGI程序例
IDC技术与数据库
• 引入IDC(Internet Database Connector)
之后,人们使用IDC技术,在ODBC(开放
式数据库连接)的支持下,通过执行SQL
(结构化查询语言)语句,完成对数据库
记录的查询、添加、更新和删除操作,并
通过模板文件来规定结果的输出形式。
IDC技术与数据库
• 使用IDC技术,可以方便地完成数据库应
用系统的编程,应用程序和数据提供者无
关。
• 但IDC技术的缺点是交互性较差。
参考:网页中使用IDC技术例
ASP中的数据库
• ADO(ActiveX Data Objects)是一组接
口,它通过系统级编程接口OLE DB,提供
了一个应用程序级的数据访问对象,它易
于使用,与编程语言无关,与提供者无关,
它通过ODBC支持,可以访问几乎所有类
型的数据库。
ASP中的数据库
• 当ASP脚本中需要访问数据库时,可以
创建ADO数据对象,再通过在数据对象上
执行SQL语句,来操作数据库,或者通过
进一步创建功能强大的记录集对象,通过
记录集对象上的有关方法,方便、灵活地
操作数据库中的数据。最后得到的结果可
以组织成html文档发送到客户端。
ASP中的数据库
• 在ASP中访问数据库,需要掌握以下有
关内容:
–数据库及数据表的建立
–ODBC数据源的设置方法
– SQL语句编写
–ADO数据对象的创建和操作
–记录集对象的创建和操作
–数据的组织与输出
10.2 设置ODBC数据源
• 通过设置ODBC数据源,ASP脚本程序可
以用统一的方式使用各种不同类型的数
据库。这样,当数据库环境发生变化时,
只需简单地重新设置ODBC数据源,就可
以在新的数据库环境下使用了。应用程
序几乎不要作任何改动。
10.2 设置ODBC数据源
• ODBC实质上只是一个中间软件,它能够
将通用的SQL语句转换为对某种数据库
的具体操作。
• 要设置ODBC数据源,可通过系统的控制
面板来实现,具体操作步骤如下:
打开控制面板
• 单击开始、设置、控制面板显示如图:
10.2 设置ODBC数据源
注意:Windows2000中设置ODBC数据源在
控制面板中的管理工具下进行:
10.2 设置ODBC数据源
双击ODBC
数据源
(32bit)图
标,出现
如图所示。
10.2 设置ODBC数据源
为确保计算
机的所有用
户都能访问
新的ODBC
数据源,选
择系统DSN
有。
10.2 设置ODBC数据源
(3) 单击添
加,创建
一个新的
数据源。
创建一个新的数据源
• 出现如下图:
ODBC Access 设置窗口
• 单击完成,出现如下图:
命名数据源
• 填写数据源名,如Northwind。并输入需要的
描述(可省):
选择数据库文件
• 通过标准打开文件对话框,选择作为数据源
的数据库文件。
确定设置
• 确定设置,显示如下图:
完成设置
• 完成设置,可看到已设置的数据源:
10.2 设置ODBC数据源
注意:若你刚使用Access数据库环境创
建数据库及表,还没有退出这一环境
时,这步“选取”数据库操作可能会
得到“非法目录”的提示。此时只需
先关闭数据库,并退出Access环境即可。
10.3 使用SQL语言
• SQL(Structured Query Language),结构化
查询语言,用于查询、更新和操作关系
数据库。本节主要讨论SQL的四个基本
语句,即:
–查询(SELECT)
–插入(INSERT)
–删除(DELETE)
–修改(UPDATE)
准备知识
• 在讨论之前,有必要对数据库的基本概
念作一介绍。
(1)
(2)
(3)
(4)
表
记录
索引
数据库
(1) 表
• 表是一种按行与列排列的相关信息的逻
辑组,例如某厂的人事挡案表。
• 表中每一列在数据库中称作一个字段。
表中有什么样的字段,每个字段中可以
存放什么类型数据,这些信息决定了一
个表的基本结构。
(2) 记录
• 在表中,每个工作人员的相关信息都存
放在表的一行中,被称为一个记录。一
个表也就成了一个记录的集合
(RecordSet)
• 一般来说,数据库中表的任意两行都不
能完全相同。
(3) 索引
• 为了更快地访问数据,大多数数据库都
使用索引。
• 数据库表的索引类似于书的目录一样,
它也是一个表,索引表中按照一定的顺
序存放了数据表中经常要查询的一些重
要数据及这些数据对应于表中的位置。
• 对数据库进行查询时,系统可以首先查
找索引表,再根据索引表中的记录位置
找到数据记录。
(4) 数据库
• 通常一个数据库由若干个表构成。或者
说数据库是表的集合。
• 以下分别介绍SQL中的常用语句。
1.查询(SELECT)
• Select语句用于从数据库中获得一些信息,
如从一个表中获得部分记录的部分字段
内容,从多个表中组合形成一个新的记
录集等。
1.查询(SELECT)
•Select语句的一般格式如下:
SELECT [DISTINCT]项目名称表
FROM 表名1[,表名2,… ]
WHERE 条件
GROUP BY 表达式
HAVING 条件
ORDER BY 字段名[DESC|ASC]
1.查询(SELECT)
•其中:
(1) DISTINCT 指出若结果记录集中有重
复记录时,只取其中一条。
例如:为了从基本情况表中了解本单位有
多少种不同的职称,可使用如下查询形式:
SELECT DISTINCT 职称 FROM 基本情况表
其中“基本情况表”是数据库中的一个表
名,而“职称”为该表中的一个字段名。
1.查询(SELECT)
(2) 项目名称表可以由多个项目用逗号分隔,
每个项目可以是字段名或表达式,字段名
前可以指出字段所属的表名。
例如:为了得到基本情况表中的所有记录,形式如下:
SELECT * FROM 基本情况表
例如:为了得到学习情况表中的学号和总分数据:
SELECT 学号,数学+语文+学习情况表.英语AS 总
分 FROM 学习情况表
作为结果记录集
的字段名
1.查询(SELECT)
当选择内容是一个表达式时,后面用AS引
导一个名称,作为结果记录集的字段名。
例如:为了从学习成绩表中得到全部同学的数学
平均分,可使用如下形式:
SELECT AVG(数学) AS 平均分 FROM 学习情
况表
其中:AVG是SQL中可以使用的集合函数
1.查询(SELECT)
项目名称表中常用的集合函数还有COUNT
(求记录条数)、SUM(求和)、MAX
(求最大值)和MIN(求最小值)等。
当需要表示选择全部字段时,用“*”表示。
1.查询(SELECT)
(3) WHERE后的条件可以是简单的关系式,
如:
职称=‘工程师’
也可以是由“AND”、“OR”和“NOT”连接起
来的几个关系式,如:
SELECT 书 名 FROM 书 目 表 WHERE 类 型 = ‘ 文 学 ’
AND 价格>25
1.查询(SELECT)
(4) GROUP BY项可根据某一表达式的值将
记录分组,而HAVING可确定某一组是否满
足条件。
例如:为了从选修课程学生名单表中得到
选修人数大于40的课程号和人数,可使用
如下形式的查询:
SELECT 课程号,COUNT(课程号)AS 人数
FROM 名单 GROUP BY 课程号 HAVING COUNT
(课程号)>=40
1.查询(SELECT)
(5) ORDER BY项用于将结果记录按某一字
段值进行排序输出,ASC选项表示升序,
DESC表示降序。
例如:为了将学习成绩表按数学成绩从高
到低输出,可使用如下形式查询:
SELECT * FROM 学习成绩表 ORDER BY 数学
DESC
1.查询(SELECT)
(6) 除了以上基本格式外,还可以在
SELECT 后面直接跟“TOP n [PERCENT]”来
指出只返回特定数目的记录,或前面一定
百分比的记录。
例如:要从学生基本情况表中返回2000年
入学的前25名学生的姓名,可使用如下形
式:
SELECT 姓 名 TOP 25 FROM
WHERE 入学年份 = 1994
基本情况表
2.插入(INSERT)
• Insert语句用于向表中添加一个或多个记
录。可以将一组值作为一个记录追加到表
中,形式为:
INSERT INTO 表名 [(字段名表)] VALUES (值的列表)
• 其中:
如果“值的列表”中包含了所有字段的值,则格式中
字段名表可以省略。
“字段名表”和“值的列表”中各数据的类型必须保
持一致,个数也要保持一致。
2.插入(INSERT)
• 例如:在只包含姓名和年龄的学生表中
插入一个姓名为“张三”,年龄为23的记
录的形式如下:
INSERT INTO 学生表 VALUES(‘张三’,23)
• 其中字符型常量“张三”用单引号括起
来,数值型常量23不用定界符。如果学生
表中还有其它字段,则上述语句执行时会
产生错误。
2.插入(INSERT)
• 可以将查询的结果插入到一个表中,形
式如下:
INSERT INTO 目标表 [(字段名表)] SELECT
子句部分
3.删除(DELETE)
• Delete语句可从表中删除满足一定条件
的一个记录或一组记录。使用形式如下:
DELETE FROM 表名 WHERE 条件
• 其中,表名指出需要删除一个或多个记
录的数据表名称。该命令一次可能删除多
个记录。
3.删除(DELETE)
•例如:由于老职工的退休,需要从工资表
中删除年龄大于60岁的全部人员,可以使
用如下形式的SQL语句:
DELETE FROM 工资表 WHERE 年龄>=60
3.删除(DELETE)
•注意:
当删除记录之后,不能取消此操作。如果想要
知道哪些记录将被删除,可以首先使用相同条
件的查询观察结果,然后运行删除操作。
随时将数据做备份副本。如果误删除记录,可
以从备份副本中将数据恢复。
4.修改(UPDATE )
•Update命令可以更改指定表中,满足指定
条件的一个或多个记录的某些字段的值。
使用形式如下:
UPDATE 表 名 SET 字 段 = 值 [ , 字 段 = 值 , … ]
WHERE 条件
•其中,表名指出要更改的数据表名,SET
子句后的“字段=值”表示将某个值赋给对
应的字段。WHERE后的条件用来指出被更新
的记录应符合的条件。
4.修改(UPDATE )
• 例如需要为联合王国的一家公司增加10%
的订货量和3%的货运,对应的SQL语句如下:
UPDATE 订货表
SET 订货量 = 订货量 * 1.1,货运 = 货运 * 1.03
WHERE 公司名称 = 'UK'
• 注意:
UPDATE 不生成结果记录集。而且当使用更新
操作更新记录之后,不能取消这次操作。如果
想知道哪些记录将被更新,只能事先用相同条
件的查询操作来观察。
4.修改(UPDATE )
•注意:
–随时注意维护数据的复制备份。如果更新错
了记录,可从备份副本中恢复这些数据。
5.建立数据表和删除数据表
• 可以使用CREATE命令来创建一个新的表
格,其使用形式为:
CREATE TABLE 表 名 ( 字 段 名 数 据 类 型 [ NOT
NULL][,字段名 数据类型[NOT NULL],…])
• 例如:
CREATE TABLE 学 生 ( 学 号 INTEGER, 姓 名
CHAR(8),性别 CHAR(2))
5.建立数据表和删除数据表
• 一旦创建了一个数据表,就可以使用上
面介绍的INSERT命令进行添加数据,以及
用其它命令进行相应的操作。
• 如果一个数据表不再有用了,可以使用
DROP命令来删除这个数据表。其使用格式
为:
DROP TABLE 表名
• 注意:删除表同时也将表中的全部数据
删除,应谨慎使用。
10.4 通过ADO使用数据库
• 应用ADO(ActiveX Data Object)技术实现
网站数据库查询的操作的几个步骤 :
–建立数据库
用任意一种数据库
–在数据库中创建数据表
–建立ODBC数据源(见第2节)
–在脚本中利用ADO对象进行数据库中表的
操作
10.4 通过ADO使用数据库
• 应用ADO进行数据库设计一般有两种方
式,一种是直接在连接对象上执行SQL
语句,完成相应的操作。
• 另一种方式是通过创建功能强大的记录
集对象,再在记录集对象上进行相应的
操作。
10.4 通过ADO使用数据库
• 第一种方式主要用于能使用简单的SQL
语句直接能完成操作的场合,如插入一
条已知数据的记录,删除一些满足简单
条件的记录,对某一记录进行简单的更
改,或单纯显示满足简单条件的记录,
在这种方式下,除了查询操作外,不生
成记录集就能完成所需的操作。本节只
讨论这种方式。
1.打开数据库
• 在使用控制面板建立好ODBC数据源后,
就可以使用“Server.CreateObject”建立一个
数据库连接对象,形式如下:
Set Conn=Server.CreateObject(“ADODB.Connection”)
• 其中:Conn为连接对象变量名,Server
为系统内置的服务器对象。
1.打开数据库
• 通过连接对象的“Open”方法打开数据库,形
式如下:
Conn.Open “DSN=数据源名称;UID=sa;PWD=;”
• 其中:数据源名称即建立ODBC数据源时给出
的名称,如:
Conn.Open “DSN=TXL;UID=sa;PWD=;”
• UID后指出用户标识,sa是Access数据库中的缺
省用户,PWD后面指出用户sa的口令,Access中
用户sa的默认口令为空,所以直接用分号。
1.打开数据库
• 在SQL Server中一般要求为用户sa设置口
令,若设有口令,则在格式中应写出口令。
• 在Access数据库中,当使用缺省的用户sa
时,可以将连接对象的打开操作简写为如
下形式:
连接对象变量名.Open “数据源名称”
• 而对于SQL数据库环境,连接对象的
“Open”方法需要指出完整的参数。
不设置ODBC打开Access数据库
• Set
Conn=Server.CreateObject(“ADODB.Connection
”)
• Conn.open
"Provider=Microsoft.Jet.OLEDB.4.0;Data S
ource=mydb.mdb;User Id=sa;Password=;"
• 其中:mydb.mdb为当前目录中的数据库,
sa为用户名,口令为空。
打开SQL Server数据库
• set
conn=server.createobject("adodb.connection
")
• conn.open
"PROVIDER=MSDASQL;DRIVER={SQL
Server};SERVER=(local);DATABASE=cyq
;UID=sa;PWD=; "
2.执行SQL语句
• 可以通过(上面创建的)连接对象的
“Exceute”方法来执行一条SQL语句,以实
现对数据库的操作,如下所示:
Set RS=Conn.Execute(SQL语句)
• 这里的“SQL语句”可以是任何一条语句,
Conn是已创建并打开的数据库连接对象名。
这条指令建立了一个RecordSet(记录集)对
象RS,通过这一对象,可实现显示数据库
记录内容。
2.执行SQL语句
• 由于除查询操作外不生成结果记录集,
所以对于像删除、修改或插入操作,可以
使用如下形式:
Conn.Execute(SQL语句)
• 即不返回记录集。
3.显示结果
• 刚生成的记录集是自动打开的,记录指
针指向第一条记录,假设记录集变量名
为RS,则可以使用如下各种形式获得数
据:
–RS(“字段名”)===>读取当前记录中指定字段的值
–RS(i)===>当前记录中第i个字段的值
–RS(i).Name ===> 第i个字段的名称(I从0开始)
–RS.Fields.Count ===> 当前记录集的字段总数
3.显示结果
• 显示完当前记录内容后,可使用以下方
式移动记录指针:
–RS.MoveFirst 将数据指针指向第一个记录
–RS.MoveLast 将数据指针指向最后一个记录
–RS.MoveNext 将数据指针指向下一个记录
–RS.MovePrev
将数据指针指向前一个记录
• 使用RS.EOF判别记录是否结束。一般情
况,在开始显示前应首先用它来判别记录
集是否为空。
4.关闭数据库
• 在所有操作和显示结束后,需要使用下
述指令关闭记录集和数据库连接:
– RS.Close
– Conn.Close
注意次序
• 由于Access数据库同时只能维持一个连
接,如果用户不关闭连接,将使其它用
户无法打开它。
5.释放对象
• 可以使用如下形式来释放对象所占的资
源:
– Set RS=nothing
– Set Conn=nothing
使用例子
• 例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 />
使用例子
• 例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>
例1:显示通讯录中全部记录
• 浏览结果
为了得到如图结果,需要完成以下工作:
例1:显示通讯录中全部记录
• 准备工作
–为了测试本例的结果,需要首先通过某种数
据库环境来建立数据库及数据表,数据表
(名为txlb)中包含“姓名”、“性别”、
“出生日期”、“联系电话”和“爱好”五
个字段,出生日期为日期/时间类型,其它
均为文本类型。在表中输入若干个记录,为
便于验证以后各例的结果,输入内容可参照
表10-2中的数据。
例1:显示通讯录中全部记录
• 准备工作
–通过控制面板,设置名为“txl”的系统DNS,
指向建立的数据库。
– 本例代码必须小心输入,任何错误都是致命
的。
– 如果你使用的是Windows 2000操作系统的话,
还要设置使用不是默认的缓冲输出方式。
例1:显示通讯录中全部记录
在Internet信息
服务管理器窗
中,右击默认 在属性对
Web站点,选 话框的主
目录选项
择属性。
卡中单击
配置。
点击测试
在应用程序配置
对话框的应用程
序选项卡中关闭
“启用缓冲”复
选框。
使用例子
• 例2:插入一条静态记录
• 网页内容
关闭
并撤
消连
接
建立连接,并打开
<% Option Explicit
实现插入
Dim objConn, objRS, strQ
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "txl"
strQ = "INSERT INTO txlb(姓名,性别,出生日期,联系电话,
爱好) VALUES "
strQ = strQ & "(' 李 想 ' , ' 女 ' , # 8 9 / 1 1 / 1 8 # , ' 0 5 1 9 3344557','音乐')"
objConn.Execute strQ
在SQL Server数据库中,
objConn.close
改为‘99-11-12’
Set objConn = Nothing
%><html><body>插入完成</body></html>
例2:插入一条静态记录
• 本例作用为:
–在数据表txlb中插入一条已知记录,其中姓
名为“李想”,性别为“女”,出生日期为
“89-11-18”,联系电话为“05193344557”,爱好为“音乐”。
–本例完成后可用上例查看结果。
执行本例
执行上例查看结果
使用例子
• 例3:将表单中的输入插入到数据表中
变量声明
• 网页结构
<% Option Explicit
Dim objConn, objRS, strQ
if request.servervariables("CONTENT_LENGTH")<>0 then
‘获得表单内容,构造SQL语句,实现插入
else
‘显示表单,等待输入
end if
是否有表单输入
%>
例3:将表单中的输入插入到数据表中
建立连接,并打开
• 获得表单内容,构造SQL语句,实现插入
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "txl"
strQ = "INSERT INTO txlb(姓名,性别,出生日期,联系电话,
爱好) VALUES "
构造
strQ = strQ & "('" & request("xm") & "','" &
request("xb") & "',#"
SQL
strQ = strQ & request("csrq") & "#,'" & request("lxdh")
语句
& "','“
strQ = strQ & request("ah") & "')"
objConn.Execute strQ
objConn.close
实现插入
Set objConn = Nothing
%>
关闭并撤消连接
插入完成
例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>
例3:将表单中的输入插入到数据表中
• 浏览结果
注意:表单中输入
内容时不能空缺。
单击测试本例
例3:将表单中的输入插入到数据表中
• 验证本例
为验证本例先用“response.write strQ”代替
“objConn.Execute strQ”,并插入一条
“response.end”,观察生成的SQL语句的正
确性。当你在表单中输入如上图的数据时,
正确的SQL语句应该如下:
INSERT INTO txlb( 姓 名 , 性 别 , 出 生 日 期 , 联 系 电 话 , 爱 好 )
VALUES (‘ 张 三 ’ , ‘ 男 ’ , # 9 0 - 0 3 - 1 2 # , ‘ 0 5 1 9 1234567’,‘胡闹’)
当正常插入后,使用第1个例子的脚本检查添加的正确性。
执行前例查看结果
使用例子
例4:删除一些满足条件的记录
• 网页结构
变量声明
<% Option Explicit
Dim objConn, objRS, strQ
if request.servervariables("CONTENT_LENGTH")<>0 then
‘接受表单输入,完成删除操作
else
‘显示表单,等待输入
判断条件是否
end if%>
已经输入
例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>
例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
关闭并撤消连接
例4:删除一些满足条件的记录
• 获得输入的姓名,形成SQL字符串,实现删除
操作
采用模糊查询
strQ = "DELETE FROM txlb "
strQ = strQ & "WHERE
request.form("xm") & "%' "
objConn.Execute strQ
response.write "删除完成"
姓 名
Like
'%"
&
获取表单中输入
的姓名
例4:删除一些满足条件的记录
• 获得输入的性别和爱好,形成SQL字符串,实
现删除操作
strQ = "DELETE FROM txlb "
strQ = strQ & "WHERE 性别 ='"& request("xb") &"' AND
爱好='"
strQ = strQ & request("ah") & "'"
objConn.Execute strQ
获取表单中输入
response.write "删除完成"
的性别
获取表单中输入
的爱好
例4:删除一些满足条件的记录
• 浏览结果
– 本例中实现了删除姓名中包含某些特定符号的人员,或删除
指定性别并且具有指定爱好的人员。输入形式有如下两种:
单击这里
运行本例
单击这里
查看结果
使用例子
例5:通过选择来删除记录
• 网页结构
获得脚本文件名
建立连接,
并打开
<%
strURL=request.servervariables("SCRIPT_NAME")
set objConn=server.CreateObject("ADODB.Connection")
objConn.open "txl"
if request.servervariables("QUERY_STRING")="" then
‘显示全部记录,并舔加删除该记录的超连接
else
‘删除选择的记录,并提供选择下一个记录的超连接
end if
关闭并撤
objConn.close
没有选定记录时
set objConn=nothing
消连接
%>
例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
关闭并撤
消记录集
例5:通过选择来删除记录
• 删除选择的记录,并提供选择下一个记录的超
连接
执行
删除
操作
sqlstr="delete from txlb where 姓 名 = ' "
&
request("xm") & "'"
objConn.execute(sqlstr)
根据姓名形成SQL语句
response.write "删除完成<br />"
response.write "<a href='" & strURL & "'>继续删除其
它记录</a>"
提供超连接
例5:通过选择来删除记录
• 浏览结果
单击这里
测试本例
使用例子
例6:更改某一记录,将“李梦”的性别改为
“女”,联系电话改为“0519-4373633”。
• 网页内容
建立连接,
并打开
<% Option Explicit
Dim objConn,strQ
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "txl"
strQ = "UPDATE txlb SET 性 别 = ' 女 ' , 联 系 电 话 = ' 0 5 1 9 4373633' WHERE 姓名='李梦'"
objConn.Execute strQ
按指定要求完成对
response.write "更新完成"
表的修改
objConn.close
Set objConn = Nothing%>
关闭并撤消连接
例6:更改某一记录
• 浏览结果
–本例浏览无显示,执行后可通过执行例1来
观察
运行本例
运行例1,观看结果
使用例子
例7:通过表单输入修改内容
建立连接,
并打开
<%
strURL=request.servervariables("SCRIPT_NAME")
set Conn=server.CreateObject("ADODB.Connection")
Conn.open "txl"
if request.servervariables("CONTENT_LENGTH")=0 then
‘显示记录供选择,选择后显示表单供输入新内容
else
‘修改指定记录
end if
是否输入了
conn.close
新内容
set conn=nothing
%>
关闭并撤消连接
例7:通过表单输入修改内容
• 显示记录供选择,选择后显示表单供输入新内
容
if request.servervariables("QUERY_STRING")="" then
‘显示全部记录,并舔加修改该记录的超连接
Else
‘读取所选择记录,作为初始内容显示表单
end if
是否已经指定记录
例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
关闭并撤
消记录集
例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
关闭并撤消记录集
例7:通过表单输入修改内容
• 浏览结果
• 首先显示如图
例7:通过表单输入修改内容
• 浏览结果
• 选择记录后显示如图
例7:通过表单输入修改内容
• 浏览结果
• 最后显示如图
验证本例
10.5 通过记录集对象使用数据库
• 在上一节我们已经讨论了在连接对象上
执行SQL语句完成对数据库的操作。
• 但当这种方法用于完成复杂的操作时,
需要构造一个复杂的SQL语句,非常困
难,容易写错;
• 另一方面,创建的记录集不能直接用于
修改、删除或更新操作,使用不方便。
• 为此,本节讨论第二种方式,创建独立
的记录集对象。
10.5 通过记录集对象使用数据库
• 通过创建记录集进行数据库操作的基本
步骤如下:
1.打开数据库
2.创建记录集对象并打开其实例
3.操作记录集
4.关闭记录集和连接
1.打开数据库
• 在使用ODBC建立好一个数据源后,就可
以使用“Server.CreateObject”建立一个数据
库连接,并通过该连接的“Open”方法打开
该数据库,如下所示:
Set
Conn=Server.CreateObject("
ADODB.Connection")
Conn.Open "DNS_Name"
• 其中,DNS_Name为已经建立的ODBC数
据源名称,如TXL。
2.创建记录集对象并打开其实例
• 通过服务器对象的CreateObject可创建记录集对
象。形式如下:
Set objRS=Server.CreateObject(" ADODB.Recordset")
• 其中:objRS表示记录集变量名,为了方便表示,
以后叙述中也用它表示记录集变量。
ADODB.Recordset表示要创建的是ADODB中的
Recordset对象。
2.创建记录集对象并打开其实例
• 再通过该对象的Open方法来打开一个记录集实例,格
式如下:
objRS.Open 数据源,连接名称,[游标类型],[锁定方式],
[数据源类型]
• 各参数也可通过直接对相应属性的赋值来实现。使用
如下形式:
objRS.Source=数据源
objRS.ActiveConnection=连接名称
objRS.CursorType=游标类型
objRS.LockType=锁定方式
objRS.CursorLocation=游标位置
objRS.Open
2.创建记录集对象并打开其实例
•其中:
(1) 数据源(Source) 可以是一个SQL语句或一个表
的名称,当然也可以是一个Command对象或者一
个存储过程。
( 2 ) 活 动 连 接 ( ActiveConnection) 设 定 一 个
RecordSet对象与哪一个连接对象相关,即创建的
记录集与哪个数据库相关。
2.创建记录集对象并打开其实例
(3) 游标类型(CursorType) 它反映了所需创建的记
录集应具有的操作特性。一般有四种值:
–
–
–
–
adOpenForwardOnly:称为向前游标。
adOpenStatic:称为静态游标。
adOpenDynamic:称为动态游标。
adOpenKeyset:称为关键游标。
游标类型(CursorType)
• adOpenForwardOnly:称为向前游标,即作为
记录指针的游标只能往前移动(向记录号大的方
向)。对于具有这种类型游标的记录集,不能求记
录的总条数和记录的页数。
游标类型(CursorType)
• adOpenStatic:称为静态游标,它能向前或向
后移动,也能求记录的总条数和页数,但和向前
游标一样,具有这种游标的记录集只是原记录集
的静态副本,当其他用户对记录进行修改、删除
或添加时,并不自动地更新这些记录集。
游标类型(CursorType)
• adOpenDynamic:称为动态游标,当其它用户
对记录集进行改变、删除或添加新记录后,能自
动地反映到本记录集中。
游标类型(CursorType)
• adOpenKeyset:称为关键游标,只有当其他用
户对记录集做改变或删除动作时才自动更新本记
录集,而当其它用户做添加新记录操作时不进行
自动更新。
• 其它用户对本用户记录集的影响只有当多个用
户并发访问数据库时才会发生,它对于网页的设
计影响不大。
2.创建记录集对象并打开其实例
(4) LockType指明当打开一个记录集(RecordSet)时,
对编辑中的记录的锁定方式,一旦记录被某一用
户锁定,其它用户就不能同时进行读或写该记录。
该属性一般可以有下述四种取值:
adLockBatchOptimistic:执行成批修改时才锁定记录。
adLockOptimistic:当执行Update方法时,才锁定记
录。
adLockPessimistic:开始编辑数据时就锁定记录。
adLockReadOnly:数据不能改变(缺省值)。
2.创建记录集对象并打开其实例
(5) 记 录 源 类 型 的 两 种 标 识 分 别 为 adCmdTable( 表 ) 和
adCmdText(SQL语句)。
(6) 打开记录集前,通常还需要指定游标所在的位置,
它有两个可选的值,即服务器游标adUesServer和客户端
游标adUseClient。服务器游标包含在数据库中,而客户
端游标包含在OLE DB接口中。
以上各常量名的说明包含在文件“adovbs.inc”中。读者可
以从“Program Files\Common Files\System\ado”中找到该
文件,并把它复制到网页文件所存放的目录中,其后你
可以象例中那样把该文件包含到网页中。
3.操作记录集
• 打开记录集后,可以使用记录集上的有
关方法来操作记录集,主要有:
– AddNew 向一个可更新的RecordSet对象中
增加一条记录。
– Delete 删除一个RecordSet对象的当前记录。
– Update 把对打开的RecordSet对象数据的变
动存储到数据库。
– CancelUpdate 取消对数据表所做的变动。
3.操作记录集
• 另外可以使用赋值的形式改变当前记录
的某一字段值。形式如下:
记录集变量名(“字段名”)=值
• 同样可以用以下方法移动记录指针:
– Move 在RecordSet对象中移动当前记录指针。
–
–
–
–
MoveFirst 移动当前记录指针到记录集的首记录。
MoveLast 移动当前记录指针到记录集的末记录。
MoveNext 移动记录指针到当前记录的下一条记录。
MovePrevious 移动记录指针到当前记录的下一条
记录。
4.关闭记录集和连接
• 使用记录集和连接的关闭方法(Close)可
关闭记录集和连接,形式如下:
记录集变量名.close
连接变量名.close
• 并可同样地释放其所占的资源,形式如
下:
Set 记录集变量名=Nothing
Set 连接变量名=Nothing
使用举例
例8:记录的显示和添加
•网页结构
'变量声明,创建连接和记录集
If (Request.ServerVariables("CONTENT_LENGTH") > 0) Then
‘获取表单数据,并添加到数据表中
End If
'显示数据表中的全部记录
'提供一个输入新记录的表单
例8:记录的显示和添加
• 变量声明,创建连接和记录集
<% @LANGUAGE = VBScript %>
嵌入常量
<% Option Explicit %>
说明文件
<!--#include file="adovbs.inc"-->
<%
建立连接,
Dim objConn,objRS,strOut
并打开
Dim strXM, strDh
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "txl"
Set objRS = Server.CreateObject("ADODB.Recordset")
创建记录集对象
例8:记录的显示和添加
取姓名前
• 获取表单数据,并添加到数据表中40个符号
打开记录集
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
电话
例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.Close
关闭记录集
Else
Response.Write "请提供你的姓名!<br /><br />"
End If
例8:记录的显示和添加
• 显示数据表中的全部记录
设置客户端游标
objRS.CursorLocation = adUseClient
设置向前游标
objRS.CursorType = adOpenForwardOnly
设置记录只读
objRS.LockType = adLockReadOnly
objRS.Open "SELECT * FROM txlb", objConn, , ,
adCmdText
打开记录集
%>
<html><body>
姓名&nbsp; &nbsp;性别&nbsp;出生日期&nbsp;联系
电话&nbsp;&nbsp;爱好<br />
显示标题行
例8:记录的显示和添加
• 显示数据表中的全部记录
显示各个
<%
记录
While Not objRS.EOF
strOut = objRS("姓名") & ": " & objRS("性别") & " " &
objRS("出生日期")
strOut = strOut & " " & objRS("联系电话") & " " &
objRS("爱好")
Response.Write Server.htmlEncode(strOut) & "<br />"
objRS.MoveNext
Wend
关闭和释放记录
集和连接
objRS.close : objConn.close
Set objRS = Nothing : Set objConn = Nothing
例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>
例8:记录的显示和添加
• 本例在执行时首先显示如图所示。
例8:记录的显示和添加
• 当在表单中输入如图的内容后,单击表
单
例8:记录的显示和添加
• 显示形式如图所示。
验证本例
• 可以看出,记录已经添加进去了。
使用举例
例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 />
例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("联系电话")
& "."
修改联系电话
例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 />
例9:修改数据
• 网页内容(续)
重新显示记录内容:<br /><br />
<%
strOut = objRS("姓名") & " " & objRS("联系电
话")
Response.Write Server.htmlEncode(strOut) &
"<br />"
objRS.close : objConn.close
Set objRS = Nothing : Set objConn = Nothing
%>
</body></html>
关闭和释放记录集和连接
例9:修改数据
•
本脚本可连续执行两次,观察不同的结果,
完成后可以用例1中的脚本显示全部记录,本
例代码显示结果如图所示。
执行本例
执行例1
显示全部记录
执行例6
将数据记录还原
使用举例
例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
/>
例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
例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>
例10:成批修改记录
• 本例中,记录的锁定类型设置为成批更新时锁
定,用赋值的形式逐个更改记录,最后用记录集
上的UpdateBatch方法一次性更新数据库。本例浏
览结果如图所示。
执行本例
使用举例
例11:删除数据
• 网页结构
<% Option Explicit%>
<!--#include file="adovbs.inc"-->
<% Dim objConn, objRS, strQ
if request.servervariables("CONTENT_LENGTH")<>0 then
‘删除满足条件的记录
else
‘显示表单,等待输入条件
是否已经
end if%>
输入条件
例11:删除数据
•
删除满足条件的记录
‘创建并打开连接,创建并打开记录集
输入姓名
if request.form("xm")<>"" then
时
‘删除特定姓名的记录
elseif request("xb")<>"" and request("ah")<>"" then
‘删除特定性别并具有特定爱好的记录
else
response.write "没有按要求选择要删除的记录"
end if
输入性别和
‘关闭并撤消记录集,关闭并撤消连接
爱好时
例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
开,选择所有记录
例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 "删除完成"
从后向前
删除记录
例11:删除数据
•
删除特定性别并具有特定爱好的记录
while not (objRS.EOF)
if objRS(" 性 别 " ) = request("xb") and objRS(" 爱 好
")=request("ah") then
objRS.Delete
end if
objRS.MoveNext
wend
response.write "删除完成"
例11:删除数据
•
关闭并撤消记录集,关闭并撤消连接
objRS.close:objConn.close
Set objRS=Nothing:Set objConn = Nothing
例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">
执行例1
</form>
执行本例
观察结果
例11:删除数据
•本例中使用了记录集的以下属性和方法:
(1) Filter属性:对一个RecordSet对象设定过滤条
件以过滤数据。
(2) BOF属性:如果当前记录的位置位于记录集第一
条记录之前时,返回TRUE;否则返回FALSE。
(3) Delete方法:删除一个RecordSet对象的当前记
录。
(4) MovePrevious方法:将记录指针向前移动一条
记录。它和MoveNext方法的移动方向相反。
使用举例
例12:分页显示记录
• 网页基本思路
‘读取表示需要显示的页号(page)
‘创建并打开连接,创建并打开记录集,记录指针定
位到指定位置
‘显示页号
‘显示该页各个记录内容
‘显示前一页和后一页按钮
例12:分页显示记录
• 网页内容
嵌入常量
说明文件
<% Option Explicit %>
<!--#include file="adovbs.inc"-->
读取页号
<%
设每页5行
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"
建立并打
开连接
例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>转到:
定位到指定页
例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
•
例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>
例12:分页显示记录
• 本例浏览结果如图所示
例12:分页显示记录
• 单击下一页后,显示形式如图所示。
执行本例
例12:分页显示记录
• 本例中使用的属性和方法主要有:
(1) AbsolutePage方法:设定当前记录的位置
是在哪一页。
(2) PageCount属性:如果一个记录集分成多
个页,返回在记录集内记录的页数。
(3) PageSize属性:用于设置包含在一个页内
记录的数目。
(4) CatchSize属性:用于指出允许多少条记
录暂存在Catch中。
RecordSet对象的其他属性和方法
(5) RecordCount属性:显示一个RecordSet对
象中的记录总数。
(6) Move方法:在RecordSet对象中移动当前
记录指针。
本章小结
• 本章讨论了作为一个访问数据库的应用
程序所必须实现的一些功能,包括:记
录的显示、添加、删除和修改。由于对
数据库的访问涉及很多细节问题,一有
不慎,就会产生错误,所以,在验证和
实现本章所讨论的例子时,必须十分小
心,特别应该注意,字段的数据类型,
各种对象的名称,SQL语句的格式等问
题。
本章小结
•对数据库的使用方式可以归纳成两种,即
一种是在连接对象上直接执行SQL语句来
操作数据库,另一种是通过创建记录集对
象来操作数据库。前者适合于完成对数据
库的简单操作,而后者提供了强大的操作
功能,并且使用灵活。在实际应用中可结
合使用。
习题
1.例10-7中使用了一个hidden表单域,你
能不使用它完成相同的功能吗?试修改
例10-7中的代码。
2.结合第1章中关于网页中插入表格的内
容,修改本章中的例10-12的代码,让其
把记录内容以表格形式输出。
3.修改例10-1的代码中的SQL语句,让其
输出时按出生日期从小到大排列。
CGI(通用网关接口)
• CGI主要用于接收用户的表单信息,进行
处理后,结果信息以文档的形式发送。
• 可用于编写CGI程序的语言有很多,如C,
VB,Perl等。它的基本原理是,以标准
输入文件形式接收表单信息,再以标准
输出文件形式,输出需向客户发送的文
档信息
• 其特点是,安全性好,但并发的每个访
问各需占用一个进程,并调入多份程序。
CGI(通用网关接口)举例
• 例子中使用VB编写了一个CGI程序,最
后生成了名为klhd1.exe的文件(在子目
录10中,源文件在其中的CGI子目录中)
• 为了让单击以下按钮得到正确的结果,
你需要设置子目录10的安全属性为对
everyone是可写入的。(测试完后请改为
原来的值)
• 另外系统中若没有安装VB的话,这个例
子也不能正确执行。
单击运行例子
Internet Database Connector
• 简称IDC,主要用于对数据库的访问和操
作。
• 实现IDC分成三个部分:
– 网页中调用IDC文件
– 实现数据库查询、插入等操作的IDC文件
– IDC文件输出结果的模板文件
• 另外还需要设置ODBC数据源
• 以下举一例加以说明
在网页中调用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>
IDC文件格式
Datasource:kbcz
Template:kbcx.htx
SQLStatement:
+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%'<>'')
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>
数据源设置过程
数据源设置过程
数据源设置过程
数据源设置过程
数据源设置过程
数据源设置过程
数据源设置过程
数据源设置过程
执行结果
执行结果
执行结果
执行结果
执行结果
执行结果
单击测试本例