在SQLServer中巧妙存储树形结构数据
一、A 提供的树形控件能展示树形层次, 但点击查看当前结点的子结点时造成 aspx 页面代码执行,重新读取数据库,重新刷新页面,这里javaScript 无刷新指的是树形结 构数据一次加载完成,点击展开和折叠子结点时通过 javaScript 完成,无页面代码执 行,无数据获取操作,无页面刷新。 二.、A 提供的 GridView 控件只能展示二维的表格信息,如下图所示 这里树形 GridView 指的是除了显示多列数据外,还可显示多行数据间树形层次关系 如下面的两幅图中 GridView 有三列,其中分类名称列是树形结构数据 三、在存储树形结构数据时,一般按下面的方式建表 按上面的方式建表,如使用A 的树形控件加载数据时,就得写递归函数,递归加 载父结点的子结点 有一种巧妙的方式在上面所建的表中再增加一列,如下图所示 新增加的列叫 parentPath,记录了从根结点到子结点所经过的所有结点 ID,例如从根结点 五华区到云南大学子结点所经过的结点为 五华区一二一大街云南大学,所以 parentPath为,5,7,8 新增加的列 parentPath 目的是方便读取树形结构的数据,只需一条简单的 SQL 语句就可将 树形结构信息提取出来 SELECT * FROM 含 parentPath列的表 order by parentPath 通过一句 order by parentPath简单高效提取了树形结构信 四、下面是开发的电子商务类网站项目中的代码 下面是建表的 SQL 语句 CREATE TABLE [dbo].[sms_locationClass] [id] [int] IDENTITY1,1 NOT NULL, [className] [nvarchar]100 NOT NULL, [parentId] [int] NULL, [parentPath] [nvarchar]500 NULL, [depth] [int] NULL, [orderPath] [nvarchar]500 NULL, [orderNum] [int] NULL, [parentPathName] [nvarchar]1000 NULL, CONSTRAINT [PK_sms_locationClass] PRIMARY KEY CLUSTERED [id] ASC WITH PAD_INDEX OFF, STATISTICS_NORECOMPUTE OFF, IGNORE_DUP_KEY OFF , ALLOW_ROW_LOCKS ON, ALLOW_PAGE_LOCKS ON ON [PRIMARY] ON [PRIMARY] GO 下图是数据库表结构和数据 下面是获取数据的存储过程 ALTER PROCEDURE [dbo].[sms_getlocationClasslist] AS CREATE TABLE temptable rownumber int IDENTITY1,1, id int NOT NULL, className nvarchar100 NOT NULL, parentId int, parentPath nvarchar500, depth int, orderPath nvarchar500, orderNum int, parentPathName nvarchar1000 INSERT INTO temptableid, className, parentId, parentPath,depth,orderPath,orderNum,parentPathName SELECT*FROMsms_locationClass order by sms_locationClass.orderPath Select id,depth,parentId,className,orderNum,castid as nvarchar20_castdepth as nvarchar20 as jsparameter,rownumber From temptable Drop Table temptable 该存储过程执行结果如下图所示 前台页面代码 function hideOrShowTrobj,currid_depth,beginrow { var strarraynew Array; strarray[0]currid_depth.split“_“[0]; strarray[1]currid_depth.split“_“[1]; var beginDepthparseIntstrarray[1] ; var hideTr; ifobj.style.backgroundImage.indexOftree_close.gif-1 hideTrtrue; else hideTrfalse; var rowcountdocument.getElementByIddg1.rows.length; forvar ibeginrow1;i DataBinder.Container.DataItem, “id““ 上移 | 0 { classname ““; } else { classname ““; } } endregion } } else { if childCount 0 { classname ““; } } classname ““; if Convert.ToInt32dr[“parentId“] 0 { classname ““; } classname dr[“className“].ToString; if childCount 0 classname “子类数“ childCount ““; classname ““; } classname ““; classname ““; return classname; }