从Ram清除字典

时间:2016-08-11 16:35:55

标签: sql vba access-vba overflow ms-access-2013

MS Access 2013

我的目标是构建一个十字路口表,但是我无法加入Memo / Long Text字段并且使用带有where语句的更新查询而不是连接效率低并且挂起,所以我决定构建一个字典填充它,并通过查找ID填写下一列,问题是我遇到了#34;溢出"问题 - 我的推测是RAM限制。我的工作是尽可能多地填充到字典中,填充我可以从该子集中填写的内容,清除字典并再次填充下一批 - 冲洗重复。但是,在第一批运行并从字典中清除后,我在下一个键/值对上遇到溢出错误,我试图将其置于“空”字样中。字典 - 我不知道为什么。

理想的JOIN SQL语句(使用长文本/备忘录问题):

UPDATE [ID Crosswalk] INNER JOIN [1 Clean Reasons] ON [ID Crosswalk].Reason = [1 Clean Reasons].Reason SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason];

WHIS SQL语句(不起作用/挂起):

UPDATE [ID Crosswalk], [1 Clean Reasons] SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason]
WHERE ((([ID Crosswalk].Reason)=[1 Clean Reasons].[Reason]));

VBA字典解决方案(溢出错误):

Dim CRtbl as DAO.Recordset
Dim CRDictNT as Dictionary
Set CRDictNT = New Dictionary

'Fill CR Dict
CRtbl.MoveFirst
On Error GoTo PrintCR
Do Until CRtbl.EOF
    Do Until CRtbl.EOF
        CRDictNT.Add CStr(CRtbl("Reason")), CInt(CRtbl("CR_ID")) 'CR_ID by Reason
        CRtbl.MoveNext
    Loop
PrintCR:
    CWIDtbl.MoveFirst
    Do Until CWIDtbl.EOF
        If Not IsEmpty(CRDictNT(CWIDtbl("Reason"))) Then
            CWIDtbl("CR_ID") = CRDictNT(CWIDtbl("Reason"))
        End If
        CWIDtbl.MoveNext
    Loop
    CRDictNT.RemoveAll             'these three lines are
    Set CRDictNT = Nothing         'my attempts at clearing
    Set CRDictNT = New Dictionary  'the item from RAM.
Loop
CRtbl.Close

1 个答案:

答案 0 :(得分:2)

这个问题不是你的词典,它是你正在做的演员。 VBA整数很小(16位有符号,最大值32,767)。因此,当您使用大于此值的ID调用CInt(CRtbl("CR_ID"))时,您将尝试返回其整数。使用CLng()代替强制转换为Long(带符号的32位,最大值2,147,483,647)。确保您还重构其余代码以正确期望Long。

我刚做了一点测试,让一个字典只运行一段时间,添加项目(键是一个短字符串,值是一个递增的Long,类似于你的情况)。在切断它之前它已经达到300万个条目,并且它没有抱怨任何溢出或其他错误(并且主机进程的总内存使用量只是刮掉~0.5GB)。所以你应该可以随意填写你喜欢的字典,而不必担心记忆。