2011-11-28 190 views
0

我希望有人可以帮助我在这里递归函数我没有返回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 

希望有人能指出我可能会犯的错误是什么。

谢谢你,罗恩

+0

您有一个SQL注入漏洞。 – SLaks

+2

请尽量减少您的代码行数!例如。 con.open,执行,关闭,处置在您的问题上似乎相当不必要。那么你的子StartAnalysis(..)呢,似乎你不需要它的问题 - 请删除它,如果它未被使用! thx提前! –

+0

我添加了开始分析子例程来显示调用例程到函数的流程。我已修改删除SQL信息以减少行数。 –

回答

0

一般来说,如果您使用的是“做......循环while”和手动设定退出条件的循环中它很容易陷入一个无限循环这是什么原因该程序挂起。

看起来你在所有情况下都没有设置endloop = True。尝试将其更改为Exit Do,并将其添加到您拥有的各种条件中的每一个。一些试验和错误将需要得到它恰到好处。

此外,为了让您的生活更轻松地提取数据库插入代码到一个单独的功能,并在需要时调用它。

+0

谢谢,我确实最终修改了一下,并使用了与它结合的Exit语句。这帮助我指出了正确的方向。 –