【问题标题】:Adding ADODB RecordSet item to Collection将 ADODB RecordSet 项添加到集合
【发布时间】:2016-10-10 21:38:16
【问题描述】:

我是 VBA 新手,正在尝试通过 Microsoft 的 ACE OLEDB Provider 围绕 Excel 电子表格编写 Outlook 宏。我在查询后遍历ResultSet,并将结果存储在Collection 中,如下所示:

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1

Sub Test()
   Dim conn As New ADODB.Connection
   Dim results As New ADODB.Recordset
   Dim values As Object
   Set values = CreateObject("System.Collections.ArrayList")

   conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\Users\me\test.xlsx;" & _
     "Extended Properties=""Excel 12.0; HDR=YES;"""

   results.Open "SELECT * FROM [Sheet1$]", _
     conn, adOpenStatic, adLockOptimistic, adCmdText
   Do Until results.EOF
     values.Add results.Fields.Item("num")
     Debug.Print Join(values.toArray, ", ")
     results.MoveNext
   Loop
End Sub

以下test.xlsx

我们得到:

1
2, 2
3, 3, 3
4, 4, 4, 4
5, 5, 5, 5, 5

这似乎与 results.Fields.Item("column_name") 返回一个在每个 MoveNext 处被覆盖的引用一致,并且该引用是存储在 values 中的内容。

对 VBA 中的引用/值机制不太熟悉,这个猜测是否正确,有什么方法可以代替存储值吗?

【问题讨论】:

    标签: vba reference oledb adodb recordset


    【解决方案1】:

    这段代码还能编译吗?

    我从来没有听说过ADODB.Resultset,除非这是.NET??? 你必须参考什么库才能找到这个对象?

    您是否尝试引用记录集?

    您正在使用Dim result As New ADODB.ResultSet 那么

    result.Open "SELECT * FROM [Sheet1$]"

    但您的循环使用复数“results”

    【讨论】:

    • IIRC 我引用 Microsoft ActiveX Data Objects [6.1] 回复:this Office Space。该示例并非 100% 忠实于实时代码,但我希望该问题足够普遍以识别表单。感谢您指出result 失误!
    • 我认为您需要复制代码,然后对其进行编辑以供您使用。那篇文章中没有 ResultSet - 它在那里也被称为 Recordset。作为将来的参考点,我们不是在这里对甚至没有自己测试过的代码进行故障排除。一旦你开始它,将调试连接语句放在循环之外可能会更好 - 但现在这只是一个很大的猜测
    • 很公平,我承认我最初是匆忙问的。在我的工作机器上,我现在能够使用更新的示例重现该行为。
    • 正如我之前建议的 - 将您的调试语句放在循环之外
    • 在这种情况下我不能——可能是因为数组引用了 results.Fields.Item,它会出现“BOF 或 EOF 为真......”的错误。
    【解决方案2】:

    我知道这是一个旧线程,但它是 Google 上的最高结果,所以答案可能是有序的。

    当您使用 results.Fields.Item("column_name") 或 results!column_name 从记录集中将项目添加到集合时,它会作为引用添加,因此当集合查找值时,它会得到相同的结果及以上(此外,如果您关闭记录集,您将在每个索引处收到 EOF 错误)。

    相反,您需要做的是添加字段值

    MyCollection_.Add results.Fields("column_name").value

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-15
      • 2016-08-13
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      相关资源
      最近更新 更多