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

时间:2011-07-19 00:10:14

标签: dictionary vbscript recordset

我只是想构建一个productIDs字典

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

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

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

1 个答案:

答案 0 :(得分:5)

尝试添加.Value

viewableProductIDs.Add rsEntry("ProductID").Value, true

<强>解释

VBScript有一个名为“默认”属性的概念。例如,行

someString = rsEntry("ProductID")

确实是

的简写
someString = rsEntry.Fields.Item("ProductID").Value

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

Set someObj = rsEntry("ProductID")

解释器会将someObj设置为Field对象引用。

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