[asp.net+Sql]关于树的排序
2009-05-24 09:52
337 查看
在大部分的大型程序里都会用到树,种树这个鸟活让我头大了几天。
树的算法大家应该都很清楚了,递归就可以了,但是头疼的就是树的排序,在添加、修改父节点,节点移动都要重新计算树的排序,从而是代码量大大提高。于是决定用SQL去做这个烦琐的事情,用了2个触发器,一个存储过程完成了树的排序。
Create PROCEDURE ModuleBase_move
@ModID int,@Menth nvarchar(5),@result nvarchar(30) output
As
declare @ParentID int,@JHSQNC int,@TmpModID int
select @ParentID = ParentID from ModuleBase where ModID = ModID
DECLARE ModuleBase_Cursor CURSOR SCROLL FOR
SELECT ModID FROM ModuleBase WHERE ParentID=@ParentID ORDER BY SQNC
OPEN ModuleBase_Cursor
FETCH NEXT FROM ModuleBase_Cursor INTO @TmpModID
WHILE @@FETCH_STATUS = 0
BEGIN
if(@TmpModID=@ModID)
begin
if(@Menth=’up’)
begin
FETCH PRIOR FROM ModuleBase_Cursor INTO @TmpModID
end
else
begin
FETCH NEXT FROM ModuleBase_Cursor INTO @TmpModID
end
select @JHSQNC=SQNC FROM ModuleBase where ModID=@TmpModID
update ModuleBase Set SQNC=(select SQNC from ModuleBase where ModID=@ModID) where ModID=@TmpModID
update ModuleBase Set SQNC=@JHSQNC where ModID=@ModID
FETCH LAST FROM ModuleBase_Cursor into @TmpModID
End
FETCH NEXT FROM ModuleBase_Cursor into @TmpModID
END
CLOSE ModuleBase_Cursor
DEALLOCATE ModuleBase_Cursor
IF @@ERROR <> 0
BEGIN
set @result=’操作失败’
END
ELSE
BEGIN
set @result=’操作成功’
END
GO
存储过程是为了在子节点在父节点下上下移动时候使用,
传入值两个@ModID int------节点编号
@Menth nvarchar(5)-------移动方式up或者down
返回值@result,用来输出是否移动成功
实现原理是将移动节点的父节点按顺序排列,如果上移动,找到该移动节点,与上条记录的排序值互换,下移则相反!
这样操作起来在程序的代码中可以不必考虑节点排序的问题,一切让SQL自己做
树的算法大家应该都很清楚了,递归就可以了,但是头疼的就是树的排序,在添加、修改父节点,节点移动都要重新计算树的排序,从而是代码量大大提高。于是决定用SQL去做这个烦琐的事情,用了2个触发器,一个存储过程完成了树的排序。
Create PROCEDURE ModuleBase_move
@ModID int,@Menth nvarchar(5),@result nvarchar(30) output
As
declare @ParentID int,@JHSQNC int,@TmpModID int
select @ParentID = ParentID from ModuleBase where ModID = ModID
DECLARE ModuleBase_Cursor CURSOR SCROLL FOR
SELECT ModID FROM ModuleBase WHERE ParentID=@ParentID ORDER BY SQNC
OPEN ModuleBase_Cursor
FETCH NEXT FROM ModuleBase_Cursor INTO @TmpModID
WHILE @@FETCH_STATUS = 0
BEGIN
if(@TmpModID=@ModID)
begin
if(@Menth=’up’)
begin
FETCH PRIOR FROM ModuleBase_Cursor INTO @TmpModID
end
else
begin
FETCH NEXT FROM ModuleBase_Cursor INTO @TmpModID
end
select @JHSQNC=SQNC FROM ModuleBase where ModID=@TmpModID
update ModuleBase Set SQNC=(select SQNC from ModuleBase where ModID=@ModID) where ModID=@TmpModID
update ModuleBase Set SQNC=@JHSQNC where ModID=@ModID
FETCH LAST FROM ModuleBase_Cursor into @TmpModID
End
FETCH NEXT FROM ModuleBase_Cursor into @TmpModID
END
CLOSE ModuleBase_Cursor
DEALLOCATE ModuleBase_Cursor
IF @@ERROR <> 0
BEGIN
set @result=’操作失败’
END
ELSE
BEGIN
set @result=’操作成功’
END
GO
存储过程是为了在子节点在父节点下上下移动时候使用,
传入值两个@ModID int------节点编号
@Menth nvarchar(5)-------移动方式up或者down
返回值@result,用来输出是否移动成功
实现原理是将移动节点的父节点按顺序排列,如果上移动,找到该移动节点,与上条记录的排序值互换,下移则相反!
这样操作起来在程序的代码中可以不必考虑节点排序的问题,一切让SQL自己做
相关文章推荐
- ASP.net的ItemDataBound事件与LinqToSql数据源关于e.Item.DataItem的类型
- 关于Asp.Net的SQL缓存依赖
- asp.net SqlParameter关于Like的传参数无效问题
- ASP.Net + SQL Server 存储过程实现分页排序
- Asp.net 关于本地发布正常,服务器端SQL语法错误。
- asp.net后台对sql语句排序,筛选,gridview隐藏过长的字符串鼠标放上去显示全部,dropdownlist在前台显示拼接字符串
- 关于SQL语句中的双引号、单引号和&-------asp.net
- 关于SQL Server 2005 与 Asp.net 2.0 中的 SQLCacheDependency 的使用
- 关于在安装ASP.NET Forum中出现的无法排序的问题.
- 关于sql与asp.net文件缓存依赖和sql缓存依赖的相关说明
- 关于asp.net导出Excel
- asp.net 关于更改数据库表的方式
- 关于asp.net中dropdownlist控件选中后在次回传页面后还原到默认
- 关于ASP.NET/C#中对Cookie的操作
- ASP .net+SQL ---日常学习之路001
- 关于ASP.NET中Request.QueryString的乱码问题
- 关于学习asp.net的一些总结
- ASP.NET关于引用bootstrap.css导致Gridview Header无法居中
- 关于ASP.NET MVC的Filter小记
- asp.net中对DataTable数据进行排序、检索、合并、分页、统计