2013-07-08 3 views
1

Я пытаюсь запросить LDAP из Excel с помощью VBA. Это хорошо работает, когда я выборку записей по CN, используя ключевое слово OR, но с ключевым словом IN это не удается:Использование ключевого слова IN в запросах для LDAP (VBA)

Сбой (ошибка 80040E14):

Function GetUsersProperty(ByVal users As String, ByVal returnField As String) 

    Dim usersProperty As New Collection 

    Set cmd = CreateObject("ADODB.Command") 
    Set cn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 

    cn.Open "Provider=ADsDSOObject;" 

    cmd.CommandText = _ 
     "SELECT cn, " & returnField & _ 
     " FROM 'LDAP://" & GetObject("LDAP://RootDSE").get("defaultNamingContext") & _ 
     "' WHERE objectClass = 'User' AND objectCategory = 'Person' AND cn IN (" & users & ")" 
     'assuming there are multiple users names in colons inside 'users' separated with comma 

    cmd.ActiveConnection = cn 

    Set rs = cmd.Execute 

    'On Error Resume Next 
    While rs.EOF <> True And rs.BOF <> True 
     usersProperty.Add Item:=rs.Fields(returnField).Value, Key:=rs.Fields("cn").Value 
     rs.MoveNext 
    Wend 

    Set GetUsersProperty = usersProperty 

    Set cmd = Nothing 
    Set cn = Nothing 
    Set rs = Nothing 

End Function 

работы, если я заменю WHERE под cmd.CommandText с

 "' WHERE objectClass = 'User' AND objectCategory = 'Person' AND (cn = " & user1 & " OR cn = " & user2 & ")" 

Проблема в том, что я, что использовать IN из-за более легкого понимания и упрощения составления списка. Можно ли это сделать?

+0

Я не думаю, что проблема VBA связаны. Поскольку ваш код компилируется и выполняется, в коде нет ничего плохого. Если это не работает, как ожидалось, это другая проблема, но вы тоже не сталкиваетесь с этим. Я рекомендую вам ознакомиться с оператором [IN] (http://www.w3schools.com/sql/sql_in.asp) как часть SQL-запроса. –

+0

Спасибо, мне. Использование оператора IN верное, насколько я могу видеть. Проблема в том, что команда 'cmd.Execute' не принимает ее, и я не знаю, как это сделать. –

ответ

0

Я нашел ответ на свой вопрос - действия, которые я хотел бы сделать, невозможны из-за ограничений архитектуры LDAP.

Существует очень хорошая статья, описывающая то, что не следует ожидать при запросе LDAP: http://mysqldump.azundris.com/archives/74-LDAP-is-not-relational.html