Class LDAP-Active Directory-我可以/应该使用类吗?

Class LDAP-Active Directory-我可以/应该使用类吗?,class,vba,ms-access,active-directory,ldap,Class,Vba,Ms Access,Active Directory,Ldap,我使用LDAP的最初目的是返回当前为活动员工的指定组的所有活动成员 我找到了这个解决方案: Public Const ADConString = "Provider=ADsDSOObject; Encrypt Password=False; Integrated Security=SSPI; Data Source=

我使用LDAP的最初目的是返回当前为活动员工的指定组的所有活动成员

我找到了这个解决方案:

Public Const ADConString = "Provider=ADsDSOObject;
                            Encrypt Password=False;
                            Integrated Security=SSPI;
                            Data Source=
                            LDAP://Domain:Numbers/DC=ROOT,
                            DC=Someplace,OU=SomePlace;
                            Mode=Read
                            Bind Flags=0;ADSI Flag=-2147483648"


Public Function getActiveDirectoryGroup(groupName As String)

Dim cmd As ADODB.Command
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim test As Variant

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

cn.Open ADConString 

cmd.CommandText = 
      "SELECT sn,adspath,cn,givenname,userAccountControl 
          FROM 'LDAP://RootPlace _
          "WHERE MemberOf='cn=" & groupName & 
          ",CN=SomePlace,DC=KMC,DC=SomePlace' " & _
          "AND userAccountControl<>514
           AND sn <>'name1' AND sn <>'name2' 
           AND sn           <>'name3' " & _
          "ORDER BY givenname"

Debug.Print cmd.CommandText

cmd.ActiveConnection = cn

Set rs = cmd.execute
groupPath = rs.Fields("adspath").Value
Do While Not rs.EOF
    'Debug.Print rs.Fields("adspath").Value
    Debug.Print rs.Fields("givenname").Value & " " 
        & rs.Fields("sn").Value & "     " 
        & rs.Fields("userAccountControl")
    'Debug.Print rs.Fields("cn").Value

rs.MoveNext
Loop

End Function
我对类有点生疏,我不太确定如何在这个类中引入动态
WHERE
语句。那么,我应该继续这条路吗?如果是这样的话,我可以考虑什么样的解决方案来处理<代码> 子句?< /P>
我在考虑使用一些草率的东西,比如一个setter,它将用户发送的内容附加到一个新的
whereStatement
private变量,这样它就可以一直附加到
WHERE
子句。我担心的是,如果没有完全清楚,我将无法删除单个条件语句,例如
sn'Name1'

您可以
重载该函数。
也许你正在寻找这样的东西:

Function getActiveDirectoryGroup(Optional groupName as string)

    Dim sQuery as string        

    if LenB(groupname) = 0 then 
        sQuery = "<general sql statement>"
    else
        sQuery = "<sql statement with conditions>"
    end if 

End Function
函数getActiveDirectoryGroup(可选组名为字符串)
像细绳一样模糊
如果LenB(groupname)=0,则
sQuery=“”
其他的
sQuery=“”
如果结束
端函数
编辑

函数>如在C++中,在C++中,可以使用更广泛的OOP语言,如C++、C语言和java。
但是,使用可选参数,可以模拟行为

与标准模块相比,VBA中的类没有什么优势,特别是对于您在这里尝试做的事情。在VBA中,我认为类是将密切相关的函数/方法和属性组合到一个可重用的“容器”中的一种方式。在我的大多数课程中,我首先从一个标准模块中获得我需要的东西,然后在实际完成后将其转换为一个类。对于类,您可以设置一组属性,然后运行其中一个方法,而对于模块,您需要将所有属性作为参数传入,或者使用全局变量,或者使用自定义类型或类来保存属性。是的,类在这方面有一点优势,但主要是对程序员而言。在您的例子中,类不提供标准模块不提供的任何特性

如果你继续你的课堂想法,这当然是一个可以接受的建议,我认为你实际上应该继续你在问题末尾提出的“草率”想法。我认为这可以称为“谓词生成器”方法/函数。如果您想要在不清除整个内容的情况下删除特定标准的能力,那么您必须在自己身上构建这个功能。当您使用谓词生成器函数添加条件时,只需将每个附加条件放入某种容器对象中,如装配的ADO记录集、字典对象或数组。通过这种方式,您可以始终查看结构/容器并添加、编辑或删除条目。然后需要一个小函数来循环遍历容器并构造完整的WHERE语句


但请记住,在这种情况下,一门课对你的帮助很小。是的,它可以让您封装和隐藏一些底层机制。例如,当您添加一个条件时,它将被附加到调用代码不必知道的某种私有容器/结构/变量。然后,当您再次调用Get方法时,您的调用代码不需要知道标准是如何存储、制作等的。但是,您也应该能够在没有类的情况下完成所有这些工作,尽管它将更加“松散”,而且肯定不太理想。

还有一件事我不确定您是否知道,但这可能对你非常有用;也许这就是你最终想要的

的确,使用类模块对此并没有多大用处,因为创建此对象的多个实例没有实际用途。
然而,尽管VBA没有实现静态类的概念,但您可以使标准模块的行为类似于C#中所谓的“静态类”

考虑一下C#中静态类的定义:

静态类与非静态类基本相同,但有一个区别:静态类不能实例化。在里面 换句话说,您不能使用new关键字创建 班级类型。因为没有实例变量,所以可以访问 使用类名本身创建静态类的成员。例如 如果您有一个名为UtilityClass的静态类 名为MethodA的公共方法,可以调用 以下示例:

C#
UtilityClass.MethodA();
作为这一概念的证明,请尝试以下内容:
将相同的代码放入两个标准模块中,并将它们称为
m_Class
m_Class 2

Option Explicit

Private m_Number As Long

Public Function store_number(value As Long)

m_Number = value

End Function

Public Function get_number()

get_number = m_Number

End Function
现在,创建第三个标准模块,该模块存储以下两个子模块:

Sub test()


m_Class.store_number (10)
m_Class2.store_number (5)

End Sub

Sub test_2()

MsgBox (m_Class.get_number)
MsgBox (m_Class2.get_number)

End Sub
我想在这个测试中指出的是,两个标准模块实际上都是两个独立的实例,具有各自的私有属性,每个实例实现相同的功能。
因此,您会注意到,标准模块的行为非常类似于静态类(尽管其内部底层机制不同)

我建议您创建一个标准模块并实现此逻辑。

我确实认为创建这样一个“静态”类很有用,因为正如您所提到的,您将大量重复使用它,而不需要该类的多个实例。

我的目标是动态更改用户返回的内容。有时我希望返回一个组,其中的非活动用户名称中有abc字样,但有时我希望做一些完全不同的事情。我使用该类的目标是允许用户轻松地动态构建他们想要的内容。这个解决方案的问题是,它最终会导致一个非常嵌套的if语句树和大量的选项
Sub test()


m_Class.store_number (10)
m_Class2.store_number (5)

End Sub

Sub test_2()

MsgBox (m_Class.get_number)
MsgBox (m_Class2.get_number)

End Sub