ASP与ADO在Web数据库查询中的应用

           

摘要ASP与ADO是一种完全的Web数据库访问解决方案,使用它你可以很容易地对数据库进行访问,本文结合一个实例详细介绍ASP与ADO在网上数据查询中的应用。

  关键词ASP,ADO,WEB服务器,浏览器,数据库

  1.ASP和ADO简介

  ASP(ActiveServerpages)简言之就是一个服务器端的(Server-side)脚本执行环境,你可以用它产生和执行动态的、交互的、高性能的Web服务器应用程序。当脚本在服务器端而不是在客户端执行时,Web服务器将完成包括产生发往浏览器的HTML(HypertextMarkupLanguage)页的所有工作。不必担心浏览器是否能执行你的网页:Web服务器将完成所有的处理工作。

  左图是ASP的工作模式。当浏览器向Web服务器提出(.asp)文件的请求时,一个ASP脚本就开始执行,这时Web服务器调用ASP,把该文件全部读入并执行每一条命令,然后将结果以HTML页面形式送回浏览器。

  ADO(ActiveXDataObject,ActiveX数据对象),是一个ASP内置的ActiveX服务器组件(ActiveXServerComponent)数据库访问组件(DatabaseAccessComponent)提供的技术,你可把它与ASP结合起来,建立提供数据库信息的网页内容,对数据库进行查询、插入、更新、删除等操作。

  要执行ADO,服务器端须安装WindowsNTServer和InternetInformationServer(IIS),而客户端只要有IE或NETSCAPE较新版本的浏览器即可。

  2.站点数据库访问的几种解决方案

  实现Web数据库访问的方法大致可分为两类,一种是以Web服务器作为中介,把浏览器和数据源连接起来,在服务器端执行对数据库的操作;另一种是把应用程序和数据库下载到客户端,在客户端执行对数据库的访问。

  *公共网关接口(CGI,CommonGatewayInterface)

  当浏览器发出HTTPRequest.form请求时,Web服务器执行相应的应用程序,访问站点数据库,并将查询结果以HTML格式送回到浏览器。这种方式有很多缺点,功能有限、开发困难,且不具备事物处(Transaction)理功能,这在很大程度上限制了它的应用。

  *Internet数据库连接器(IDC,InternetDatabaseConnector)

  这是一种简易方案,对数据库的操作仍然放在Web端,但你可以通过SQL(StructuredQueryLanguage)语句对数据库进行查询、输入、更新、删除等操作。IDC设计简易,可不用编译直接执行,并且支持对数据的多重查询(MultipleQuery)。

  *先进数据库连接器(ADC,AdvancedDataConnector)

  前两种方案中对数据库的操作都是在服务器端进行的,而ADC是在浏览器端执行数据查询动作。当浏览器提出对数据库的操作请求时,ADC先将相应的数据库下载到浏览器端,在用户端进行对数据库进行操作。显然,这种方案的效率是很高的。客户端对数据库的查询是由安装在客户端的ADCActiveXControl完成的,而这个ActiveXControl是由站点服务器自动下载和安装在客户端的。

  *ADO与ASP

  这是一种完全的Web数据库访问解决方案,你可把ADO与ASP结合起来,建立提供数据库信息的网页内容,在网页中执行SQL命令,对数据库进行查询、插入、更新、删除等操作。ADO中你可以用VBScript、JavaScript语言来控制数据库的访问(而ASP恰恰是脚本语言的解释环境)和查询结果的输出;ADO中使用RecordSets对象对数据库进行操作;ADO可以连接多种支持ODBC的数据库。

  3.ASP与ADO在网上数据查询中的应用实例-港澳证件信息查询

  这个应用所要完成的是对港澳出入境数据库进行查询操作,你可以给出一种或几种查询条件,然后按你的要求显示查询结果。

  *确定数据源

  要访问网上数据库,必须首先设定数据来源。在服务器上打开"我的电脑"中的"控制面板",双击"ODBC",在"系统DSN"下选"添加",选出你预先做好的数据库种类、名称和位置。我这里要用到的是FoxPro数据库,数据源名称为GACX,主数据库名称为visa.dbf,编码数据库名称为zd.dbf。

  *ADO数据库的使用

  ADO数据库的设计方法是先用Server.CreatObject取得对象"ADODB.Connection"的一个实例,并用"Open"打开待访问的数据库:SetConn=Server.CreatObject("ADODB.Connection")Conn.Open"待访问的数据库名称"

  然后执行SQL命令,即对数据库进行操作,这里要使用Execute命令:

  SetRS=Conn.Execute("Select...From...Where...")

  下一步就可以对数据库进行查询操作,要使用RecordSets对象的如下命令:

  *RS.Fildes.CountRecordSets的字段数

  *RS(i).Name第i个字段名

  *RS(i)第i个字段的记录

  *RS("字段名")指定字段的记录

  *RS.EOF是否指向最后一个字段TrueorFalse

  *RS.MoveFirst指向第一条记录

  *RS.MovePrev指向前一条记录

  *RS.MoveNext指向后一条记录

  *RS.MoveLast指向最后一条记录

  *RS.GetRows将查询结果存放在数组中,然后再从数组中读取

  *RS.Properties.Count得到ADO的Connection或ResultSet的属性总数

  *RS.Properties(Item).Name得到ADO的Connection或ResultSet的属性名称

  *RS.Properties(Item)得到ADO的Connection或ResultSet的属性值

  *具体实现

  查询主页面为港澳证件信息查询,对应程序为gacx.asp,查询结果以两种方式显示,一种是显示主要信息-港澳证件信息查询结果列表,对应程序为gacxlb.asp,一种是显示全部信息-港澳证件信息查询结果,对应程序为gacxxq.asp,如果查询条件不能满足时,还将显示一个提示页面,告诉用户不存在满足条件的结果,这由程序gacxts.asp完成。

  首先根据客户提供的数据库和要求查询的各项建立查询、查询结果、查询结果列表页面,还要给出一个简单的提示界面,告诉用户不存在满足条件的结果,请重新查询,这些工作可以用FrontPage98完成,整个页面应该做到简洁大方,主题鲜明。程序代码在MicrosoftVisualInterDev下编写。

  下面处理编码数据库zd.dbf中的内容。从下图中可以看到有很多带下拉框的选项例如"性别"、"出生地"等,这些选项的内容都是从zd.dbf数据库中提取出来的,这正是本程序数据库处理过程中的一个闪光点(这一部分是由陶则民工程师设计并实现的),因为有的选项内容很多,例如出境口岸有101项之多,你虽然也可以用
