当前位置: 首页 > 图文教程 > 网络编程 > ASP > 论坛关键技术,树状记录表的堆栈展开

ASP
ASP调用ORACLE存储过程并返回结果集
用ASP实现网页BBS
关于Global.asa文件的深入研究与session变量失效提示的具体方法
简易ASP+注册系统
防护手册:如何防止ASP木马在服务器上运行
用Visual Basic实现多画面播放功能之二
如何增强ASP程序性能(1)
如何增强ASP程序性能(2)
如何增强ASP程序性能(3)
ASP备份数据库
二十八条改善 ASP 性能和外观的技巧
在Form域中Post大于100K的数据
如何使用ASP制作模似动态生长的表单?
Microsoft IIS 真的如此「不安全」吗?(1)
Microsoft IIS 真的如此「不安全」吗?(2)
Microsoft IIS 真的如此「不安全」吗?(3)
Microsoft IIS 真的如此「不安全」吗?(4)
Microsoft IIS 真的如此「不安全」吗?(5)
关于页面和代码分离
ServerVariables 对路径的操作

ASP 中的 论坛关键技术,树状记录表的堆栈展开


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 24 ::
收藏到网摘: n/a

       由于工作原因,涉及到一个树状存放记录的表,要求程序中把树状表全部展开,并输出相应的数据內容。由于涉及到此种操作的地方很多,比如网络上的\\\"论坛"就是典型的采用树状存放记录的表,特此整理出来与大家分享。
   在很多资料都有介绍展开树状记录的程序,但是很多是采用递归的方法。我們知道,递归的方法逻辑比较简单,实际操作起来比较容易。但是递归有一个最大的缺点就是占用资源太多,速度太慢。如果在互联网的"论坛"上采用此种方法,在表记录很多的情况下将是一个非常严重的问题。下面的程序在笔者的工作中解决了一个大问题并将应用于本人小站(yuking.126.com)的论坛。
   我这里采用速度非常快的堆栈来实现这种操作,但是操作起来相对而言难度加大。我们就以论坛记录表为例讲解这一过程,首先了解一下表结构:
  
  一、表结构(article)
   self int ''本记录ID号
   father int ''父记录ID号
   title char ''贴子标题
   author char ''贴子作者
   datetime date ''发贴日期时间
   hits int ''点击数
   reply int ''回复数
   ..... ''根据具体的情况我们还可以有更多的字段
   1)关键说明:self是记录本记录的ID号,这应该是一个自动增长的字段,不充许重复。father是记录本结点的父结点ID号的字段,若该记录内容为"回贴"此字段值应该为"主贴"的ID号。若该记录为"主贴"则它的父结点应该为"0"
   2)如下两条记录是父子记录:
   self father title author .....
   1 0 ''谁能帮帮我'' ''三脚猫''
   2 1 ''我能帮你什么忙吗?'' ''网上飞''
  
  二、操作方法
   首先,我们读出所有父结点为"0"的记录也就是"主贴",统统放入堆栈中。然后输出位于栈顶的一条记录("主贴")数据,并清空栈顶,栈頂下移一格。接着查找所有父结点为该栈项结点("主贴")的记录("回贴"),也统统放于栈顶。注意到没有,就这两步我们就完成了把一条父记录输出并展开其子结点的工作。余下的工作只是依次类推而已了,直到栈为空为止。
   当然实际操作时可能还会有一些要求,比如要求得到记录的层数,回复数等等问题,我们只需稍加改进就能实现。
  
  三、这里是整理后的原代码
  <%
  set RS=server.CreateObject("ADODB.Recordset")
  
  sql_text="select * from article where father=0 order by datetime desc"
  RS.Open sql_text,Bbs_ConnectionString ''查找所有父结点为''0''的结点,即"主贴"。
  
  Dim Stack(100,8) ''定义堆栈,我这里是100(''8''是指每个栈元素分别存放8个字段值)。''可根据实际情况定义堆栈大小,可以按这个公式计算"最多层数*最多展开数"。
  while not Rs.eof
   Stack(0,0)=RS("self")
   Stack(0,1)=RS("father")
   Stack(0,2)=RS("title")
   Stack(0,3)=RS("author")
   Stack(0,4)=RS("datetime")
   Stack(0,5)=RS("hits")
   Stack(0,6)=RS("reply")
   Stack(0,7)=0
   Top=1
   do until Top=0
   Sql_text="select * from article where father="&StackTop&"
   RS1.Open Sql_text,MyConn ''查找所有父结点为栈顶结点的记录
   ''输出栈项元素,我这里是直接输出,实际做的时候可以产生表格等等效果
   for i=0 to 7
   Response.write stack(top-1,i)
   next
  
   ParentLevel=stack(top-1,7) ''清空堆栈之前获得父记录的层数
   for i=0 to 7 ''清空堆栈项部
   Stack(top-1,i)=""
   next
   Top=top-1 ''栈顶向下移动一格
   ''将查找到的栈项结点"派生出"的全部子记录存入堆栈
   While not RS1.eof
   Stack(Top,0)