Dictionary 脚本字典ASP经典

Dictionary 脚本字典ASP经典,dictionary,vbscript,asp-classic,Dictionary,Vbscript,Asp Classic,我正在用ASP classic从两个记录集构建一个脚本字典,但出于某种原因,我尝试添加到字典中的几乎每一项(大约70项)都表示它存在,结果只有3项,而且在构建字典后尝试循环遍历字典时,我会得到一个异常 Dim OrdDict Set OrdDict = Server.CreateObject("Scripting.Dictionary") OrdinateSQL = "SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.CO

我正在用ASP classic从两个记录集构建一个脚本字典,但出于某种原因,我尝试添加到字典中的几乎每一项(大约70项)都表示它存在,结果只有3项,而且在构建字典后尝试循环遍历字典时,我会得到一个异常

Dim OrdDict
Set OrdDict = Server.CreateObject("Scripting.Dictionary")

OrdinateSQL = "SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tblDocTypeTopic';"
Set rsTopicOrdinals = Server.CreateObject("ADODB.RecordSet")
rsTopicOrdinals.Open OrdinateSQL, connUTL, adOpenKeyset

If rsTopicOrdinals.EOF = False Then
    Do Until rsTopicOrdinals.EOF
        'ordinal positions are "1" indexed, but the array we're building is zero, so subtract one
        Response.Write rsTopicOrdinals("COLUMN_NAME") & ": "
        If OrdDict.Exists(rsTopicOrdinals("COLUMN_NAME")) Then
            response.write "EXISTS<BR>"
            OrdDict.Item(rsTopicOrdinals("COLUMN_NAME")) = rsTopicOrdinals("ORDINAL_POSITION") - 1
        Else
            response.write "NEW<BR>"
            OrdDict.Add rsTopicOrdinals("COLUMN_NAME"), rsTopicOrdinals("ORDINAL_POSITION") - 1
        End If
        rsTopicOrdinals.MoveNext
    Loop
End If
rsTopicOrdinals.Close
Set rsTopicOrdinals = Nothing

OrdinateSQL = "SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tblDocTypeSubTopic';"
Set rsSubTopicOrdinals = Server.CreateObject("ADODB.RecordSet")
rsSubTopicOrdinals.Open OrdinateSQL, connUTL, adOpenKeyset

If rsSubTopicOrdinals.EOF = False Then
    Do Until rsSubTopicOrdinals.EOF
        'ordinal positions are "1" indexed, add the number of columns in tblDocTypeTopic
        'use a unique name for DisplayOrder and Disabled as the exist in both tables
        Response.Write rsSubTopicOrdinals("COLUMN_NAME") & ": "
        Select Case rsSubTopicOrdinals("COLUMN_NAME")
            Case "DisplayOrder"
                OrdDict.Add "SubTopicDisplayOrder", rsSubTopicOrdinals("ORDINAL_POSITION") + TopicColCount
            Case "Disabled"
                OrdDict.Add "SubTopicDisabled", rsSubTopicOrdinals("ORDINAL_POSITION") + TopicColCount
            Case "DocTypeTopicID"
            Case Else
                If OrdDict.Exists(rsSubTopicOrdinals("COLUMN_NAME")) Then
                    response.write "EXISTS<BR>"
                    OrdDict.Item(rsSubTopicOrdinals("COLUMN_NAME")) = rsSubTopicOrdinals("ORDINAL_POSITION") + TopicColCount
                Else
                    response.write "NEW<BR>"
                    OrdDict.Add rsSubTopicOrdinals("COLUMN_NAME"), rsSubTopicOrdinals("ORDINAL_POSITION") + TopicColCount
                End If
        End Select
        rsSubTopicOrdinals.MoveNext
    Loop
End If
rsSubTopicOrdinals.Close
Set rsSubTopicOrdinals = Nothing
当我循环通过它时:

OrdKeys = OrdDict.Keys
For i = 0 To OrdDict.Count - 1
    Response.Write OrdKeys(i) & ": " & OrdDict.Item(OrdKeys(i))
Next
我得到:

error '80020009'

有人能看到我代码中的漏洞吗?这肯定是我看不到的东西。

我想我应该删除这个问题,因为我发现了这个问题,在我看来,这是非常琐碎的……但为了防止其他人碰到这个问题,我必须做以下几点:

OrdDict.Add CStr(rsTopicOrdinals("COLUMN_NAME")), rsTopicOrdinals("ORDINAL_POSITION") - 1

我只是把字典的键包在一个CStr里,它就起作用了。不管怎样:/

我想我应该删除这个问题,因为我发现了这个问题,在我看来,这个问题非常微不足道……但为了防止其他人碰到这个问题,我必须做以下几点:

OrdDict.Add CStr(rsTopicOrdinals("COLUMN_NAME")), rsTopicOrdinals("ORDINAL_POSITION") - 1

我只是把字典的键包在一个CStr里,它就起作用了。不管怎样:/

您面临的问题是获取结果的位置,而不是值。因此,当您获取项目时,它会查看RS的位置,但由于您已移动到下一个位置,该位置将为您提供新记录的值,而不是原始记录的值。我决不是一个确切了解它工作原理的专家,但我希望我能理解这一点

如果你养成习惯,你需要做的是告诉字典添加结果值,如下所示:

OrdDict.Add rsTopicOrdinals("COLUMN_NAME").value, rsTopicOrdinals("ORDINAL_POSITION").value - 1

添加CStr时会发生的情况是,您根据结果的位置创建了一个新变量,这就是为什么它对您有效。

您面临的问题是,您获取的是结果的位置,而不是值。因此,当您获取项目时,它会查看RS的位置,但由于您已移动到下一个位置,该位置将为您提供新记录的值,而不是原始记录的值。我决不是一个确切了解它工作原理的专家,但我希望我能理解这一点

如果你养成习惯,你需要做的是告诉字典添加结果值,如下所示:

OrdDict.Add rsTopicOrdinals("COLUMN_NAME").value, rsTopicOrdinals("ORDINAL_POSITION").value - 1
添加CStr时会发生的情况是,您根据结果的位置创建了一个新变量,这就是为什么它对您有效