从RecordSet填充字典

时间:2014-09-04 16:32:57

标签: sql vba excel-vba dictionary recordset

我想知道是否有人可以帮助我。我试图从sql表返回的记录集中填充公共字典。

除了一部分外,一切似乎都很好。我不知道它是不是正确计算字典中的键数,或者它们没有正确输入但是无论出于何种原因我尝试显示总计数时,它总是会出现只返回1(假设大约15)并且只显示第一行细节。

有人可以帮忙吗?

Public UserList As New scripting.Dictionary
Sub UserDL()
Dim USList As Range
Dim USArr(0 To 11) As Variant

Call ConnecttoDB

Set Cmd = New adodb.Command: Set rs = New adodb.Recordset

With Cmd
    .CommandTimeout = 30
    .ActiveConnection = cn
    .CommandText = "CSLL.DLUsers"

    Set rs = .Execute
End With

With rs
    If Not .BOF And Not .EOF Then
        .MoveLast
        .MoveFirst
        While (Not .EOF)
            For i = 1 To 11
                USArr(i - 1) = rs(i)
            Next i

                With UserList
                    If Not .Exists(rs("Alias")) Then
                        .Add Key:=rs("Alias"), Item:=USArr
                    End If
                End With
            .MoveNext
        Wend
    End If
End With

IA = UserList.Items
Debug.Print UserList.Count & " Items in the dictionary"
For Each element In IA
    For i = 0 To 10
        Debug.Print element(i)
    Next i
Next element

Set Cmd = Nothing: Set rs = Nothing ': Set UserList = Nothing
End Sub

2 个答案:

答案 0 :(得分:3)

rs(" Alias")是一个Field对象。 Field对象的默认属性是Value,因此通常只需引用Field对象就可以得到我们想要的值 - 值。但是,Dictionary可以存储对象(作为值或键),因此当您添加对象时,它实际上存储对象而不是默认属性。因此,在您的代码中,您将rs(" Alias")添加为键,即对象而不是值。当您移动到下一条记录时,rs(" Alias")仍然是同一个对象 - 只有值已更改。因此,当您检查密钥是否存在时,确实存在。您需要添加Value属性作为键。

aa_dd的答案有效的原因是它将值存储在变量中,然后将该值用作键,即不是Field对象。

另一种方法是显式使用Field对象的Value属性...

With UserList
    If Not .Exists(rs("Alias").Value) Then
        .Add Key:=rs("Alias").Value, Item:=USArr
    End If
End With

答案 1 :(得分:2)

rs("Alias")存储在变量中,然后将该变量用作键。

 dim sKey as String

    With UserList
    sKey=rs("Alias")
       If Not .Exists(sKey) Then
           .Add sKey,USArr
       End If
     End With