嵌套调用自身的子过程实现层级显示
所有的地点信息,无论是国家还是城市,都存储在表place里,每个地点由主键id标识,字段upid记录了这个地点的上级地点的id。最上级地点的upid字段为空。
现在要求显示一个地点,包括它的所有上级地点。比如需要得到如下结果:
中国 > 云南 > 昆明 > 五华区思路其实很简单,用嵌套自身的子过程就能实现。只有关键的一点:控制循环的结束。当进行一次循环时,判断upid字段是否为空,为空则停止循环。将每次循环读取的地点信息累加赋值给字符串变量。
代码如下:
1
Private Sub Show_UpPlace()Sub Show_UpPlace()Sub Show_UpPlace()Sub Show_UpPlace(ByVal newID)
2
3
txtSQL = "select * from place where id='" & newID & "'"
4
cnn = New SqlClient.SqlConnection(ConfigurationSettings.AppSettings("objconnstr"))
5
cmd.Connection = cnn
6
cmd.Connection.Open()
7
cmd.CommandText = txtSQL
8
rdr = cmd.ExecuteReader()
9
10
If rdr.Read() = True Then
11
strUpName = rdr("name") & strUpName
12
13
If Not rdr("upid") Is DBNull.Value Then
14
Dim newUpID As Integer
15
newUpID = rdr("upid")
16
rdr.Close()
17
cmd.Dispose()
18
cnn.Close()
19
20
strUpName = " > " & strUpName
21
22
Show_UpPlace(newUpID)
23
24
End If
25
26
End If
27
28
rdr.Close()
29
cmd.Dispose()
30
cnn.Close()
31
32
End Sub

Private Sub Show_UpPlace()Sub Show_UpPlace()Sub Show_UpPlace()Sub Show_UpPlace(ByVal newID)2

3
txtSQL = "select * from place where id='" & newID & "'"4
cnn = New SqlClient.SqlConnection(ConfigurationSettings.AppSettings("objconnstr"))5
cmd.Connection = cnn6
cmd.Connection.Open()7
cmd.CommandText = txtSQL8
rdr = cmd.ExecuteReader()9

10
If rdr.Read() = True Then11
strUpName = rdr("name") & strUpName12

13
If Not rdr("upid") Is DBNull.Value Then14
Dim newUpID As Integer15
newUpID = rdr("upid")16
rdr.Close()17
cmd.Dispose()18
cnn.Close()19

20
strUpName = " > " & strUpName21

22
Show_UpPlace(newUpID)23

24
End If25

26
End If27

28
rdr.Close()29
cmd.Dispose()30
cnn.Close()31

32
End Sub