我只是想构建一个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坚持认为有重复。它会添加第一个罚款,但之后它会在所有其他方面出错。我试着用现有钥匙检查它周围,但是有些人认为它们都是,但第一个存在。然后最后我留下了一个只有一个条目的字典。
有没有人知道为什么要这样做?
答案 0 :(得分:5)
尝试添加.Value
:
viewableProductIDs.Add rsEntry("ProductID").Value, true
<强>解释强>
VBScript有一个名为“默认”属性的概念。例如,行
someString = rsEntry("ProductID")
确实是
的简写someString = rsEntry.Fields.Item("ProductID").Value
其中Fields
,Item
和Value
是其各自对象的所有默认属性。这里的主要问题是链的最后一步:rsEntry("ProductID")
和rsEntry("ProductID").Value
之间的区别。在上面的示例中,由于我没有使用Set
关键字,因此对象引用对于赋值的右侧是非法的。由于rsEntry("ProductID")
求值为Field
对象引用,解释器将执行下一步并展开Field
对象Value
的默认属性。如果我做了
Set someObj = rsEntry("ProductID")
解释器会将someObj
设置为Field
对象引用。
现在,这是有趣的部分:Dictionary
对象可以使用任何类型的值作为其键。使用字符串或数字等简单值更常见,但使用数组或对象引用是完全合法的。由于对象引用对于Dictionary.Add
方法的第一个参数是合法的,因此解释器无需扩展默认属性,只需使用Field
对象引用作为键。由于Field
对象引用不会在记录之间发生变化,因此您最终会尝试反复添加相同的密钥。添加.Value
会使解释器明确表明您需要值,而不是对象。