【问题标题】:Add data to ADODB Recordset dynamically动态添加数据到 ADODB 记录集
【发布时间】:2020-01-24 19:06:12
【问题描述】:

我想知道是否可以使用命名范围列表将数据添加到 ADODB 记录集,而无需在单独的行中指定名称。

我已尝试评估名称,但记录集将我的变量作为评估它的名称。 这会导致错误,因为数据库中没有我的变量名。

Set rst = New ADODB.Recordset

SqlStr = "SELECT * From " & table & ";"
rst.Open SqlStr, conn, adOpenDynamic, adLockOptimistic 'adLockPessimistic

If rst.EOF Then
    rst.AddNew
End If

namedCells = Array("orgNr", "name")

With rst
    For i = LBound(namedCells) To UBound(namedCells)
        MsgBox (namedCells(i) & " = " & Range(namedCells(i)))
        !orgNr = Range(namedCells(i)) 'works fine
        !namedCells(i) = "!orgNr" 'gives error du to "namedCells(i)" is not present in database
    Next i
End With

【问题讨论】:

    标签: sql excel vba recordset


    【解决方案1】:

    您可以尝试使用 .fields :

    For i = LBound(namedCells) To UBound(namedCells)
        MsgBox (namedCells(i) & " = " & Range(namedCells(i)))
        rst!orgNr = Range(namedCells(i)) 'works fine
        rst.fields(namedCells(i)) = Range(namedCells(i))
    Next i
    

    【讨论】:

    • 这正是我想要的 :) 谢谢!
    【解决方案2】:

    ! bang 运算符只是隐式默认成员调用的简写符号。

    当你这样做时:

    Debug.Print rs!SomeField
    

    真正发生的事情是这样的:

    Debug.Print rs.[Default].[Default]("SomeField").[Default]
    

    三个隐式默认成员调用 - 第一个针对Recordset 对象的是Recordset.Fields 属性,它产生一个Fields 对象引用,它本身有一个默认成员Item,它接受一个String 参数- ! bang 运算符将其后面的标识符作为此字符串参数的值传递(这就是为什么如果它不是有效的 VBA 标识符名称,您需要将其括在方括号中) - 此 Item 成员产生 @987654333 @ 对象,也有一个默认成员,Value。所以完整拼写的 bang 运算符符号变为:

    Debug.Print rs.Fields.Item("FieldName").Value
    

    现在, 参数化(/indexed)的默认成员调用通常被认为是好的,所以这也是完全可以的:

    Debug.Print rs.Fields("FieldName").Value
    

    其他任何事情都涉及隐式默认成员调用,并使您的代码说一件事......实际上做另一件事。

    请注意,您在该 sn-p 中的这些不合格的 Range 调用是 implicitly referring to whatever the ActiveSheet is,这是一个极其常见的错误来源。

    请参阅Modern VBA Best Practices: Default Members,了解有关默认成员及其周围最佳实践的更多信息(我写了那篇文章)。

    【讨论】:

    • 感谢您花时间写这篇文章。提供一些背景信息真的很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多