一种基于ASP的多表查询集中处理方法的实现
http://www.edu.cn 2006-02-13 作者:2014年高等教育信息化十大“... 01-04 教育部成立教育信息化专家组 12-24
CERNET第二十一届学术年会 11-24 李志民:互联网促进人类文明... 11-15
|
摘要 本文讨论了使用ASP技术,实现多表查询集中处理的一种方法。 关键字 ASP;多表查询; ASP (Active Server Pages)是一种被广泛用于创建动态网页的功能强大的服务器端脚本语言。ASP中提供了ADO对象来操作数据库,从而产生和运行动态的、交互的Web服务应用程序。在网站开发过程中,我们经常会用到许许多多的表,有时在一个页面上要实现多个表的查询。如果我们要操作的是20个表,那么我们不得不要为每一个表编写一段查询程序、建一个记录集,工作量实在是太大了。而且如果记录集和数据库连接没能及时释放的话, 将会引起严重的资源消耗,系统性能很难保证。下面就笔者开发 远程教学网站过程中的一个实例,来介绍一种方便的处理方法。 1问题引入 该教学网站的后台管理模块要实现多个表的信息查询、添加、更新和删除操作,有学生信息表、账户信息表、报名表、课程信息表、教师信息表、教师任课信息表、资金表、资金日志表等等近20个表,管理员在网站维护中要经常浏览、编辑这些表的信息。表结构中的字段名称一般采用英文名称,但显示在网页上,为了增加可读性,我们采用中文的名称,这样不得不为每一个字段在网页上设置一个中文名称与英文名称对应起来。另外,大家都知道,表的结构在一个系统运行过程中难免要进行修改,如删除一个字段或增加一个字段或字段的名称、含义发生改变,那么我们的程序必须也要做出相应的修改,这无疑是一件很头疼的事情。 账户信息表的维护界面如图1所示: 2具体解决方法 处理以上问题,我是这样做的: 1)首先为每一个表xxx创建一个结构说明表xxx_stru,且每一个结构说明表的结构都一致,都只包含no(编号)、en(英文字段名)、cn(中文含义)、info(备注说明)四个字段。 如有一个账户信息表account.dbf: create table account( account_no char(10), start_time date, cancel_time date, password char(10), is_used char(1), class_no char(6), user_type char(1), suplus number(7,2), is_enrolled char(1), name char(16)); 为account创建一个结构说明表account_stru.dbf: create table account_str( no number(2), en varchar2(20), cn varchar2(20), info varchar2(100)); 2)在结构说明表xxx_stru中填入xxx表中各个字段的编号、英文名称、中文含义、注释。 接上例:即向account_stru.dbf表中插入数据 insert into account_stru(no,en,cn) values(1,'account_no','帐号'); insert into account_stru(no,en,cn) values(2,'start_time','开户时间'); insert into account_stru(no,en,cn) values(3,'cancel_time','注销时间'); insert into account_stru(no,en,cn) values(4,'password','密码'); insert into account_stru(no,en,cn,info) values(5,'is_used','是否可用','当出现异常如少钱时禁止'); insert into account_stru(no,en,cn) values(6,'class_no','班号'); insert into account_stru(no,en,cn) values(7,'SUPLUS','资金余额'); insert into account_stru(no,en,cn) values(8,'IS_ENROLLED','是否注册'); insert into account_stru(no,en,cn) values(9,'NAME','用户姓名'); insert into account_stru(no,en,cn,info) values(10,'user_type','用户类别','t:教师;p:培训学员;z:自考;h:函授;o:管理员'); 3)将每一个表链接到同一个list.asp列表数据文件,该文件将集中处理每一个表的查询。如: <a href="list.asp?name=账户信息&tablename=account">账户信息表</a> <a href="list.asp?name=学生信息&tablename=student">学生信息表</a> 说明:点击每一个链接,则显示一个表的数据。这里通过Get方式传递了name和tablename两个变量,其中name变量是为了显示表的中文标题,tablename变量是为了将表的名称传递给list.asp程序的ADO数据库连接语句。 4)list.asp程序的实现(部分程序) <% dim fldnamearry,i,table,tname,stru,m,dd,fldval set cn=server.createobject("adodb.connection") cnstr=application("oconn") cn.open cnstr ‘读出传递过来的数据: table=request.querystring(“tablename”) tname==request.querystring(“name”) ‘进行字符串组合,形成结构说明表的名称: stru=table&"_stru" ‘建立结构说明表记录集 sqlstru="select * from "&stru set rsstru = Server.CreateObject("ADODB.Recordset") rsstru.open sqlstru,cn,3,1 '将字段名放入二维数组fldarry中 fldnamearry=rsstru.getrows rsstru.close set rsstru=nothing set rs = Server.CreateObject("ADODB.Recordset") rs.cursorlocation=3 ‘读出数据表中的数据 sql="select * from "&table rs.open sql,cn,3,1 ‘在页面上显示数据表的结构和数据 response.write "<table border=1 width=100% align=center cellpadding=0 "_ &"cellspacing=0 bordercolor=#006600 bordercolordark=#E &" bgcolor=#E ‘显示表的结构,字段名称用结构说明表中的cn代替: response.write "<tr align=center>" for each objfield in rs.fields for i=0 to ubound(fldnamearry,2) fldname=trim(ucase(fldnamearry(1,i))) if objfield.name=fldname then response.write "<td bgcolor=#dddddd >"&fldnamearry(2,i)&"</td>" end if next next … ‘显示表中的数据: do while not rs.eof response.write "<tr align=center>" for each objfield in rs.fields if isnull(objfield.value) then response.write "<td><font color=red>未填</font></td>" else response.write "<td><font color=blue>"_ &objfield.value&"</font></a></td>" end if next response.write "</tr>" rs.movenext loop response.write "</table>" end if … %> 3结论 以上处理方法,减少了应用程序的数量,进而减少了程序出错的机率及程序维护工作量。而且结构说明表也帮助网站管理员更好的理解各个表的结构定义,利于网站远程教学系统的不断完善和后续开发工作的开展。 参考文献: [1] 《ASP动态网页设计》赵增敏编著 电子工业出版社(2003) [2] 《ASP数据库系统开发实例导航》宣小平等编著 人民邮电出版社(2003) |

