求助一个很棘手的问题,困扰了我几个小时了

xpp123 2005-10-09 05:40:32
我正在做一个asp.net类似文章系统弄了个无限分类,方法就是最经典的那种数据库中id,name,pid
的方式,现在有一个需求就是删除一个分类需要将其下的所有子类(包括子类的子类)的文章都删除,但是不能用触发器(因为还有别的删除需求——删除一个分类将其子类上移),请问有什么方法能实现这一需求?我参照了不少递归函数,自己也想过,可因为.net datareader不能同时用两个打开的,所以……请各位帮帮忙啦,谢谢大家了
...全文
304 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xpp123 2005-10-09
  • 打赏
  • 举报
回复
谢谢楼上的两位。我现在已经做了不少部分了,在改用XML可能会很麻烦。如果用数据库的话是具体实现? lovevsnet如果你能贴一部分源代码的话将非常感谢,effun你能把思路说得更加清楚一些吗?(具体实现),有回复的话我就结贴了。唉,头疼啊~~~~~~~~~~~~~~~~~
xpp123 2005-10-09
  • 打赏
  • 举报
回复
谢谢楼上的各位,我已经解决了,还是要看看数据结构得书
这和树的遍历有点相似,关键问题是多用个树组保留被删除变量结点值
复杂了不少
effun 2005-10-09
  • 打赏
  • 举报
回复
可以想一些变通的方法,比如用DataTable代替DataReader把数据一次全部读出,再用递归的方法来删除。还有一种方法,可以不用递归,只要删除当前节点就可以了,下面的节点应该会变成孤儿,然后可以立即删除这些孤儿(同步),或者找个时间统一删除所有的孤儿(异步)。
lovevsnet 2005-10-09
  • 打赏
  • 举报
回复
这东东我以前用BCB做过,很烦的,我现在早不那么做了
把分类数据不要放在数据库中,放在xml中要好得多
比如在XML中节点除了Text外再增一属性(比如命名为tag)
tag对应数据库中的一字段,比如是classid
这样删除树型节点时不用什么上移了,比如删除一node
你可以得到该node节点及其所有子,孙节点的tag
stringstartStr="",alltag=getalltag(startStr,node);
这样写sql语句时就好多了,一下就完成所有任务了
"delete ....where classid in alltag"
工作量是我以前程序的1/10也不到,代码行少了很多,以前还得考虑删除行与下一行之间有多少,该行下面的所有节点都要上移,最麻烦了,无限分类用xml比较适合,我现在没搞ASP。NET,只能给你提供这点思路,也不知道对你有无启发
DeltaCat 2005-10-09
  • 打赏
  • 举报
回复
上移, 不就是把 PID 变为 当前 PID 的上一个吗?

有什么疑虑的, 只要考虑一下, 当前PID是不是顶就可以了吧
ye_zi 2005-10-09
  • 打赏
  • 举报
回复
帮你顶
lovevsnet 2005-10-09
  • 打赏
  • 举报
回复
string taglist(TreeNode nd,string tg)
{
string ttg=tg;
if(nd.Tag!=null)
ttg+=","+nd.Tag.ToString();
TreeNode tnd=nd.FirstNode;
while(tnd!=null)
{
if(tnd.Tag!=null)
ttg=taglist(tnd,ttg);
tnd=tnd.NextNode;
}
return ttg;
}
string alltag=taglist(nd,"")将返回nd所有子孙节点的tag,从,开始
所以还得alltag=alltag.substrin(1);这样得到诸如:"0,1,2,11,25,35"的字符串
用SQL时in 后面加括号就是了,我手头没有直接对XML的操作,这是我的一个WINFORM程序中对树和XML的操作
直接操作XML也差不多,我没代码,将node 换成XmlNode
它的tag值:XmlNode.Attributes["tag"].Value
遍历XmlNode用foreach
不能用上面的while
就只能给你这点提示了,不是很难,你以后有空可以对你目前的程序改一下
直接删除节点留下孤儿不是很好的方法
DataReader是不能用的了,DataTable速度又慢,因为遍历时要产生好多DataTable
sukaru 2005-10-09
  • 打赏
  • 举报
回复
看起来没有什么难度 不知道实现起来是否很难.
需求:删除以编号为I的接点为根的子树
实现想法:
使用深度优先算法找出I的所有后代接点(虽然广度优先算法也可以实现 但是似乎深度优先算法会快一些)保存在一张临时表中 然后把所有这些后代接点删除 最后删除I.
cw888 2005-10-09
  • 打赏
  • 举报
回复
给你一个思路:要删除一个分类结点,以这个结点为数根看成一颗树,用递归遍历找出所有的子结点,取得子结点的ID依次删除就可以了!
xpp123 2005-10-09
  • 打赏
  • 举报
回复
顶一下,有人知道吗?

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