<select>
<option>...</option>
</select>格式在HTML页面中把各个选项列举出来,但那将给程序的维护带来很大麻烦,一旦编码数据库的内容有变动,程序也将不得不作很多修改,而且带下拉框的选项都是在zd.dbf中编码了的,往主数据库中输入数据时这些选项都只输入编码,但显示时却不能显示编码,必须把编码对应的汉字显示出来。这段程序代码如下(以性别为例):
<%SetConn=Server.CreatObject("ADODB.Connection")
Conn.Open"GACX"SetRS=Conn.Execute("SelectBC,MCFromzdWhereBCLike"se%"")
Response.Write"<SELECTSIZE=1NAME="SEX">"DoWhileNotRS.EOFresponse.write"
<optionvalue='"RS(0)"'>"&RS(1)Rs.MoveNextLoopResponse.Write"
</SELECT>"RS.ColseConn.Colse%>

  其中,zd.dbf包含两个字段MC、BC,MC表示待编码项,如男、女,BC表示编码,如性别编码的前两位为"se",男用"se1"表示,女用"se2"表示。

    数据库查询中最重要的是如何取得查询条件。本例中要查询的项可以分为两类:一类是输入的text类型的查询条件,另一类是从下拉框中选出来的项,在处理时就要区分对待,text类型的查询条件很好处理,例如姓名,我给输入的内容命名为"xm",如果输入的查询项不为空时就增加一个查询条件"NAME=Request.Form("xm")"即可;下拉框的处理要复杂得多,当下拉框选中一项时,例如性别选中男,下拉框中输入的是"se1",(但反映在数据库中时为"SEX=1",因为数据库中输入字典中带编码的项时只输入编码),就是要查询"SEX=se1"的项,处理时要把"se1"中的"1"提取出来,这里只须用到一个函数mid即可,查询条件为"SEX=mid("se1",3,1)",即从数据库中查找SEX=1的项,并把所有满足条件的项不重复地列举出来。

  查询结果的显示就很容易了,只须把查询结果的每条记录按列表的方式显示出来即可,注意在显示查询结果时要显示编码对应的汉字,就是到字典中去找编码为"se"&"1"的项所对应的编码值,程序如下:

<tableborder="1"width="95%"bordercolor="#C0C0C0"cellspacing="0"
cellpadding="0"bordercolorlight="#C0C0C0"bordercolordark="#C0C0C0"height="60">

 <tr>

  <tdwidth="9%"align="center"height="1"><palign="center">

姓名</td>

  <tdwidth="12%"align="center"height="1">档案号</td> 

 <tdwidth="6%"height="1"><palign="center">性别</td>

  ...... 

</tr>

  <%i=1%>

  <%WhileNotRS.EOF%>

  <tr> 

  <tdwidth="9%"align="center"height="1"><%=RS("name")%></td>  
 <tdwidth="12%"align="center"height="1"><%=RS("dang")%></td>  
 <tdwidth="6%"height="1"><%=Func("se"&RS("sex"),GACX)%></td> 

   ......   

</tr> 

  <%RS.MoveNext%> 

  <%i=i+1%>  

<%WEnd%> 

 </table>

  其中,Func("se"&RS("sex"),GACX)是个函数,实现从数据源中取得编码所对应的汉字的功能。

  参考文献

  1.周世雄著《NT动态站点设计指南》大连理工大学出版社

  2.WindowsNTServer4.0下的ASP联机文档