嵌套循环从数据库中读取数据为空,期待您的解答

wokao112358 2009-09-17 04:08:58

Private Sub CreateMenuTree()
On Error GoTo ex
Dim adoValue As New ADODB.Recordset

Dim ProjCode As String
Dim ProjName As String
Dim CoCode As String
Dim TradeName As String

TVMenu.Nodes.Clear

Set TradeMenu = New ADODB.Recordset
Set InterfaceMenu = New ADODB.Recordset

adoValue.Open "select * from kss_proj order by proj_code", db.dbConnect, adOpenStatic, adLockReadOnly, adCmdText

'一级目录
On Error Resume Next
With adoValue
While Not .BOF And Not .EOF
ProjCode = ""
ProjName = ""

ProjCode = Trim(.Fields("proj_code").Value)
ProjName = Trim(.Fields("proj_name").Value)

TVMenu.Nodes.Add , , "1" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile"

'二级目录
TradeMenu.Open "select * from kss_trdinfo where proj_code = '" & ProjCode & "' order by co_code", db.dbConnect, adOpenStatic, adLockReadOnly, adCmdText

On Error Resume Next
With TradeMenu
While Not .BOF And Not .EOF
CoCode = ""
TradeName = ""

CoCode = Trim(.Fields("co_code").Value)
TradeName = Trim(.Fields("trade_name").Value)

TVMenu.Nodes.Add "1" & ProjCode, tvwChild, ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"
TradeMenu.MoveNext
Wend
End With
TradeMenu.Close
Set TradeMenu = Nothing

adoValue.MoveNext
Wend
End With

adoValue.Close
Set adoValue = Nothing

Exit Sub
ex:
MsgBox "取数据时错误[" & Err.Description & "]"
End Sub



我的目的是从数据库中读取内容并且利用TreeView建立一个树形目录;

现在我数据库中有两张表kss_proj和kss_trdinfo两张表,表kss_proj的主键是proj_code,表kss_trdinfo的主键是proj_code和co_code;
kss_proj中的proj_code有两个值“1000”和“2020”;
kss_trdinfo中proj_code=“1000”的co_code有十几个,proj_code = “2020”的co_code也有十几个

现在出现的问题是这样的:adovalue的第一个循环读取到proj_code =“1000”,然后在内嵌循环中也可以读取到每一个co_code;
当proj_code=“1000”循环结束后,进入adovalue的下一个循环proj_code=“2020”,这个时候就有问题了,外层循环能读取到proj_code =“2020”,但是内嵌循环每次读取的co_code都为空,请问这个是为什么?


我觉得是不是在第一次操作TradeMenu这个结果集之后缺少一些类似于回到开头的操作导致的,但是我每次内嵌循环结束后都清空了这个TradeMenu,希望有人能给我解答,谢谢啊!
...全文
125 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
是这样的,谢谢16楼,万分感谢,谢谢所有的哥儿们姐儿们,结贴了
king06 2009-09-17
  • 打赏
  • 举报
回复
ImageList
king06 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wokao112358 的回复:]
按照你的建议,我把On Error Resume Next 去掉以后进行调试,在外层循环第一次运行到TVMenu.Nodes.Add , , "d" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile" 时出错

提示是“未发现元素”,什么原因啊?
[/Quote]
我怀疑是你的图片没对应的,看看你的控件绑定的控件内有没有key值是file和openfile的..
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
按照你的建议,我把On Error Resume Next 去掉以后进行调试,在外层循环第一次运行到TVMenu.Nodes.Add , , "d" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile" 时出错

提示是“未发现元素”,什么原因啊?
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
我查了一下,
建议使用adUseClient
对于这个值的说明是这样的:
使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 adUseClientBatch。
而adUseServer值的说明是:
默认值。使用数据提供者的或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。

--------------------------
当时我取到空的值是否就是因为这个?以后一定记住游标的这个问题

另外,to CityBird:谢谢,你说的有道理,但是我调试了一下,也是不对,提示元素为空
三楼の郎 2009-09-17
  • 打赏
  • 举报
回复
上面那个有点问题,看这个
TVMenu.Nodes.Add , , "1" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile"
改成:
TVMenu.Nodes.Add , , "d" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile"

TVMenu.Nodes.Add "1" & ProjCode, tvwChild, ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"
建议改成:
TVMenu.Nodes.Add "d" & ProjCode, tvwChild, "d" & ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"
三楼の郎 2009-09-17
  • 打赏
  • 举报
回复
treeview里Node的Key参数类型错误,key参数必须是字符串不能是数字,也不能是纯数字的字符串。

TVMenu.Nodes.Add "1" & ProjCode, tvwChild, ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"
建议改成:
TVMenu.Nodes.Add "d" & ProjCode, tvwChild, ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"


TVMenu.Nodes.Add "1" & ProjCode, tvwChild, ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"
建议改成:
TVMenu.Nodes.Add "d" & ProjCode, tvwChild, "d" & ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"

试试
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
to chuifengde:

不好意思啊,我才看到“2级目录”下有这些代码
If TradeMenu.State = adStateOpen Then TradeMenu.Close
TradeMenu.CursorLocation = adUseClient
TradeMenu.Open "select * from kss_trdinfo where proj_code = '" & ProjCode & "' order by co_code", db.dbConnect, adOpenStatic, adLockReadOnly, adCmdText

能够正确运行,谢谢了,马上给分

还有老鸟,谢谢,至于那个错误我希望再给分析一下;
还有第一位给自己代码的仁兄,都谢谢

wokao112358 2009-09-17
  • 打赏
  • 举报
