.Net递归操作的难题。

renaski 2004-12-12 09:45:37
Public Shared Function bodylist(ByVal topics As Integer, ByVal NavigationPanel As Panel)
Dim db As DB = New DB
Dim sSQL As String
Dim drDB As SqlClient.SqlDataReader
sSQL = "select * from Topic where AutoInc =" & topics
drDB = db.GetDataReader(sSQL)
If drDB.Read() Then
bodylist(drDB.Item("ParentID"), NavigationPanel)
Dim hyl As New HyperLink
NavigationPanel.Controls.Add(New LiteralControl("<td align = right WIDTH: 20%>>>  "))
hyl.ID = drDB.Item("TopicName")
hyl.Text = drDB.Item("TopicName")
If IsDBNull(drDB.Item("TopicUrl")) Then
hyl.NavigateUrl = ""
Else
hyl.NavigateUrl = "javascript:hrefLocation('" & drDB.Item("TopicUrl") & "')"
End If

hyl.ToolTip = IIf(IsDBNull(drDB.Item("TopicTitle")), "", drDB.Item("TopicTitle"))
NavigationPanel.Controls.Add(hyl)
NavigationPanel.Controls.Add(New LiteralControl("<td>"))
drDB.Close()
db.Dispose()
End If
drDB.Close()
db.Dispose()
End Function


db为数据库连接类
drDB为读数据库的方法。

我这段代码用了递归,然后出现了个最大连接池的问题。


原因之所以在
是因为我在没有释放Connection ,而进行了递归,当中又连接Connection。


我尝试过多种方法,未果。
最后我尝试在后面用了db.dispose()释放了,但为什么还会不定时的报错。
有时候是不报错的。

是不是.Net里就不允许用递归操作。
请问有什么办法能够解决吗?谢谢了。
...全文
485 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
renaski 2004-12-13
  • 打赏
  • 举报
回复
饿,谢谢各位,不知道效率如何。
递归如果多的话,就完了。
内存要死掉了。
这个是我用dataSet()最担心的问题。
hiaming 2004-12-13
  • 打赏
  • 举报
回复
leo2003说的方法不错的.

具体的你去微软下载一个树控伯皇例子就行了.例子里很清楚的.
健者天行 2004-12-13
  • 打赏
  • 举报
回复

把数据都先放到DataSet中,

然后,

然后递归时,每次用DataView在DataSet中查询需要的记录处理



自然框架 2004-12-13
  • 打赏
  • 举报
回复
用DataView 存储数里的所有节点,然后用rowfiled (就是过虑了,好像是这么写)取得每个节点的内容。
precipitant 2004-12-13
  • 打赏
  • 举报
回复
这种情况最好不要递归,迭代来做虽然麻烦,但是稳定。
posemanboy 2004-12-13
  • 打赏
  • 举报
回复
用dataset 比较好,先取数据集,再递归
renaski 2004-12-12
  • 打赏
  • 举报
回复
头大的递归,我灭了他。
用迭加法了。^-^嘻嘻
renaski 2004-12-12
  • 打赏
  • 举报
回复
顺便问一下,
用dataSet()
我递归了以后,会不会递归把dataSet()在内存中的虚拟表给覆盖掉啊。

因为我深怕dataSet()经过递归了后把DataTable给覆盖掉,这样到后来我就白干了。

再说如果成功的话,dataSet()递归,内存中一下子多了那么多表,不知道各算不各算。
挨,又是个问题。

用cache?
我脑子也混了。
自然框架 2004-12-12
  • 打赏
  • 举报
回复
那你就不要用DataReader了
用DataSet吧
renaski 2004-12-12
  • 打赏
  • 举报
回复
不知道为什么,在多个并发数的时候还有这种情况的发生。

是不是什么地方没有考虑进去?
自然框架 2004-12-12
  • 打赏
  • 举报
回复
Public Shared Function bodylist(ByVal topics As Integer, ByVal NavigationPanel As Panel)
Dim db As DB = New DB
Dim sSQL As String
Dim drDB As SqlClient.SqlDataReader
sSQL = "select * from Topic where AutoInc =" & topics
drDB = db.GetDataReader(sSQL)
If drDB.Read() Then
'''''''''''''''''''''''''''''''''''''
'注意这里
'''''''''''''''''''
dim myParentID = drDB.Item("ParentID") as string
dim myTopicName = drDB.Item("TopicName")
dim myTopicUrl = drDB.Item("TopicUrl")
'在这里关掉连接

drDB.Close()
db.Dispose()

......

''''''''''''''''''''''''''
'然后递归
bodylist(myParentID , NavigationPanel)
Dim hyl As New HyperLink
NavigationPanel.Controls.Add(New LiteralControl("<td align = right WIDTH: 20%>>>  "))

