我可以使用字符串数组作为记录集中的键吗?

Posted

技术标签:

【中文标题】我可以使用字符串数组作为记录集中的键吗?【英文标题】:Can I use an array of strings as keys in a recordset? 【发布时间】:2012-05-08 13:55:06 【问题描述】:

我在 Access 数据库中有这个小的 VBA 脚本。我想做一些现场比较。在其他语言中,我可以创建一个键数组,然后使用 for..each 循环来测试每个键。像这样的:

string[] myKeys =  "key1", "key2", "key3" ;
foreach(string myKey in myKeys)

    if(myRecordset!myKey == myTable!myKey) DoSomething()

我在 VBA 中尝试过,但它给了我运行时错误 '3265': Item not found in this collection when using the following code:

For Each myKey In myKeys
    If Not IsNull(myR![myKey]) Then Me.Recordset![myKey] = myR![myKey]
Next myKey

我在 VBA 中尝试做的事情是否可行?

【问题讨论】:

【参考方案1】:

如果您想引用名称存储在变量myKey 中的字段的值,请使用此...

myR.Fields(myKey)

无论您的记录集是 DAO 还是 ADO 对象,这都会起作用。

错误 3265,“在此集合中找不到项目”,不是对数组的抱怨。它告诉您您的记录集没有文字名称为“myKey”的字段。也许这段代码会让它更清晰。它可以正常工作,没有错误。取消注释前 2 个 Debug.Print 行中的任何一个都会触发错误 3265。

Public Sub foo()
    Const myKey As String = "id"
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSelect As String
    strSelect = "SELECT id FROM MyTable;"
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSelect)
    'Debug.Print rs![myKey]
    'Debug.Print rs!myKey
    Debug.Print rs.Fields(myKey)
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

【讨论】:

这完全符合我的要求。谢谢。除非您明确知道它是什么,否则似乎没有太多关于字段的信息。这真的是我第一次在 VBA 中进行任何类型的编程,它确实与其他语言有很大不同。 VBA 需要一些时间来适应。 :-) 如果myRDAO.Recorset,您可以在代码中输入myR.,然后让 Intellisense 向您展示可用的方法和属性。如果它是 ADODB.Recordset 并且您已经为 Microsoft ActiveX 数据对象设置了引用,您也可以这样做。【参考方案2】:

不确定您要在这里做什么。 “key1”是字段名还是值? 当您编写 myR![myKey] 时,myKey 是一个字段名。

如果它应该是一个值,那么你会得到错误。例如,如果“key1”、“key2”、“key3”是员工 ID 号(比如 10、20 和 30),那么您尝试做的是询问 IsNull(myR![10]),因为没有字段名为 10,它给出了一个错误。

希望这会有所帮助。

【讨论】:

以上是关于我可以使用字符串数组作为记录集中的键吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用实例化的对象作为数组键吗?

我可以使用 NSPredicate 作为 NSDictionary 中的键吗

在 Swift 中,我可以使用元组作为字典中的键吗?

我可以使用成员变量作为 hash_set/hash_map 的键吗?

使用整数作为关联数组的键在 iOS safari 上不起作用

PHP 等价于 Ruby 符号