You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中无法绑定Recordset到DataGridView及代码报错求助

解决VB.NET中ADSI查询结果绑定DataGridView的问题

核心问题处理

你遇到的两个关键问题可以通过以下方式解决:

1. 修复SearchScope属性赋值报错

在VB.NET中操作ADSI Command对象的属性时,必须通过.Value属性赋值,原代码修改为:

oCommand1.Properties("SearchScope").Value = 2

(数值2对应ADS_SCOPE_SUBTREE,表示递归搜索整个目录树)

2. 将COM类型RecordSet转换为.NET DataTable

DataGridView无法直接绑定COM类型的RecordSet,需要先把查询结果迁移到.NET原生的DataTable中,再进行绑定。

修改后的完整可运行代码

Imports System.Data
Imports ADODB ' 需添加COM引用:Microsoft ActiveX Data Objects x.x Library(建议选最新版本如6.1)

' 方法内执行代码
Dim oConnection1 As New ADODB.Connection()
Dim oCommand1 As New ADODB.Command()
Dim rs As ADODB.Recordset
Dim strQuery As String
Dim dt As New DataTable()

' 打开AD连接
oConnection1.Provider = "ADsDSOObject"
oConnection1.Open("Active Directory Provider")

oCommand1.ActiveConnection = oConnection1

' 构造AD查询语句
strQuery = "select c, l, SAMAccountName,displayName, distinguishedName, cn, sn,givenName,title,mail, department, manager, userAccountControl " &
" from 'GC://dc=TestAD,dc=net'" &
" WHERE objectCategory='Person'" &
" AND objectClass='user'"

oCommand1.CommandText = strQuery
' 修复SearchScope属性赋值
oCommand1.Properties("SearchScope").Value = 2

' 执行查询
rs = oCommand1.Execute()

' 将RecordSet数据填充到DataTable
' 生成DataTable列
For Each fld As ADODB.Field In rs.Fields
    dt.Columns.Add(fld.Name, GetType(String))
Next

' 逐行填充数据
rs.MoveFirst()
While Not rs.EOF
    Dim dr As DataRow = dt.NewRow()
    For Each fld As ADODB.Field In rs.Fields
        dr(fld.Name) = If(IsDBNull(fld.Value), DBNull.Value, fld.Value)
    Next
    dt.Rows.Add(dr)
    rs.MoveNext()
End While

' 绑定到DataGridView并更新计数
lblRecords.Text = dt.Rows.Count.ToString()
DataGridView1.DataSource = dt

' 释放COM资源,避免内存泄漏
rs.Close()
oConnection1.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(rs)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oCommand1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oConnection1)

注意事项

  • 必须添加ADODB引用:右键项目→添加引用→COM→找到Microsoft ActiveX Data Objects x.x Library并勾选
  • 处理空值时用If(IsDBNull(...))避免类型转换错误
  • 手动释放COM对象,防止.NET运行时无法自动回收资源

内容的提问来源于stack exchange,提问作者RKh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:46:00