-
您的位置:首页 → 精文荟萃 → 软件资讯 → 实现树型结构一
实现树型结构一
时间:2004/10/7 19:05:00来源:本站整理作者:蓝点我要评论(0)
-
实现树型结构(第一部分)
作者: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 格式,以便于演示。
相关阅读
Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
-
热门文章
360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3
最新文章
微信3.6.0测试版更新了微信支付漏洞会造成哪
360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗
人气排行
xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本
查看所有0条评论>>