'''''''''''''''''''''
'在这里取变量 负值
''''''''''''''''''''''''
hyl.ID = myTopicName '还有这里

hyl.Text = drDB.Item("TopicName")
If IsDBNull(drDB.Item("TopicUrl")) Then
hyl.NavigateUrl = ""
Else
hyl.NavigateUrl = "javascript:hrefLocation('" & drDB.Item("TopicUrl") & "')"
End If

hyl.ToolTip = IIf(IsDBNull(drDB.Item("TopicTitle")), "", drDB.Item("TopicTitle"))
NavigationPanel.Controls.Add(hyl)
NavigationPanel.Controls.Add(New LiteralControl("<td>"))
End If
drDB.Close()
db.Dispose()
End Function
renaski 2004-12-12
  • 打赏
  • 举报
回复
谢谢。jyk(jyk)
我是想做个树。

但你说先放到变量里去,问题是我这些变量也是动态的啊。我该怎么去付值呢?
就是说我怎么去取道这些变量的名称呢?
renaski 2004-12-12
  • 打赏
  • 举报
回复
我尝试过用动态变量来把第一次递归取到的值先付值,然后,等到后面要用的时候,再取回来。

但是好像没有想像中的简单,不象ASP可以动态的付变量
eg
dim aa as string
dim i as integer
aa&i =drDB.item("xxx")
这样的话,aa&i会报错。
所以这种方案也搁浅了。

但是效果的本身无法回避递归,只能用递归去实现他

所以....
难道我还要改写到ASP?然后通过ASP在调用回来?
自然框架 2004-12-12
  • 打赏
  • 举报
回复
你是想做一个“树”吧

可以先把数据放到变量里 ,然后关掉connect,然后在调用递归,在给hyl的属性 负值

另外 Dim db As New DB 这么写就可以了吧
本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。本书适合专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。   深入理解T-SQL体系结构,充分利用高级T-SQL查询技术。   本书深入介绍了T-SQL的内部体系结构,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。通过本书提供的最佳实践和示例代码,数据库开发人员和管理员完全可以掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。通过本书,你将学习到如何:理解逻辑和物理的查询处理;使用方法论优化查询;在查询中用TOP选项修改数据;用递归逻辑、具体化路径或嵌套集合解决方案查询特殊的数据结构;通过逻辑难题提高你的逻辑能力并掌握查询问题的核心等。   你将学习到如何:   理解逻辑和物理的查询处理;   使用方法论优化查询;   解决关系分区问题;   使用CTE和排名函数简化及优化解决方案;   用各种技术聚合数据,包括附加属性、旋转、直方图和分组因子;   在查询中用TOP选项修改数据;   用递归逻辑、具体化路径或嵌套集合解决方案查询特殊的数据结构;   通过逻辑难题提高你的逻辑能力并掌握查询问题的核心; 内容简介 本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们将向你揭示基于集合(set-based)查询的强大威力,并解释为什么它比使用游标的过程化编程(procedural programming)更具优势。同时,它还会教你识别使用基于游标解决方案与基于集合解决方案的优劣。   书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。   本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库专业人员。读者可从中学到大量精湛的技巧,这些技巧会充实您的工具箱和编码技能,并让您顺利地开发出高效的解决方案。 作者简介 Itzik Ben-Gan是Solid Quality Learning的首席导师和创始人。他从1999年开始便一直是SQL Server方面的Microsoft MVP,在世界各地讲授 T-SQL查询、编程和查询优化相关的课程,并提供相关咨询服务。他在SQL Server Magazine和MSDN上发表了多篇文章,并被邀请在许多专题会议上做过报告,包括TechEd、DevWeek、PASS和SQL Server Connections。 目录 序 前言 致谢 引言  本书的组织  系统要求  安装示例数据库  更新  代码示例  本书支持 第1章 逻辑查询处理  逻辑查询处理中的各个阶段   逻辑查询处理阶段简介  Customers/Orders场景下的示例查询  逻辑查询处理步骤详解   步骤1:执行笛卡尔乘积(交叉联接)   步聚2:应用ON筛选器(联接条件)   步骤3:添加外部行(Outer Row)   步骤4:应用WHERE筛选器   步骤5:分组   步骤6:应用CUBE或ROLLUP选项   步骤7:应用HAVING筛选器   步骤8:处理SELECT列表   步骤9:应用DISTINCT子句   步骤10:应用ORDER BY子句   步骤11:应用TOP选项  SQL Server 2005中新的逻辑处理阶段   表运算符   OVER子句   集合操作  结论 第2章 物理查询处理  查询处理期间的数据流  编译   Algebrizer   优化   使用查询计划   更新计划  结论   致谢 第3章 查询优化  本章用到的示例数据  优化方法论   分析实例级的等待   联系等待和队列   确定方案   细化到数据库/文件级别   细化到进程级别   优化索引/查询  查询优化工具   syscacheobjects   清空缓存   动态管理对象   STATISTICS IO   测量查询的运

62,046

社区成员

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

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

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

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