脚本字典 ASP 经典

Scripting Dictionary ASP Classic

我正在用两个记录集在 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

这是输出:

DocTypeTopicID: NEW
DocTypeID: EXISTS
TopicTitle: EXISTS
DisplayOrder: EXISTS
TopicTitleFontSize: EXISTS
TopicTitleFontFormat: EXISTS
ShortTopicTitle: EXISTS
Disabled: EXISTS
HideTopicOnPublish: EXISTS
DocTypeSubTopicID: NEW
DocTypeTopicID: SubTopicTitle: EXISTS
DisplayOrder: DataType: EXISTS
SubTopicOptions: EXISTS
DefaultValue: EXISTS
Required: EXISTS
Custom: EXISTS
CustomModule: EXISTS
AllowBringForward: EXISTS
AllowForwarding: EXISTS
AllowForwardingChecked: EXISTS
ResponseFontSize: EXISTS
TitleFontSize: EXISTS
TitleFontFormat: EXISTS
OITitle: EXISTS
OITitleFontSize: EXISTS
OITitleFontFormat: EXISTS
OIFontSize: EXISTS
OIFontFormat: EXISTS
OIResponseTitle: EXISTS
OIResponseTitleFontSize: EXISTS
OIResponseTitleFontFormat: EXISTS
OIResponseFontSize: EXISTS
OIResponseFontFormat: EXISTS
OINoResponseDisplay: EXISTS
OIShowModifiedDate: EXISTS
OIShowChangedFlag: EXISTS
OIChangedFlag: EXISTS
OINoInstructionDisplay: EXISTS
DocTypeGridTemplate: EXISTS
DocTypeGridID: EXISTS
GridColumns: EXISTS
GridRows: EXISTS
GridMaxSize: EXISTS
RollupShowSubTopicTitle: EXISTS
TimeBack: EXISTS
SubTopicInt1: EXISTS
SubTopicInt2: EXISTS
SubTopicInt3: EXISTS
SubTopicBit1: EXISTS
SubTopicBit2: EXISTS
SubTopicBit3: EXISTS
SubTopicText1: EXISTS
SubTopicText2: EXISTS
SubTopicText3: EXISTS
AutoPopulateOmit: EXISTS
GridRowType: EXISTS
Disabled: SubTopicInt4: EXISTS
SubTopicInt5: EXISTS
SubTopicInt6: EXISTS
SubTopicBit4: EXISTS
SubTopicBit5: EXISTS
SubTopicBit6: EXISTS
SubTopicText4: EXISTS
SubTopicText5: EXISTS
SubTopicText6: EXISTS
HideSubTopicOnPublish: EXISTS
GridSortColumn: EXISTS
GridSortColumnOrder: EXISTS
TextEditor: EXISTS
CustomListTypeID: EXISTS
CustomListID: EXISTS

当我遍历它时:

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 中并且它起作用了。随便 :/

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

你需要做的,如果你养成习惯,可以让你在以后少白头发,就是告诉字典像这样添加结果的值:

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

当您添加 CStr 时会发生什么,即您根据结果的位置创建了一个新变量,这就是它对您有用的原因。