ADODB Recordset记录数>0却始终显示BOF与EOF的问题求助
VBScript查询Active Directory记录集BOF/EOF均为True的问题解决
问题描述
使用VBScript查询Active Directory用户时,执行代码后弹出的MsgBox显示:
Start loop 42, BOF: True, EOF: True
明明RecordCount显示有42条匹配记录,但BOF(指针位于首记录之前)和EOF(指针位于末记录之后)同时为True,无法正常遍历记录集。原代码如下:
set objCmd = createobject("ADODB.Command") set conn = createobject("ADODB.Connection") Set iAdRootDSE = GetObject("LDAP://RootDSE") strDefaultNamingContext = iAdRootDSE.Get("defaultNamingContext") conn.Provider = "ADsDSOObject" conn.Open "Active Directory Provider" Set objCmd.ActiveConnection = conn strFilter = "(&(objectCategory=person)(objectClass=user)(memberof=" & ... & "))" strAttributes = "samaccountname,name,givenName,sn,displayName,streetAddress,postalCode,l,c,Homephone,TelephoneNumber,mail,userAccountControl" strQuery = "<LDAP://" & strDefaultNamingContext & ">" & ";" & strFilter & ";" & strAttributes & ";subtree" objCmd.CommandText = strQuery objCmd.Properties("Page Size") = 1000 objCmd.Properties("Timeout") = 30 objCmd.Properties("Cache Results") = False Set colUsers = objCmd.Execute Msgbox "Start loop " & colUsers.RecordCount & ", BOF: " & colUsers.BOF& ", EOF: " & colUsers.EOF
原因分析
- ADODB针对AD的LDAP查询中,
RecordCount返回的是预估匹配数,而非实际已加载的记录数。记录集初始化后,指针并未自动定位到第一条有效记录,导致BOF和EOF同时为True。 Cache Results=False的配置会禁用记录集缓存,进一步影响了指针的默认初始位置,使得即使有匹配记录,指针也停留在无效区间。
解决方法
1. 手动定位记录指针
获取记录集后,调用MoveFirst方法将指针定位到第一条有效记录,之后即可正常遍历:
Set colUsers = objCmd.Execute ' 先定位到第一条记录,避免指针处于无效区间 If Not colUsers.EOF Then colUsers.MoveFirst Msgbox "Start loop " & colUsers.RecordCount & ", BOF: " & colUsers.BOF& ", EOF: " & colUsers.EOF ' 遍历记录集示例 Do While Not colUsers.EOF ' 读取目标属性,示例为samaccountname WScript.Echo colUsers.Fields("samaccountname").Value colUsers.MoveNext Loop
2. 确认过滤条件有效性
虽然RecordCount有数值,但仍需检查memberof后的组LDAP路径格式是否正确,必须是完整的可分辨名称(如CN=SalesGroup,OU=Groups,DC=contoso,DC=com),避免因过滤条件错误导致实际无有效记录(这种情况下RecordCount可能返回错误的预估数)。
3. 调整缓存设置(可选)
如果不需要实时同步AD数据,可将Cache Results设为True,让记录集缓存结果,有助于指针的正常初始化:
objCmd.Properties("Cache Results") = True
内容的提问来源于stack exchange,提问作者bluefox
相关产品推荐
相关产品推荐

