帮我看看这段递归调用代码出错在哪里。

truezerg 2010-01-26 12:11:39
想显示一个树形结构菜单。生成类似如下的代码
<ul>
<li><a href="http://www.dynamicdrive.com">Item 1</a></li>
<li><a href="#">Folder 0</a>
<ul>
<li><a href="#">Sub Item 1.1</a></li>
<li><a href="#">Sub Item 1.2</a></li>
<li><a href="#">Sub Item 1.3</a></li>
<li><a href="#">Sub Item 1.4</a></li>
<li><a href="#">Sub Item 1.2</a></li>
<li><a href="#">Sub Item 1.3</a></li>
<li><a href="#">Sub Item 1.4</a></li>
</ul>
</li>
</ul>

表结构
表名:XiTongGongNeng
字段:
BianMa:功能编码
FuBianMa:父功能编码
LianJieDiZhi: 连接地址
MingCheng: 功能名称


<%
Function getMenu(pFunction)
Dim pf
pf = "" & pFunction
Dim RsGongNeng
Set RsGongNeng = Server.CreateObject("ADODB.Recordset")
RsGongNeng.ActiveConnection = MM_DbMain_STRING
RsGongNeng.Source = "SELECT * FROM XiTongGongNeng WHERE FuBianMa = '" & pf & "' AND IsShow = '1' ORDER BY PaiXu"
RsGongNeng.CursorType = 1
RsGongNeng.CursorLocation = 2
RsGongNeng.LockType = 1
RsGongNeng.Open()

Dim MenuStr
MenuStr = ""
If(RsGongNeng.RecordCount > 0) Then MenuStr = MenuStr + "<ul>"

While ((Not RsGongNeng.Bof) AND (NOT RsGongNeng.EOF))
MenuStr = MenuStr & "<li><a href=""" & RsGongNeng.Fields.Item("LianJieDiZhi").Value & """>" & RsGongNeng.Fields.Item("MingCheng").Value & "</a></li>"

'此处递归调用
MenuStr = MenuStr & getMenu(RsGongNeng.Fields.Item("FuBianMa").Value & "")
RsGongNeng.MoveNext()
Wend

If(RsGongNeng.RecordCount > 0) Then MenuStr = MenuStr + "</ul>"
getMenu = MenuStr
End Function
%>

<%
response.Write(getMenu("0"))
%>
...全文
123 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
truezerg 2010-01-26
  • 打赏
  • 举报
回复
我晕, 我知道错在哪了。这里
MenuStr = MenuStr & getMenu(RsGongNeng.Fields.Item("FuBianMa").Value & "")
应该改成
MenuStr = MenuStr & getMenu(RsGongNeng.Fields.Item("BianMa").Value & "")

我真是太粗心了,谢谢babyt
阿泰 2010-01-26
  • 打赏
  • 举报
回复
如果我没看错,这是个死循环。

Function getMenu(pFunction)
Dim pf
pf = "" & pFunction
RsGongNeng.Source = "SELECT * FROM XiTongGongNeng WHERE FuBianMa = '" & pf & "' AND IsShow = '1' ORDER BY PaiXu"

...
MenuStr = MenuStr & getMenu(RsGongNeng.Fields.Item("FuBianMa").Value & "")
End Function

假设传入参数为1,sql语句返回5条记录。
RsGongNeng.Fields.Item("FuBianMa").Value 的值永远为1.
这里貌似可以不用递归。
或者你的递归里面,少了几个菜单的层级限定等等。
truezerg 2010-01-26
  • 打赏
  • 举报
回复
去掉递归调用那句,一切正常。数据库连接正常
renzaijiang 2010-01-26
  • 打赏
  • 举报
回复
数据连接字符串问题 报引擎错误啊
truezerg 2010-01-26
  • 打赏
  • 举报
回复
报错信息为:

错误类型:
Microsoft JET Database Engine (0x80004005)
未指定的错误

各位高人帮我找找错误在哪里。谢谢了
junshanhudazhaxi 2010-01-26
  • 打赏
  • 举报
回复
上面的那个循环
do while ...
...
wend '这个wend换成loop,是我搞错了
junshanhudazhaxi 2010-01-26
  • 打赏
  • 举报
回复
还有几点要说明的是:
1.
Dim pf
pf = "" & pFunction
你这句为什么要这样?
2.
RsGongNeng.Fields.Item("LianJieDiZhi").Value
这样写法也太长了吧!直接rs("LianJieDiZhi")就可以了
3.
记录集打开之后最好关闭
4.
While ((Not RsGongNeng.Bof) AND (NOT RsGongNeng.EOF))
这句直接 while not rsGongNeng.eof就可以了
junshanhudazhaxi 2010-01-26
  • 打赏
  • 举报
回复
<%
Function getMenu(pFunction)
Dim RsGongNeng
Set RsGongNeng = Server.CreateObject("ADODB.Recordset")
RsGongNeng.ActiveConnection = MM_DbMain_STRING
RsGongNeng.Source = "SELECT * FROM XiTongGongNeng WHERE FuBianMa = '" & pFunction & "' AND IsShow = '1' ORDER BY PaiXu"
RsGongNeng.CursorType = 1
RsGongNeng.CursorLocation = 2
RsGongNeng.LockType = 1
RsGongNeng.Open()

Dim MenuStr
MenuStr = ""

DO while NOT RsGongNeng.EOF
MenuStr = MenuStr & "<li><a href=""" & RsGongNeng("LianJieDiZhi") & """>" & RsGongNeng("MingCheng") & "</a></li>"
MenuStr = MenuStr & getMenu(RsGongNeng("BianMa"))
MenuStr = MenuStr & "</li>"
RsGongNeng.MoveNext()
Wend

if MenuStr <> "" then
MenuStr = "<ul>" & MenuStr & "</ul>"
end if

'这里最好关闭下
RsGongNeng.close
set RsGongNeng

getMenu = MenuStr
End Function
%>

<%
response.Write(getMenu(0))
%>
WGDH1234 2010-01-26
  • 打赏
  • 举报
回复
定下
renzaijiang 2010-01-26
  • 打赏
  • 举报
回复
每次都查数据库 效率也太低了吧 一次查出来 丢数组里去 生成树
不过asp数组操作超麻烦的 不说也罢 还是php好啊

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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