使用 VBA 的 ADO 连接无法检索共享点列表中的所有记录

ADO connection using VBA unable to retreive all records in sharepoint list

标题说明了一切。我已使用 VBA 中的 ADO 连接连接到共享点列表。我已经将记录集的游标位置设置为 adUseClient 并正确设置了整个 recordCount 但问题是由于某种原因我只能访问第一条和最后一条记录。我正在尝试将所有记录直接显示到列表框。

即使在多次 getRows 之后我的 BOF 始终为假,而我的 EOF 在第一个 getRows 之后立即变为真。只有 movePrevious 可以完成,但 BOF,EOF 仍然分别始终为 False,True。

更奇怪的是,如果我将所有记录导入工作表,所有记录都在那里。

编辑:这是我的代码

Dim connection As Object
Dim rs As Object
Dim query As String
Dim i As Variant           'holds the getrows       
Set connection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

connection.Open "Provider=Microsoft.ACE.OLEDB.12.0; WSS; IMEX=4; RetrievedIds=Yes; DATABASE= <sharepoint link>;LIST={GUID};"

query = "Select * From [Table];"

rs.CursorLocation = 3
rs.Open query, connection
rs.MoveFirst

MsgBox rs.BOF
MsgBox rs.EOF
i = rs.GetRows
MsgBox rs.BOF
MsgBox rs.EOF
rs.MovePrevious
i = rs.GetRows
MsgBox rs.BOF
MsgBox rs.EOF
rs.MovePrevious

Form.Listbox.List = i

如果只想从记录集中读取数据,代码就非常简单了。你不需要关心 CursorLocation 也不需要执行任何移动操作。命令 GetRowsall 条记录中读取 all 字段到二维数组中。无需检查 BOFEOF - 除非您需要捕获查询 returns 根本没有数据的情况(在这种情况下, BOFEOF 都是 True).

也不需要提前创建记录集,connection.Execute方法创建并returns一个记录集(当然,你的方法也可以)。

关于 GetRows 返回的二维数组的一件事:第一个索引是 字段 索引,第二个索引是 索引。 ListBox.List 期望它反之亦然,因此您必须在分配数据时使用 Transpose

Dim connection as Object, rs as Object
Set connection = CreateObject("ADODB.Connection")

connection.Open "<your connection string>"
Dim query As String
query = "Select * From [Table];"
Set rs = conn.Execute(query)

If rs.EOF or rs.EOF Then
    ... no data found...
Else
    Dim data
    data = rs.GetRows
    Form.Listbox.List = WorksheetFunction.Transpose(data)
End If

备注:我目前没有可用的 Sharepoint Table,但已经使用过它并且行为与其他数据源没有什么不同,所以我希望这段代码对你有用。再次使用 Excel Sheet.

查询对其进行了测试

另注:我一直提倡使用早期绑定。添加对“Microsoft ActiceX 数据对象”的引用(工具 -> 引用)并将第一行更改为

Dim connection as ADODB.Connection, rs as ADODB.RecordSet
Set connection = New ADODB.Connection

更新 如果您的某些字段为空 (NULL),WorksheetFunction.Transpose 会引发类型不匹配。改用一个小的替换例程:

Function myTranspose(a As Variant) As Variant
    ReDim b(LBound(a, 2) To UBound(a, 2), LBound(a, 1) To UBound(a, 1))
    Dim i As Long, j As Long
    For i = LBound(a, 1) To UBound(a, 1)
        For j = LBound(a, 2) To UBound(a, 2)
            b(j, i) = a(i, j)
        Next
    Next
    myTranspose = b
End Function

对于早期绑定和后期绑定:没有人需要手动启用引用,VBA 项目“知道”需要它并在 运行 在另一台计算机上时保留该信息。仅当您使用安装在不同路径上的引用时才必须执行此操作(对于某些 AddOns 可能是这种情况),但所有标准办公室和 windows 引用都会自动找到。