地址表中的数据:
A_ID       A_ParentID        A_Name
1               0              北京
2               0              天津
3               1              海淀区
4               3              中关村      
我在类中写了个函数,做用是给一个地区ID(A_ID),返回这个地区的顶层地区ID,比如给4,就返回1:    Dim myDb As New DB
    Dim myDs As New ExtDB.DsSysArea    Function GetAddressID(ByVal AID As Int32) As Int32
        myDs.Clear()
        myDb.FillDsSysArea(myDs)
        Dim A_ID As Int32
        A_ID = GetAddressIDSub(AID) '------GetAddressIDSub(4)返回的本应该是1,可结果是0
        Return A_ID  
    End Function    '由GetAddressID使用
    Private Function GetAddressIDSub(ByVal AID As Int32) As Int32
        Dim ParentID As Int32
        For i = 0 To myDs.Tables(0).Rows.Count - 1
            If AID = CType(myDs.Tables(0).Rows(i)(0), Int32) Then
                ParentID = CType(myDs.Tables(0).Rows(i)(1), Int32)
                If ParentID = 0 Then
                    Return CType(myDs.Tables(0).Rows(i)(0),Int32) ’--到这里还正确,myDs.Tables(0).Rows(i)(0)的值是1
                Else
                    GetAddressIDSub(ParentID)
                End If
                Exit For
            End If
        Next
    End Function在调用GetAddressID时给定的ID是4,GetAddressID调用GetAddressIDSub时返回的值是1,
可是在GetAddressID里执行到A_ID = GetAddressIDSub(AID)时A_ID 的值竟然是0,真是奇怪,请各位帮我看一下什么地方有问题,谢谢!

解决方案 »

  1.   

    不是啊, 返回的是终父结点主ID(A_ID),输入4就应该返回1(A_ID=1)我把代码改成下面的就对了,但我还不知道是什么原因:
    1、定义了一个全局变: Dim AreaID as int32
    2、把GetAddressIDSub返回值部分改为成了:AreaID=CType(myDs.Tables(0).Rows(i)(0),Int32)
    3、GetAddressID函数:
        Function GetAddressID(ByVal AID As Int32) As Int32
            myDs.Clear()
            myDb.FillDsSysArea(myDs)
            GetAddressIDSub(AID)
            Return AreaID
        End Function经过这样改动后结果就正确了,输入4能返回1
    这样看来问题就出在递归中Return CType(myDs.Tables(0).Rows(i)(0),Int32)有正确的值但不能把值返回去。实在是想不通为什么,请各位指点!
      

  2.   

    不好意思有个地方我没说清楚,数据表中有50多条记录,在取值的时候GetAddressIDSub递归了俩次,第二次时用 Return CType(myDs.Tables(0).Rows(i)(0),Int32) 返回值