我可以使用字符串数组作为记录集中的键吗?
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 需要一些时间来适应。 :-) 如果myR
是DAO.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 中的键吗
我可以使用成员变量作为 hash_set/hash_map 的键吗?