欢迎光临
我们一直在努力

实现树型结构(一)

建站超值云服务器,限时71元/月

实现树型结构(第一部分)
作者: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 格式,以便于演示。

  

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 实现树型结构(一)
分享到: 更多 (0)