摘 要 本文从实际应用角度,围绕着Microsoft SQL Server 6.5 中与Web应用密切相关的存储过程SP—MAKEWEBTASK进行扩展,以完成快速生成系列式主页的工作。
关键词 Web,Microsoft SQL Server,存储过程
在微软公司的数据库产品Microsoft SQL Server 6.5版本开始,包含了一个工具——SQL Server Web Assistant。利用它,可以将数据库中的记录方便地转换成HTML文件格式,在Web上使用。如果Web服务器本身就是Microsoft NT SERVER,经过相应配置,当出现数据库的记录增、删、改,或当一个指定的时间到达时,由Web Assistant生成的Web页面内容能自动更新,进而方便地实现数据库的联机查询。
Web Assistant除以图形化用户界面出现外,还以Microsoft SQL Server 存储过程sp—makewebtask形式出现。图形化用户界面只能用与基于INTER芯片的平台上,而存储过程sp—makewebtask可以在任何SQL SERVER支持的平台上使用。sp—makewebtask同样支持HTML文件模板——即可事先定义将产生的HTML文件的整体形式,除了其中要从数据库得到的数据是用%insert—data—here%形式表示之外,其它标识符号完全与其它HTML文件一致。不仅如此,这一存贮过程还可以根据情况灵活地选用一些参数,如果能将它与其它Microsoft SQL Server 存储过程有效地加以结合,就可以满足更复杂的需求。以下以一实际例子加以说明。
某校准备在校园网上公布即将录取的上千名学生情况。假定名单是按准考证号排序,要求每张主页上只显示20名学生,每页上还应有指向上一页,下一页的连接。对于这种任务,如等到名单拿到后再用DreamWeaver,FrontPage等开发工具一页页做,势必浪费很多时间精力。仅仅利用Web Assistant,能做到快速生成全部主页,但无法自动插入上页和下页链接。由于在实际应用中各页文件可能放置的目录,名称等等都是要根据Web服务器上的情况加以确定,开始时不能定死。针对这种情况,一条可行的解决途径就是编写一些存储过程,将学生信息,每一文件的上下页文件名(含目录名)各自作为一个数据表存放在数据库中。将来等到学生信息,文件名称,目录情况都确定下来以后,导入到数据库中,直接调用存储过程,即可轻松生成全部HTML文件:可以每次先从学生信息数据表中抽取20条记录,先利用此模板生成一临时HTML文件,其中包含了有关的学
生信息;再从链接关系数据表中得到上下页文件所在位置,用刚生成的临时文件作为模板,生成实际要求的HTML文件。
具体而言,对于模板文件,假设名称为LIN1.HTML ,关键信息为:
……
/*注:有关格式HTML格式信息从略*/
<TABLE BORDER=2 COLS=4>
<TR>
<%begindetail%>
<TR>
<TD height="25"><%insert—data—here%></TD> /*注:此栏是主考证号*/
<TD height="25"><%insert—data—here%></TD> /*学生姓名*/
<TD height="25"><%insert—data—here%></TD> /*原学校*/
<TD height="25"><%insert—data—here%></TD> /*录取专业*/
</TR>
<%enddetail%>
</TABLE>
/*注:以上<TABLE>到</TABLE>间定义未来学生信息在HTML文件中的位置,来自学生信息数据表*/
<%begindetail%>
<A HREF="<%insert—data—here%>">
<img src="/edu/files/pic/2006-5/21/065211026595544.jpg"是常见的表示上、下页的图标*/
然后在Microsoft SQL Server 中建立数据库S1,其中包括学生录取名单表STULIST,表中字段分别为准考证号stuid char (20),学生姓名stuname char(10),原学校school char(20), 录取专业stumajor char (20);链接关系数据表linktable,其中字段分别为上页链接位置prevpage char (20),下页链接位置nextpage char (20),本页文件名ownpage char (20)。根据编程的需要,再建立两个临时表, 一个为TMPSTU,存放每次处理的20名学生的情况信息,字段与STULIST完全一致;另一个为TMPLINK,存放当前要生成HTML文件的上下页链接位置,字段为prevpage char (20) 与nextpage char (20)。
主调用存储过程STUHTML内容为:
CREATE PROCEDURE stuhtml AS
BEGIN
DECLARE @ls—stuid CHAR(20)
DECLARE @ls—stuname char(10)
DECLARE @ls—school char(20)
DECLARE @ls—major char(20)
DECLARE @ls—prevpage char(20)
DECLARE @ls—nextpage char(20)
DECLARE @ls—ownpage char(20)
/*以上定义与字段有关的临时变量*/
declare @ls—finish char(1)
select @ls—finish = ′N′
/*定义循环结束标志*/
declare @li—rowcnt int
/*已处理记录数计数器*/
declare @li—rowtot int
select @li—rowtot = 20
/*定义每页最多学生记录数*/
/*打开学生信息数据表*/
DECLARE stu SCROLL CURSOR FOR select * FROM s1..stulist ORDER BY stuid
open stu
/*打开链接关系数据表*/
DECLARE l—table SCROLL CURSOR FOR select * FROM s1..linktable
open l—table
/** 进入循环体**/
FETCH first FROM stu INTO @ls—stuid,@ls—stuname,
@ls—school, @ls—major
FETCH first from l—table into @ls—prevpage , @ls—nextpage,
@ls—ownpage
while (@ls—finish = "N")
begin
delete from s1..tmpstu
delete from s1..tmplink
insert s1..tmplink values (@ls—prevpage, @ls—nextpage)
select @li—rowcnt = 1
while ((@@FETCH—STATUS = 0)
and (@li—rowcnt <= @li—rowtot))
begin
insert s1..tmpstu values(@ls—stuid,@ls—stuname,
@ls—school, @ls—major)
select @li—rowcnt = @li—rowcnt +1
FETCH next FROM stu INTO @ls—stuid, @ls—stuname,
@ls—school,@ls—major
end
if (@@FETCH—STATUS <> 0)
select @ls—finish = "Y"
/*定义输出的HTML文件名*/
declare @ls—output char(20)
declare @ls—temp char(20)
/*定义模板文件名*/
select @ls—output = ′D:/TEMP/TMP.HTML′
select @ls—temp = ′D:/TEMP/LIN1.HTM′execute addrecord @ls—output, @ls—temp
/*调用添加学生记录的过程*/
select @ls—output = @ls—ownpage
select @ls—temp = ′D:/TEMP/TMP.HTML′
execute addlink @ls—output, @ls—temp
/*调用添加链接记录的过程*/
FETCH next from l—table into @ls—prevpage , @ls—nextpage, @ls—ownpage
END
/**关闭游标**/
CLOSE stu
DEALLOCATE stu
CLOSE l—table
DEALLOCATE l—table
End
/*END OF STUHTML*/
根据实例分析,编写存储过程,在WINDOWS NT 4.0,SQL SERVER 6.5,NETSCAPE 4.0 环境下,可轻松地完成,而且具有较强灵活性,参考此例可以自行设计完成。
作者简介:付 琨 硕士,助教。主要从事Internet网络应用以及网络操作系统研究。
作者单位:上海财经大学网络中心 上海(200433)