【问题标题】:VB6 Dictionary This key is already associated with an element of this collectionVB6 Dictionary 此键已与此集合的元素相关联
【发布时间】:2012-10-24 14:06:29
【问题描述】:

这听起来可能有点奇怪,但就是这样:

我的表单遍历每个客户 (+-10 000) 并打开一个记录集以获取最后一次访问。由于优化不佳,我决定做一个查询,我需要存储它以便于访问。

我决定使用字典,因为与数组不同,我将能够使用键字符串(客户编号)进行搜索并获取我的项目(字符串:客户的最后一次访问)。

Dim dict As Dictionary
Set dict = CreateObject("Scripting.Dictionary")


dict.RemoveAll
dict.CompareMode = TextCompare    ' BinaryCompare does not change anything
rsLastVisits.Open "SELECT CUST_NO, MAX(DATE) AS LAST FROM [...] GROUP BY CUST_NO", DBHandle, adOpenDynamic, adLockOptimistic
Do While Not rsLastVisits.EOF
   dict.Add rsLastVisits!CUST_NO, rsLastVisits!LAST
   rsLastVisits.MoveNext
Loop
rsLastVisits.Close

我收到运行时错误“此键已与此集合的元素相关联”。

这是有趣的部分开始的地方,因为我的查询没有返回重复项(我仔细检查了)。

调试时,这些是添加的值:

第一次迭代:“0000000.”、“2012/05/27”

第二次迭代:“00000001”、“2011/06/14”错误试图插入这一行。

在即时窗口中,如果我写

dict.add "00000001", "2011/06/14"

添加没有任何问题。

如果我清除字典(dict.removeall),它会输入一项(不管是什么cust.no),下一项总是失败。如果我在即时窗口中手动输入(无变量),它可以工作。

你们有什么想法吗?谢谢!

【问题讨论】:

    标签: collections dictionary vb6 runtime-error


    【解决方案1】:

    您的示例应该可以正常工作。我能想到的唯一问题是CUST_NO 是否不是字符串。试试这个并检查它是否有所作为:

    dict.Add CSTR(rsLastVisits!CUST_NO), CSTR(rsLastVisits!LAST)
    

    编辑:

    你能发布CUST_NO的DB定义吗?

    【讨论】:

    【解决方案2】:

    我找到了解决方法...

    如果我改变了

    dict.Add rsLastVisits!CUST_NO, rsLastVisits!LAST
    

    dict.Add "" & rsLastVisits!CUST_NO, "" & rsLastVisits!LAST
    

    它有效...

    虽然这没有任何意义,因为我的变量已经是字符串..

    我将把它留在这里作为“已回答”。如果你们中任何对 Vb6 内部有更深入了解的人可以向我解释发生了什么,我将不胜感激。

    谢谢

    【讨论】:

    • 假设LAST 确实是String 类型,您是否尝试过rsLastVisits!LAST.Value 而不是冒险使用对象而不是其默认属性?
    • 使用 rsLastVisits.fields("LAST").value 有效。使用 .type 返回 202,这是一个“空终止的 unicode 字符串”。一个字符串是 200。这可能是根本原因。谢谢 !来源:devguru.com/technologies/ado/quickref/field_type.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2011-10-30
    • 2022-07-12
    • 2015-10-25
    相关资源
    最近更新 更多