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坚持认为有重复.它会添加第一个罚款,但之后它会在所有其他方面出错.我试着用现有钥匙检查它周围,但是有些人认为它们都是,但第一个存在.然后最后我留下了一个只有一个条目的字典.
有没有人知道它为什么这样做?
尝试添加.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)
解释器将设置someObj为Field对象引用.
现在,这是有趣的部分:Dictionary对象可以使用任何类型的值作为其键.使用字符串或数字等简单值更常见,但使用数组或对象引用是完全合法的.由于对象引用对于方法的第一个参数是合法的Dictionary.Add,因此解释器不会费心扩展默认属性并仅使用Field对象引用作为键.由于Field对象引用不会在记录之间发生变化,因此您最终会尝试反复添加相同的密钥.添加.Value使得解释器明确清楚你想要的是值,而不是对象.