【问题标题】:Recursive Function Not Returning递归函数不返回
【发布时间】:2026-02-12 02:50:02
【问题描述】:

我希望有人可以在这里使用我所拥有的递归函数来帮助我,它不会像我预期的那样返回 true 或 false。该函数循环遍历其成员的 Active Directory 组,然后在遇到成员资格中的任何组时调用自身以获取其成员。我试图根据是否遇到任何错误但根本没有任何运气来返回真或假。它似乎只是挂起并且永远不会返回到启动递归函数的主调用子。以下是我正在使用的代码:

    Private Sub StartAnalysis(ByVal grp As String, ByVal grpdn As String, ByVal reqid As String)

    Dim searchedGroups As New Hashtable

    'prior work before calling sub

    searchedGroups.Add(grp, 1)
    Dim iserror As Boolean = GetGroupMembers(grpdn, searchedGroups, reqid)

    If iserror = False Then
        'do stuff
    Else
        'do stuff
    End If

    'cleanup

End Sub


    Public Function GetGroupMembers(ByVal groupSearch As String, ByVal searchedGroups As Hashtable, ByVal requestID As String) As Boolean

    Dim iserror As Boolean = False

    Try
        Dim lastQuery As Boolean = False
        Dim endLoop As Boolean = False
        Dim rangeStep As Integer = 999
        Dim rangeLow As Integer = 0
        Dim rangeHigh As Integer = rangeLow + rangeStep

        Do
            Dim range As String = "member"
            If lastQuery = False Then
                range = String.Format("member;range={0}-{1}", rangeLow, rangeHigh)
            Else
                range = String.Format("member;range={0}-*", rangeLow)
                endLoop = True
            End If

            Dim group As SearchResult = QueryObject(groupSearch, range)
            Dim groupCN As String = group.Properties("cn")(0).ToString
            If group.Properties.Contains(range) Then
                For Each member As Object In group.Properties(range)
                    Dim user As SearchResult = QueryObject(member.ToString, "member")
                    Dim userCN = user.Properties("cn")(0).ToString
                    If Not user.Properties.Contains("member") Then
                        Dim userMail = String.Empty
                        If user.Properties.Contains("mail") Then
                            userMail = user.Properties("mail")(0).ToString
                        End If

                        userCN = userCN.Replace("'", "''")
                        Dim qry As String = _
                            "INSERT INTO group_analysis_details (request_id, member_name, member_email, member_group) " & _
                            "values ('" & requestID & "', '" & userCN & "', '" & userMail & "', '" & groupCN & "')"

                        Dim sqlConn As SqlConnection = New SqlConnection(cs)
                        Dim sqlCmd As SqlCommand = New SqlCommand(qry, sqlConn)
                        sqlConn.Open()
                        sqlCmd.ExecuteNonQuery()
                        sqlConn.Close()
                        sqlCmd.Dispose()
                        sqlConn.Dispose()
                    Else
                        If Not searchedGroups.ContainsKey(userCN) Then
                            searchedGroups.Add(userCN, 1)
                            iserror = GetGroupMembers(user.Properties("distinguishedname")(0).ToString, searchedGroups, requestID)
                            If iserror = True Then Return iserror
                        Else
                            searchedGroups(userCN) += 1
                        End If
                    End If
                Next
            Else
                lastQuery = True
            End If

            If lastQuery = False Then
                rangeLow = rangeHigh + 1
                rangeHigh = rangeLow + rangeStep
            End If

        Loop While endLoop = False
        Return iserror
    Catch ex As Exception
        myEvents.WriteEntry("Error while analyzing the following group: " & groupSearch & vbCrLf & vbCrLf & _
            "Details of the error are as follows: " & ex.Message, EventLogEntryType.Error)
        Return True
    End Try

End Function

希望有人能指出我可能犯错误的地方。

谢谢, 罗恩

【问题讨论】:

  • 你有一个 SQL 注入漏洞。
  • 请尽量减少您的代码行数!例如。就您的问题而言,con.open、execute、close、dispose 似乎非常不必要。您的子 StartAnalysis(..) 怎么样,您的问题似乎不需要它 - 如果它未使用,请删除它!提前谢谢!
  • 我添加了启动分析子例程来显示调用例程到函数的流程。我已修改删除 SQL 信息以减少行数。
  • SLaks - 感谢您的关注,但用于 SQL 语句的输入在我的代码中受到限制,并且不是由用户手动输入的。
  • 调试 + 全部中断。 Debug + Windows + Threads 并选择主线程。发布堆栈跟踪。

标签: vb.net recursion return


【解决方案1】:

通常,如果您使用“Do...Loop While”并在循环内手动设置退出条件,则很容易陷入无限循环,从而导致程序挂起。

看起来您在所有情况下都没有设置endloop = True。尝试将其更改为 Exit Do 并在您拥有的各种条件中添加一个。需要进行一些试验和错误才能使其正确。

也是为了让您的生活更轻松,将数据库插入代码提取到单独的函数中,并在需要时调用它。

【讨论】:

  • 谢谢,我确实最终对它进行了一些修改,并结合使用了 Exit 语句。这帮助我指明了正确的方向。