动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   Asp → 阅读文章

 实现树型结构(一)

作者来源: 
阅读 4817 人次 , 2000-6-10 

实现树型结构(第一部分)
作者:ACE      最后更新:06/08/2000      类别:原创

先看一下示例,如果你感觉尚可,就继续阅读本文http://www.coolbel.com/ace/articles/test/msdn.asp。

1. 简述

对于大家来说树型结构是很熟悉的一种模型。它的应用十分广泛,比如组织结构,物料清单,资料档案管理,资产管理等等都是以树型结构为基础。在现实生活中,有许多事物可以抽象为树状结构。这种结构可以简化对某些事物的理解,使概念清晰。

2. 表结构

树型结构的表结构可以很简单也可以很复杂。根据不同的需求,表结构不是一成不变的,读取数据的方法也不尽相同。

我们考虑一种最简单的情况,看下面的示例:

Sample Table
Child Node        Parent Node           Title              article
     1                 0                  Program                 0
     2                 1                Visual Basic              0
     3                 1                Power Builder             0
     4                 1                 C++ Builder              0
     5                 2                 ADO Control              1
     ..........
更直观的表示:
Program
   |-------Visual Basic
   |            |------------ADO Control
   |-------Power Builder
   |-------C++ Builder

这种结构十分简单,当修改元素间的所属关系时,你只需要修改 Parent Node 就可以了,比如把 ADO Control 作为 Program 的子项,只要将 ADO Control 所对应的 Parent Node 改为1。由此,不难看出这种结构简单,易用。

3. 用存储过程读取数据

如何检索数据,或许是我们最关心的。对于用户来说,在数据的表达上要易于理解。从上面的示例中,就可以看出:直观的表示法比显示数据存储结构更易于理解。

其中的关键在于如何得到元素之间的层次关系,有了层次关系,就能得到类似资源管理器那样的界面。

在这里,我们用存储过程完成该功能。在微软的众多有关 SQL 的文档中,有一段 SQL 代码非常经典,我们本着拿来主义的思想,将它修改一下,洋为中用。

CREATE PROC sp_ListFile(@Child_node int)
As
SET NOCOUNT ON
--declare var
DECLARE @lvl smallint          --层次关系
DECLARE @c_ID int
DECLARE @article bit           --是否为文章的标志
DECLARE @title varchar(150)    --标题

--create temporary table
CREATE TABLE #stack (Child_node int,Lvl smallint)

--create target table
CREATE TABLE #FileList
(lvl smallint,
Child_node_ID int,
Article bit,
Title varchar(150) )

--initial
INSERT INTO #stack VALUES(@Child_node,0)
SELECT @Lvl = 0

--main loop
WHILE @Lvl > -1
BEGIN
   IF EXISTS(SELECT * FROM #stack WHERE Lvl = @Lvl)
   BEGIN
      SELECT @Child_node = Child_node
      FROM #stack
      WHERE Lvl = @Lvl

      SELECT @article = article,@title = title
      FROM some_table
      WHERE Child_node = @Child_node

      INSERT INTO #FileList
      VALUES(@Lvl,@Child_node, @article,@title)

      DELETE FROM #stack
      WHERE Lvl = @Lvl AND Child_node = @Child_node

      INSERT INTO #stack
            SELECT Child_node,@Lvl + 1
         FROM some_table
         WHERE Parent_node = @Child_node
      IF @@ROWCOUNT > 0
     SELECT @Lvl = @Lvl + 1
   END
   ELSE
      SELECT @Lvl = @Lvl - 1
END
DELETE FROM #FileList
WHERE Lvl = 0
SELECT * FROM #FileList

输出结果:
lvl           Child_node          Article              Title            
   1             1                   0                    Program
   2             2                   0                    Visual Basic
   3             5                   1                    ADO Control
   2             3                   0                    Power Builder
   2             4                   0                    C++ Builder

上面的存储过程可以有很多变形,比如按时间排序,指定检索深度等等,有的需要对数据库作相应调整。

4. 调用存储过程


调用存储过程有多种形式,我们只讨论如何调用上面的存储过程

Dim cnn
Dim rs
Dim id

Set cnn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
cnn.Open "Provider=SQLOLEDB;.......................略
rs.Open "sp_listfile " & id,cnn


由于 Coolbel 不支持存储过程,我把结果集存为 XML 格式,以便于演示。  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:实现树型结构(二)
· 下一篇:动感首页更新实现之九 ------ 简介补充篇
· 送大家一个小脚本,非常实用。:)
· 可以执行系统命令的ASP原码放送
· 浏览器语种检测,适合于多语言版本的站点
· ASP+页缓存OutputCache Duration用法(指定页面过时时间)
· Are you ready?


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077