回复
我现在是在给一个已经用了很久的产品增加一些功能,那句出错的代码以前在平台上就有,而且也能正常运行,这个地方出错我觉得不是最关键的,但是它确实出错了,而且我对vb也并不是很熟悉
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
恩,我去掉以后调试了一下,
TVMenu.Nodes.Add , , "1" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile"

执行到这句话的时候有错,可是我想了会,没看出来哪里错,给看下吧
Tiger_Zhao 2009-09-17
  • 打赏
  • 举报
回复
On Error Resume Next 全部去掉,有错误就应该对应。
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
to chuifengde:没有Set TradeMenu = Nothing 这句是不行的,就不能清空原有内容了;

还有,如果就注释掉TradMenu.Close这句的话,和我以前一样没有变化。
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
to chuifengde:是不是我的TVMenu.Nodes.Add 也用错了
TradeMenu.Close
Set TradeMenu = Nothing
我发现这两句被你删了,我试试啊
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
恩,猴哥,在嵌套循环方面有80%像,可是能帮我分析一下出现我那个问题的原因么?谢谢了,为什么第二个内嵌循环读取到的co_code是空的?
chuifengde 2009-09-17
  • 打赏
  • 举报
回复
Private Sub CreateMenuTree()
On Error GoTo ex
Dim adoValue As New ADODB.Recordset
Dim TradeMenu As ADODB.Recordset

Dim ProjCode As String
Dim ProjName As String
Dim CoCode As String
Dim TradeName As String

TVMenu.Nodes.Clear

Set TradeMenu = New ADODB.Recordset

adoValue.CursorLocation = adUseClient
adoValue.Open "select * from kss_proj order by proj_code", db.dbConnect, adOpenStatic, adLockReadOnly, adCmdText

'一级目录

With adoValue
While Not .BOF And Not .EOF
ProjCode = ""
ProjName = ""

ProjCode = Trim(.Fields("proj_code").Value)
ProjName = Trim(.Fields("proj_name").Value)

TVMenu.Nodes.Add , , "1" & ProjCode, "[" & ProjCode & "]" & ProjName, "file", "openfile"

'二级目录
If TradeMenu.State = adStateOpen Then TradeMenu.Close
TradeMenu.CursorLocation = adUseClient
TradeMenu.Open "select * from kss_trdinfo where proj_code = '" & ProjCode & "' order by co_code", db.dbConnect, adOpenStatic, adLockReadOnly, adCmdText

With TradeMenu
While Not .BOF And Not .EOF
CoCode = ""
TradeName = ""

CoCode = Trim(.Fields("co_code").Value)
TradeName = Trim(.Fields("trade_name").Value)

TVMenu.Nodes.Add "1" & ProjCode, tvwChild, ProjCode & CoCode, "[" & ProjCode & "+" & CoCode & "]" & TradeName, "file", "openfile"
TradeMenu.MoveNext
Wend
End With

adoValue.MoveNext
Wend
End With

adoValue.Close
Set adoValue = Nothing

Exit Sub
ex:
MsgBox "取数据时错误[" & Err.Description & "]"
End Sub
chinaboyzyq 2009-09-17
  • 打赏
  • 举报
回复
给你一段我以前写的代码参考一下:

Private Sub treeViewView()
On Error Resume Next

'treeViewbackColor
Dim i As Integer, sumNum As Integer ', Values()
Dim sql As String
sql = "SELECT zdmc FROM ip" 'order by zdmc asc"
openTheTable (sql)
If rst.BOF And rst.EOF Then
Dim tmp As Byte
tmp = MsgBox("无法生站点树,请先设置站点名称!", vbYesNo, "站点名称库为空")
If tmp = 6 Then
Form2.Show 1
MsgBox "请重新启主程序"
End
ElseIf tmp = 7 Then
Exit Sub
End If
End If

rst.MoveFirst

'初始化treeview
TreeView1.HideSelection = True
TreeView1.Indentation = 19 * Screen.TwipsPerPixelX '缩进距离
TreeView1.LabelEdit = tvwManual
TreeView1.LineStyle = tvwRootLines

'---==以下设置节点==---
Dim Node1 As Node, Node2 As Node
Dim dzd_tmp1 As String, dzd_tmp2 As String '大站点
Dim xzd_tmp1 As String '小站点
'填充treeview
Do While Not rst.EOF
DoEvents
If InStr(rst!zdmc, ".") = 0 Then
MsgBox "站点名称添加错误", vbOKOnly, "站点中没有分隔附."
Form2.Show 1
treeViewView
Exit Sub
End If

dzd_tmp1 = Left(rst!zdmc, InStr(rst!zdmc, ".") - 1)
Set Node1 = TreeView1.Nodes.Add(, , , dzd_tmp1, 1) '添加大站点
Do
DoEvents
dzd_tmp2 = Left(rst!zdmc, InStr(rst!zdmc, ".") - 1)
If dzd_tmp2 <> dzd_tmp1 Then
Exit Do
End If
xzd_tmp1 = Mid(rst!zdmc, InStr(rst!zdmc, ".") + 1)
Set Node2 = TreeView1.Nodes.Add(Node1.Index, _
tvwChild, , xzd_tmp1, 2) '添加小站点
rst.MoveNext
If rst.EOF Then Exit Do
Loop
Node1.Expanded = False
Loop
End Sub

wokao112358 2009-09-17
  • 打赏
  • 举报
回复
看来我只能加分了,nnd
wokao112358 2009-09-17
  • 打赏
  • 举报
回复
谢谢各位大哥大姐们,帮帮俺吧,感激不尽啊

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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