Class LDAP-Active Directory-我可以/应该使用类吗?
我使用LDAP的最初目的是返回当前为活动员工的指定组的所有活动成员 我找到了这个解决方案: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=
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