vbscript字典在循环中添加产生现有密钥错误

Acq*_*ire 1 vbscript dictionary recordset

我只是想构建一个productIDs的字典

dim viewableProductIDs : set viewableProductIDs = CreateObject("Scripting.Dictionary")
    do while not rsEntry.EOF
        viewableProductIDs.Add rsEntry("ProductID"), true
        rsEntry.MoveNext
    loop
Run Code Online (Sandbox Code Playgroud)

rsEntry是一个ADODB Recordset,我通过详尽的debbug打印确保我的查询确实返回了唯一的productID,并且记录集没有重复项.然而有些人,vbscript坚持认为有重复.它会添加第一个罚款,但之后它会在所有其他方面出错.我试着用现有钥匙检查它周围,但是有些人认为它们都是,但第一个存在.然后最后我留下了一个只有一个条目的字典.

有没有人知道它为什么这样做?

Che*_*vel 5

尝试添加.Value:

viewableProductIDs.Add rsEntry("ProductID").Value, true
Run Code Online (Sandbox Code Playgroud)

说明:

VBScript有一个名为"默认"属性的概念.例如,该行

someString = rsEntry("ProductID")
Run Code Online (Sandbox Code Playgroud)

真的是简写

someString = rsEntry.Fields.Item("ProductID").Value
Run Code Online (Sandbox Code Playgroud)

where Fields,Item和,Value是它们各自对象的所有默认属性.这里的主要问题是在链的最后一步:之间的差异rsEntry("ProductID")rsEntry("ProductID").Value.在上面的示例中,由于我没有使用Set关键字,因此对象引用对于赋值的右侧是非法的.由于rsEntry("ProductID")求值为Field对象引用,解释器将执行下一步并展开Field对象的默认属性Value.如果我做了

Set someObj = rsEntry("ProductID")
Run Code Online (Sandbox Code Playgroud)

解释器将设置someObjField对象引用.

现在,这是有趣的部分:Dictionary对象可以使用任何类型的值作为其键.使用字符串或数字等简单值更常见,但使用数组或对象引用是完全合法的.由于对象引用对于方法的第一个参数是合法的Dictionary.Add,因此解释器不会费心扩展默认属性并仅使用Field对象引用作为键.由于Field对象引用不会在记录之间发生变化,因此您最终会尝试反复添加相同的密钥.添加.Value使得解释器明确清楚你想要的是值,而不是对象.