随着企业级Intranet 的广泛开发使用,在网页上访问数据库的需求越来越大。但在原始的设计方法下,为了访问数据库数据,人们使用表单和HTML语言所实现的静态网页,缺乏交互性,数据不能根据录入、修改、删除情况随时更新。为了维护更新网页内容,必须不断地重复修改HTML文档,工作量非常繁重。这就提出了如何实现数据库的动态访问的问题。
现今常用的实现动态网页的方法有CGI、ISAPI(NSAPI)、PHP或直接利用脚本语言等。但这些技术都不适合于快速应用开发和技术普及。如CGI,编程实现过于复杂,而且采用页面对应进程的形式,会大量耗量系统资源。而ISAPI、NSAPI技术虽然采用DLL取代线程,提高了系统性能,但需要考虑进程同步且开发复杂,不易掌握。另外采用客户端脚本语言虽也可实现简单的动态交互式页面,但功能有限,并且不同的浏览器对脚本语言的支持不同。因此,在针对企业级Intranet 网站的开发中,需要寻找一种开发相对简单、性能相对较高的技术。微软公司推出的ASP就是针对Web的应用程序开发技术,只需编写几行脚本语句,就可以产生并执行动态、交互式的站点服务器应用程序。
本文根据ASP,结合结构化查询语言SQL,实现了Web环境下对数据库的动态操作。主要包括数据记录的查询、修改、插入和删除等,并提供较为详细的源程序,只需稍作修改,即可应用到自己的网页中去。
一、SQL的简单介绍
SQL语言是目前关系数据库管理系统的一种通用的结构查询语言,众多的数据库管理系统,如ORACLE 、Sybase、 Informix都支持SQL语言,甚至微软也推出了自己的SQL。在进行网络应用程序开发中,我们知道,都要大量使用SQL语句来进行各种数据库的处理。现在ISO已为SQL语言制订出了国际标准。 但需要注意的是,不同的DBMS中的SQL语句语法有可能有细小区别,在开发中应尽可能使用标准格式。
SQL的广泛使用正说明了它的优秀。它是一种非过程化的语言,允许用户在高层的数据结构上工作,即可操作记录集。所有的SQL语句接受集合作为输入,返回集合作为输出。SQL不要求用户指定对数据的存放方法,使用户更易集中精力于要得到的结果。所有的SQL均使用查询优化器,由它决定对指定数据存取的最快速度的手段。用户不需要关心表是否有索引,有什么类型的索引。
在本程序中,我们主要完成的是数据记录的查询、修改、插入和删除,下面先简单介绍一下这四种操作的SQL语法。
(1)查询—SELECT语句
Select <字段名> from <数据表名> where <条件>
在<字段名>中,允许指定一个字段或多个字段,也可用“*”符号代表所有字段;
where 子句指明查询的数据记录的范围,可通过关系操作符把多个条件联接在一起构成复杂条件查询,以可使用in、like、between等实现模糊查询。
如:Select * from 教务处人员情况表 where 职称=”讲师” and 姓名 like “张%”,功能是从教务处人员情况表中,查找职称为讲师且姓张的教师的记录。这里职称、姓名为表中的字段名称。
(2)修改—UPDATE语句
Update <数据表名> set <修改内容> where <条件>
在<修改内容>中,指明欲修改的字段名称和对此字段的新赋值。基本格式为:字段名=”该字段新值”,新值要用引号引起来。多个字段之间要用逗号分隔。
如:Update 教务处人员情况表 set 职称=”讲师”,军衔=”上尉” where 姓名=”张建安”,功能是找到姓名为张建安的记录,把职称修改为讲师,军衔修改为上尉。
(3)插入—INSERT语句
Insert into <数据库表名><(需赋值的字段名称)> value (对应字段的值)
如有多个字段,字段之间及字段值之间需用逗号分隔,各字段值使用引号引起来。如包含全部字段,此时可省略字段名称部分。
如:insert into 教务处人员情况表(姓名,年龄,性别) value(“张建安”,”28”,”男”),功能是插入一条新记录,此记录姓名为张建安,年龄为28,性别为男。
(4)删除—DELETE语句
Delete from <数据表名> where <条件>
二、ASP的简单介绍
ASP是WWW服务器端的脚本运行环境,一个ASP文件实际就是嵌入可执行脚本HTML文档,以 .ASP为扩展名,将HTML语言、脚本语言和 ActiveX控件组合起来。ASP属于ActiveX技术中服务器端的技术,服务器端根据ASP源程序,不需编译,直接在脚本语言引擎的解释下运行,并把动态生成的WWW页面传送到客户端浏览器。如果脚本中含有访问数据库的请求,则通过ODBC连结后台数据库,由数据库访问组件ADO执行访问数据库操作。最后,ASP依据访库的结果集自动生成标准的HTML页面发送到客户器浏览。ASP自身提供了VBScript 和Jscript驱动,其中VBScript 是缺省的脚本语言。在ASP文件中,脚本命令语句必须包含在“<% %>”之中,也可用Include 命令在某处引入另一份文件的内容作为该文件的一部分,以省去在许多页面编写相同段落的重复工作。
ASP 和其他开发方法相比,主要有如下优点:
l 简易性:不需要编译或链接即可执行。可以使用普通的文本编辑器设计;
多语言性:由于ASP仅是一种开发环境而非一种语言,因此只要WWW服务器端中安装了相应的脚本引擎,就可使用任何一种脚本语言。且ASP中已安装了VBScript 、JScript引擎;
l 与浏览器无关性:用户端只要使用常规的可执行HTML代码的浏览器,即可浏览ASP所设计的网页内容,而脚本语言只在站点的服务器端执行,用户浏览器不需执行这些脚本语言;
l 面向对象性和可扩充性:ASP采用了面向对象的设计方法,并且提供的多个内置对象供用户使用。ASP脚本中可以方便地引用系统控件和ASP的内置控件,还能够通过插入ActiveX服务器控件来扩充其功能。而ActiveX控件可使用各种语言开发工具进行开发。
l 安全性:ASP的源程序代码,不会传到用户的浏览器,用户端看到的仅仅是执行结果的HTML代码。因此可以避免自己设计的程序代码不会被剽窃,也提高了系统的安全性;
ASP 的内置对象和应用组件
ASP提供了5个内置对象和5个内置服务器组件,不需要编写复杂程序段,就可以直接使用这些功能强大组件和对象。这五个内置对象是:
1、Request对象:从客户端用户(Web页面)读取信息,有两种方式。其一是读取附带在网址后面的参数;其二是读取HTML输入表单FORM 里的关键字段内容,如语句Request.Form(“name”)可以取得用户填在文本框name 里的内容。在本程序中,主要使用第二种方式接收用户界面信息。(在第二种方式情况下要与<Form></Form>搭配,可参看有关HTML说明书。)(见后程序)
2、 Response 对象:将信息送给客户端用户,Response 的write方法可以直接向HTML文档插入字符串,其格式为:Response.Write数据,如语句Response.Write Now,向浏览器输出了当前时间;Response还提供了控制流程的方法: Response.Redirect 网址,将当前网页转到另一个网页;Response.End则中止当前的ASP处理。在本程序中,使用Redirect来控制WEB 之间的调用关系。(见后程序)
3、Server对象:提供Web服务器工具。 Server对象有2个重要方法: MapPath和 CreateObject。MapPath用来将Web Server的虚拟路径还原成实际路径。 CreateObject 用来产生服务器组件的对象实例,服务器组件可以连接服务器数据库、使用网络功能或访问服务器文件系统。要调用服务器组件,必须先产生组件对象实例,即Server.CreateObject(ObjectID),其中ObjectID指定了组件标识,它可以是各种形式的可执行程序,组件产生后,就可以使用它的方法和属性进行工作。
4、 Session 对象:存储在一次会话(Session)期间的用户信息,仅被该用户访问。 Session对象最主要的用途是提供某一次连结所有网页之间的公用信息,可以实现多个应用程序间的公用变量的值的传递。在本程序中,使用了多个Session对象,如 Session(“table”)在各个网页间传递了数据表名,而Session(“sql”)用来在各个网页间传递由上一步所得出的SQL语句,以最后生成可执行SQL语句。
5、Application对象:管理所有的会话信息,供所有用户共享。
ASP提供了5个内置服务器组件:
l 数据库访问组件
l 旋转看板组件
l 浏览器兼容组件
l 文件访问组件
l 文件超链接组件
在本程序中,我们关心的是数据库访问组件ADO DB及其应用方法,在后续程序我们会看到实例。
三、ASP与SQL结合操作数据库
ASP通过ActiveX控件ADO与ODBC对话,实现同数据库的连接。对于任何一种DBMS,只要安装了相应的ODBC驱动程序,均可与ASP相连。ADO是系统提供的用于访问后台数据库的控件,它运行于服务器端,提供数据库信息的页面内容,通过执行SQL命令,可以在浏览器上动态地查询(Select)、修改(Update)、删除(Delete From)和插入(Insert into)数据库的记录信息。在ASP中,ADO可以看作是一个服务器控件,应用其中的各种属性的对象,即可轻松完成对数据库复杂的操作。
实现ASP动态数据库操作主要有以下几步:
(1)设置数据库源名(DSN)
在Windows 9X或Windows NT系统中,运行“控制面板//ODBC数据源管理器”,按提示添加“系统DSN”即可;
(2)创建数据库连接(Connection)
Set Conn=Server.CreateObject(“ADODB.Connection”)
(3)调用Open方法打开数据库
如:Conn.Open “数据源名称”
(4)创建数据对象(数据集)
如:Set rs=Conn.Execute(“SQL语句”)
(5)数据库操作
(6)关闭数据对象和连接。
Rs.close
Conn.close
Set Conn=Nothing
五、程序实例
下面给出了一个在Windows NT 服务器基础上构建的Intranet网络中,几个ASP程序的源文件,结合SQL语句,可以实现对教学信息数据库的动态操作,包括查询、录入、修改及删除。从此例程中,可看到SQL结合ASP后的强大功能,而实现却很简单。
为简单起见,数据库采用微软ACCESS数据库,文件名为“mybase.mdb”,内含一个表,名称为“教务处人员情况表”。
下面是各程序之间的调用关系
Conditionselsec.asp
查询条件输入 |
Conditionupdate.asp
修改值及修改条件 |
Conditioninsert.asp
新记录值输入 |
Conditiondelete.asp
删除条件输入 |
Operatebrowse.asp
执行SQL后结果 |
1、 选择SQL语句操作类型 operate.asp (节选)
用Request接受用户选择信息,根据用户不同的选择,生成对应的SQL语句头,并保存在公共变量Session(“sql”)中,以便通过后续处理生成完整的SQL语句。另一个公共变量Session(“table”),存放表名,这样处理程序通用性要强一些。
<%session("opt")=request("operatetype")
if session("opt")<>"" then
if session("opt")="select" then
session("sql")="select * from "&session("table")&" where true "
response.redirect "conditionselect.asp"
end if
if session("opt")="insert" then
session("sql")="insert into "&session("table")&" values( "
response.redirect "conditioninsert.asp"
end if
if session("opt")="delete" then
session("sql")="delete from "&session("table")&" where true "
response.redirect "conditiondelete.asp"
end if
if session("opt")="update" then
session("sql")="update "&session("table")&" "
response.redirect "conditionupdate.asp"
end if
end if%>
<%session("table")="教务处人员情况表"%>
下面一段程序生成一个下拉式列表框和一个提交按钮,注意,第一个选项为空,这在后续程序的条件输入情况下特别重要,因为条件中可能不需此字段的值。
<form action="operate.asp" method="GET">
<table align="center"><tr>
<td align="right">请选择操作类型</td>
<td><select name="Operatetype" size="1">
<option value></option>
<option value="select">浏览数据库</option>
<option value="insert">插入新记录</option>
<option value="delete">删除指定记录</option>
<option value="update">修改指定记录</option>
</select></td></tr></table>
<div align="center"><center><p><input type="submit" value="确定">
</p></center></div></form>
下面是运行页面图
根据不同的选择项,第二步会进入不同的页面,或输入条件,或输入新值,或输入修改值。
2、 新记录值输入 conditioninsert.asp(节选)
在此页面下,输入新记录的值,生成完整的SQL语句并执行,执行后自动进入浏览页面。函数equotchange用于把双引号换为单引号。
<%Function equotchange(data)
equotchange="'"&replace(data,"'","''")&"'"
End Function%>
<% name=request("name")
if name="" then name="?"
sex=request("sex")
if sex="" then sex="?"
age=request("age")
if age="" then age="?"
zw=request("zw")
if zw="" then zw="?"
zc=request("zc")
if zc="" then zc="?"
jx=request("jx")
if jx="" then jx="?"
zj=request("zj")
if zj="" then zj="?"
tele=request("tele")
if tele="" then tele="?"
email=request("email")
if email="" then email="?"
BP=request("BP")
if bp="" then bp="?"
sqll=session("sql")
姓名是主关键字,所以必须有值输入,否则不予处理;通过&符号把从operate.asp传送过来的SQL语句头与此页面输入的值结合,生成完整的SQL语句。
if (name<>"")and(name<>"?") then
sqll=sqll&equotchange(name)&","
sqll=sqll&equotchange(sex)&","
sqll=sqll&equotchange(age)&","
sqll=sqll&equotchange(zw)&","
sqll=sqll&equotchange(zc)&","
sqll=sqll&equotchange(jx)&","
sqll=sqll&equotchange(zj)&","
sqll=sqll&equotchange(tele)&","
sqll=sqll&equotchange(email)&","
sqll=sqll&equotchange(bp)&")"
生成SQL语句后创建数据对象,连接后执行插入操作,执行结束应关闭数据集和数据对象,然后转入浏览程序,杳看是否已插入。
set conn=Server.CreateObject("ADODB.Connection")
conn.Open"Driver={Microsoft Access Driver (*.mdb)};dbq=" &Server.MapPath("mybase.mdb")
conn.execute(sqll)
conn.close
set conn=nothing
response.redirect "operatebrowse.asp"
end if%>
插入值输入页面图
插入后的记录情况
3、 修改指定记录值 conditionupdate.asp(节选)
有两个方面的问题:一方面是如何输入条件,以便找到符合条件的记录进行修改;另一方面是对应记录,应用什么值来更新。为此以表格的形式列为两栏进行处理,左栏用于选择条件,右栏用于指定新值。需要注意的是主关键字的问题,如果符合条件的记录不止一条,在右栏姓名(主关键字)栏内又指定了新值,就会造成错误。另外,为了简化程序,左栏条件只采用了“与”的形式生成总条件,在实际应用中,可根据实际情况,适当Or、Not、Between、Like、(、)等来完成更复杂的条件设置。
部分程序如下:
<%set conn=Server.CreateObject("ADODB.Connection")
conn.Open"Driver={Microsoft Access Driver (*.mdb)};dbq=" &Server.MapPath("mybase.mdb")
sqll="select * from "&session("table")
set rs=conn.Execute(sqll)
上述一小段程序对数据库的操作,目的是取出数据表中各个字段的名称来生成SQL语句,这样做的优点是程序的可维护性强、通用性好。
name=request("name1")
sex=request("sex1")
age=request("age1")
zw=request("zw1")
zc=request("zc1")
jx=request("jx1")
zj=request("zj1")
tele=request("tele1")
email=request("email1")
BP=request("BP1")
从网页上接受用户输入,下面程序段生成SQL语句中的SET字段值部分,函数left( settext,len(settext)-1)用来把SETTEXT字符串中的最后一个逗号去掉。
settext=""
if name<>"" then settext=settext& rs.fields(0).name&"="&epotchange(name)&","
if sex <>"" then settext=settext& rs.fields(1).name&"="&epotchange(sex)&","
if age<>"" then settext=settext& rs.fields(2).name&"="&epotchange(age)&","
if zw<>"" then settext=settext& rs.fields(3).name&"="&epotchange(zw)&","
if zc<>"" then settext=settext& rs.fields(4).name&"="&epotchange(zc)&","
if jx<>"" then settext=settext& rs.fields(5).name&"="&epotchange(jx)&","
if zj<>"" then settext=settext& rs.fields(6).name&"="&epotchange(zj)&","
if tele<>"" then settext=settext& rs.fields(7).name&"="&epotchange(tele)&","
if email<>"" then settext=settext& rs.fields(8).name&"="
&epotchange(email)&","
if bp<>"" then settext=settext& rs.fields(9).name&"="&epotchange(bp)&","
if settext<>"" then
settext=" set "&settext
settext=left( settext,len(settext)-1)
end if
下面接受用户输入,生成SQL语句所需的条件,以指明对哪些记录进行修改。
name=request("name")
sex=request("sex")
age=request("age")
zw=request("zw")
zc=request("zc")
jx=request("jx")
zj=request("zj")
tele=request("tele")
email=request("email")
BP=request("BP")
where=""
if name <>"" then where=where&" and "&rs.fields(0).name&"="&epotchange(name)
if sex <>"" then where=where&" and "&rs.fields(1).name&"="&epotchange(sex)
if age <>"" then where=where&" and "&rs.fields(2).name&"="&epotchange(age)
if zw <>"" then where=where&" and "&rs.fields(3).name&"="&epotchange(zw)
if zc <>"" then where=where&" and "&rs.fields(4).name&"="&epotchange(zc)
if jx <>"" then where=where&" and "&rs.fields(5).name&"="&epotchange(jx)
if zj <>"" then where=where&" and "&rs.fields(6).name&"="&epotchange(zj)
if tele <>"" then where=where&" and "&rs.fields(7).name&"="&epotchange(tele)
if email <>"" then where=where&" and "&rs.fields(8).name&"="
&epotchange(email)
if bp <>"" then where=where&" and "&rs.fields(9).name&"="&epotchange(bp)
if where<>"" then where=" where true "&where
根据条件和修改值生成完整SQL语句,执行后关闭,进入查看页面查看结果。
rs.close
if settext<>"" then
sqll=session("sql")&settext&" "&where
conn.execute(sqll)
conn.close
response.redirect "operatebrowse.asp"
end if%>
下面是修改页面和修改后的结果
4、分页显示的方法 operatebrowse.asp uppage.asp downpage.asp
结果显示进入operatebrowse.asp页面。为实现上一页和下一页的功能,采取了一种较简单的方法,即用uppage.asp处理向上翻页,用downpage.asp处理向下翻页。为保证翻页过程中记录处理的连续性,设置了两个公共变量,变量session(“rs”)传递一个已打开的数据集,而变量session(“line”)传递当前的记录号,以便确定翻页后的记录号。
在程序operatebrowse.asp中,
<% set session("rs")=conn.Execute(sqll)% >建立了公共变量
在程序uppage.asp中,过程Tableprevious用于向上翻页
<%Sub Tableprevious(rs)
dim j
Response.Write "<CENTER><TABLE BORDER=1>"
Response.Write "<TR BGCOLOR=#b0c4de>"
For i=0 to rs.Fields.Count-1
Response.Write "<TD>" & rs.Fields(i).Name & "</TD>"
Next
Response.Write "</TR>"
以上部分画出表头,注意表头项名称直接取自数据库字段名称,下面一小段程序的目的是调整记录指针位置,以便重新定位显示。
session("line")=session("line")-10
rs.movefirst
j=session("line")
while j<>0
j=j-1
rs.movenext
wend
调整好记录指针后,顺序显示五条记录
j=5
While (Not rs.EOF) and (j<>0)
j=j-1
Response.Write "<TR>"
For i=0 to rs.Fields.Count-1
if rs.Fields(i).value<>"" then
Response.Write "<TD>" & rs.Fields(i).Value & "</TD>"
else
Response.Write "<TD>" & "?" & "</TD>"
end if
Next
Response.Write "</TR>"
rs.MoveNext
Wend
Response.Write "</TABLE></CENTER>"
End Sub %>
直接根据传递来的两个公共变量,调用过程完成处理
<% if session("line")>5 then
tableprevious(session("rs"))
session("line")=session("line")+5
end if%>
五、运行调试中应注意的问题
1、SQL语句合格法的检查
调试过程中,对SQL语句可以采取先显示在屏幕上检查,正确后再添加执行功能的方法,逐步进行。如SQL生成后加上一句<%Response.Write session(“sql”)%>进行观察。
2、ASP的运行环境有特殊的要求,
Windows NT Server 4.0 系统下安装IIS 3.0
(PACK 3 版本以上已内置,不须安装)
Windows NT Workstation 系统下安装 PWS 3.0
(PACK 3版本以上已内置)
Windows 9X 系统下安装 PWS
(在安装光盘下,运行 \add-ons\pws\setup.exe)
3、ASP程序的目录要求
程序必须存入 \Inetpub\wwwroot 下或其下的某个子目录下
4、ASP程序的运行和调试
编好程序后,用“预览”方式无法查看结果,也不能用浏览器直接找到此文件查看结果,正确的方法是在浏览器地址栏内键入以下地址:“http://servername/aspname.asp”。其中,servername 是服务器名称,aspname.asp是ASP页面文件名称。如//server/operate.asp。
|