|
用ADO对象实现动态WEB查询实例
(作者:河南金融管理干部学院计算机教研室 陈学军 2000年06月05日 13:48)
一、 引言
随着WWW技术的问世,给Internet的带来新的活力,使Internet的用户数有了爆炸性的增长,各企业纷纷建立企业内部网,拥有了自己的WEB站点。信息查询系统一直是Internet上最为主要的一项服务,用户可以在上面根据自己的需求找到自己要查询的信息。在各种各样的WEB站点中,各种信息查询系统简直随处可见,为了说明这种信息查询系统的技术原理以及策略方法,笔者以自己曾参与建设的某市的房产信息查询系统的例子向大家介绍说明WEB站点的信息查询的实现方法,以求抛砖引玉。
二、 系统说明
房产信息查询系统,需要根据用户的输入条件(如房产的坐落位置、房 产的所在辖区、房产的结构类型、房屋的面积、房屋的套型、房屋的出租价格、房屋的出售价格等)从所有登记的房产信息中,查找出符合条件的房产信息。例如,可以在房屋面积中输入80平方米至120平方米,单击“提交查询”按钮,房产信息查询系统就可以从数据库中查找“房屋面积为80平方米至120平方米”的有关信息并显示输出。另外,也可以使用多条件查询,例如,可以通过选择“房屋结构类型” 为“砖混”,和“房产所在辖区”为“龙亭区”,然后提交查询,来找出在“龙亭区”中的房屋结构为“砖混”的所有的房屋信息。
三、系统实现
本系统是在win98下运行Micrsoft personal Web Server(pws)通过访问Web数据库的技术实现的。本例采用Active Server Pages(动态服务器网页,以下简称ASP)技术实现。
ASP是一个基于Web服务器的脚本开发环境,在ASP平台上可开发和运行动态的、交互的、高性能的Web服务器应用程序。下面就简单介绍ASP访问数据库的工作原理。
ASP程序是在Web服务器端工作,当前端用户请求一个ASP主页时,Web服务器响应HTTP请求并调用ASP引擎执行该文件并解释执行其中的脚本语言(VBSCRIPT或JAVASCRIPT),如果脚本语言中有访问数据库的请求,立即通过ODBC或OLE DB与相应的后台数据库相连,并通过数据库访问组件ADO(ActiveX Data Objects)完成数据库操作,最后,ASP根据访问的结果集自动生成HTML语言的主页返回给前端的用户。用户看到的只是自动生成的HTML网页,而看不到ASP的程序代码,这样就增强了应用程序的保密性。
四、技术背景
在上面的技术背景中,我们主要讨论ADO对象——记录集对象(Recordset对象)当我们使用ADO进行数据库的链接和操作时,差不多都使用Recordset对象来处理数据库的查询结果。这不仅是因为Recordset对象采用了跟数据库中数据表相似的行、列结构,可以方便地保存数据库的查询结果,返回的Recordset数据集合取得后再通过服务器端的脚本语言环境加以处理、分析、显示数据于客户端浏览器上。
ADO中Connection、Command与Recordset三个对象之间虽然是密不可分,但是实际在操作ADO时仅需要控制好Recordset对象就可以完成数据库服务器上的任何动作,因为在Recordset对象内提供了诸多的内容方法、属性与Command、Recordset对象自动进行连接,并在背后完成了Command与Recordset对象所应该完成的工作。
另外,ADO允许程序设计人员在程序代码的执行期间将不同已建立的ADO对象作出关联与层次的动作,因此在实际编写程序代码是我们可以先个别建立Command对象,接着利用Command对象内的ActiveConnection属性来关联某个已与数据库完成连接动作的Connection对象。同时的Recordset对象内部ActiveConnection属性可与个别Connection与Command对象作出相互关联的动作,甚至你可以直接传入连接描述字符串或SQL数据查询字符串给ActiveConnection属性,让Recordset对象自动帮你完成数据库连接与请求的动作,而这些动作仅花费一行程序代码的空间,ADO机制的巧妙之处如此可见一斑。
而且Recordset对象本身带有许多属性和方法,这极大地方便了我们操作和控制记录集中各条记录的功能。
下面根据本例中使用的Recordset对象的方法和属性来谈几点。
1. open方法
open方法用来开启一个光标,从而也打开了一个记录集对象。
语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
参数
Source 可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset 文件名。
ActiveConnection 可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。
CursorType 可选,CursorTypeEnum 值,确定提供者打开 Recordset 时应该使用的游标类型
LockType 可选。确定提供者打开 Recordset 时应该使用的锁定(并发)类型的 LockTypeEnum 值
Options 可选,长整型值,用于指示提供者如何计算 Source 参数(如果它代表的不是 Command 对象),或从以前保存 Recordset 的文件中恢复 Recordset。
2、BOF、EOF 属性
BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前。
EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后。
3、MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法
移动到指定 Recordset 对象中的第一个、最后一个、下一个或上一个记录并使该记录成为当前记录。
当然,Recordset对象的方法和属性还有很多,在这里就不在多说,您如果有兴趣,可在MSDN Library 的 Visual Studio 6.0 版本里找到更全面的介绍。
下面就以ASP的数据库访问组件ADO实现房产查询系统。在实现该系统时主要通过fwcx.html,fwcx.asp二个文件,其中fwcx.html是用于用户提供查询信息的请求的界面页,fwcx.asp是用于处理用户查询并输出结果至客户端,尽而体现Recordset的强大功能。源程序如下:
fwcx.asp源程序
<%@ Language=VBScript %>
<form name="thisForm" METHOD="post">
<html>
<head>
</SCRIPT>
</head>
<body>
<h1>查询结果<br></h1>
<hr>
<%
dim jg,mjq,mjz,lcq,lcz,tymj_q,tymj_z txfj,txt,fw,jdmc
dim ,zjq,zjz,sjq,sjz,fwzt
dim cxtj,cxbds,cxjg1
cxtj=""“用户请求信息“
jg=Request.Form("jg")“取得用户的单元信息—房屋的结构类型“
mjq=Request.Form("mjq")“取得用户的单元信息—房屋的面积数范围(开始)“
mjz=Request.Form("mjz")“取得用户的单元信息—房屋的面积数范围(结束)“
lcq=Request.Form("lcq")“取得用户的单元信息—房屋的楼层范围(开始)“
lcz=Request.Form("lcz")“取得用户的单元信息—房屋的楼层范围(结束)“
tymjq=Request.Form("tymj_q")“取得用户的单元信息—庭院面积范围(开始)“
tymjz=Request.Form("tymj_z")“取得用户的单元信息—庭院面积范围(结束)“
txfj=Request.Form("txfj")“取得用户的单元信息—房屋的套型的室数“
txt=Request.Form("txt")“取得用户的单元信息—房屋的套型的厅数 “
fw=Request.Form("fw")“取得用户的单元信息—房屋的所在区域“
jdmc=Request.Form("jdmc")“取得用户的单元信息—房屋的具体位置“
zjq=Request.Form("zjq")“取得用户的单元信息—房屋的出租价格(开始)“
zjz=Request.Form("zjz")“取得用户的单元信息—房屋的出租价格(结束)“
sjq=Request.Form("sjq")“取得用户的单元信息—房屋的出售价格(开始)“
sjz=Request.Form("sjz")“取得用户的单元信息—房屋的出售价格(结束)“
fwzt=Request.Form("fwzt")“取得用户的单元信息—房屋的目前状态“
// 设置查询条件
if ltrim(jg)<>"" then cxtj=cxtj+" and fc_jg='"+jg+"'"
if ltrim(mjq)<>"" then cxtj=cxtj+" and fc_mj >="+mjq
if ltrim(mjz)<>"" then cxtj=cxtj+" and fc_mj <="+mjz
if ltrim(tymjq)<>"" then cxtj=cxtj+" and fc_tymj >="+tymjq
if ltrim(tymjz)<>"" then cxtj=cxtj+" and fc_tymj <="+tymjz
if ltrim(txfj)<>"" then cxtj=cxtj+" and fc_txfj="+txfj
if ltrim(txt)<>"" then cxtj=cxtj+" and fc_txt="+txt
if ltrim(lcq)<>"" then cxtj=cxtj+" and fc_lc >="+lcq
if ltrim(lcz)<>"" then cxtj=cxtj+" and fc_lc <="+lcz
if ltrim(jdmc)<>""then cxtj=cxtj+" and fc_jdmc='"+jdmc+"'"
if ltrim(zjq)<>"" then cxtj=cxtj+" and fc_zfjg_q >="+zjq
if ltrim(zjz)<>"" then cxtj=cxtj+" and fc_zfjg_q <="+zjz
if ltrim(sjq)<>"" then cxtj=cxtj+" and fc_sfjg_q >="+sjq
if ltrim(sjz)<>"" then cxtj=cxtj+" and fc_sfjg_q <="+sjz
if ltrim(fwzt)<>"" then cxtj=cxtj+" and fc_fwzt='"+fwzt+"'"
if left(cxtj,4)=" and" then cxtj=right(cxtj,len(cxtj)-4)
cxbds="SELECT * FROM fw_fcxx WHERE "+cxtj
session("bds")=cxbds//根据查询条件变量cxtj得到查询结果集,必须将其视为一个数组包裹传入session对象保存用户信息,以 便页与页之间跳转时维护用户的信息。//
if cxtj<>"" then
Recordset1.close
Recordset1.setSQLText cxbds//为Recordset1记录集合设置SQL STATEMENT(说明)从数据库表fw_fcxx中查询//
Recordset1.open
end if
%>
//设置输出表格格式
<table bgColor="wheat" border="1" cellPadding="1" cellSpacing="1" width="95%" style="WIDTH: 95%">
<tbody>
<tr>
<td><FONT color=#006400><STRONG>房屋座落位置</strong></font></td>
<td><font color="darkgreen" face=""><strong>面积</strong></font></td>
<td><font color="darkgreen" face=""><strong>套型</strong></font>
<td><font color="darkgreen" face=""><strong>楼层</strong></font></td>
<td><font color="darkgreen"><strong>租房价格</strong></font></td>
<TD><FONT color=darkgreen><STRONG>售房价格</strong></font></td>
<td><font color="darkgreen"><strong>结构</strong></font></td></tr></tbody>
<%Recordset1.moveFirst
while not Recordset1.EOF
cxjg1="<tr><td><A href='xxcxjg1.asp?fcxh="+cstr(Recordset1.fields.getValue("fc_xh")) +"'>"+ltrim(Recordset1.fields.getValue("fc_fw"))+ltrim(Recordset1.fields.getValue("fc_jdmc"))+"</A></td><td>"+cstr(Recordset1.fields.getValue("fc_mj"))+"</td><td>"+cstr(Recordset1.fields.getValue("fc_txfj"))+"室"+cstr(Recordset1.fields.getValue("fc_txt"))+"厅"+"</td><td>"+cstr(Recordset1.fields.getValue("fc_lc"))+"</td><td>"+cstr(recordset1.fields.getvalue("fc_zfjg_q"))+""+cstr(recordset1.fields.getvalue("fc_zfjg_z"))+"</td><td>"+cstr(recordset1.fields.getvalue("fc_sfjg_q"))+""+cstr(recordset1.fields.getvalue("fc_sfjg_z"))+"</td><td>"+Recordset1.fields.getValue("fc_jg")+"</td><td></tr>"
Response.Write cxjg1
Recordset1.moveNext
wend
%>
</TBODY></TR></table>
<br>
</body>
</form>
</html>
----全文结束----
|
|
 |