日期:2014-05-18  浏览次数:20479 次

从datatable中返回无极分类的路径有什么简单的办法?
有一个datatable表,其中有directoryid     directoryname     parentid

给任一directoryid时,要求返回该分类的完整路径,即从根分类到当前分类


我使用递归的办法,总是感觉太耗资源,有没有简单的办法?谢谢

------解决方案--------------------
在同1个表中估计也只能用递归了。
------解决方案--------------------
没有,用递归应该不会太耗资源,毕竟只是内存操作.
------解决方案--------------------
最多叫循环,因为每个子目录只能有一个父目录
dim sqlConn as Data.SqlClient.SqlConnection=new Data.SqlClient.SqlConnection(strConnString)
dim myCommand as Data.SqlClient.SqlCommand=new Data.SqlClient.SqlCommand( "select * from datatable where directoryid= ' "+strDirectory+ " ' ",sqlConn)
dim sqlReader as Data.SqlClient.SqlDataReader=myCommand.ExecuteReader
dim strFullPath as string
strFullPath= " "
while sqlReader.read()
strFullPath= "\ "+sqlReader( "directoryname ")+strFullPath
myCommand.CommandText= "select * from datatable where directoryid= ' "+sqlReader( "parentid ")
sqlReader.close
sqlReader=myCommand.ExecuteReader
end while
------解决方案--------------------
递归吧。。用DataView进行筛选数据。
------解决方案--------------------
把direcotoryId设成下面这种格式就简单多了:

一级ID:01
二级ID:0101
三级ID:010101
四级ID:01010101
0101010101 .....
这样用类似于 where directoryId like '01% '这样的sql语句就选出某一ID的所有子ID了,子ID的前两位就是一级ID,前四位是二级ID,以次类推,当然如果一个级别的ID如果超过100个的话,可以把ID设为三位。
------解决方案--------------------
处了递归,怕是没有什么别的方法了
------解决方案--------------------
我的一般节点不是很多,所以就一次性把所有记录都选出来然后缓存起来,以后都从缓存的数据中取了,速度比访问数据库要快得多,如果用你现在那种设计的话,那必须用递归来取,因为你无法知道一个节点是几级节点,也就无法知道循环几次。

soodex.com速度很不错,消耗cpu厉害可能是程序的问题也可能是数据访问的问题,比如象你上面说的用了递归的话CPU利用率可能会高些。