【问题标题】:Clearing Dictionary From Ram从 Ram 清除字典
【发布时间】:2016-12-18 12:23:48
【问题描述】:

MS Access 2013

我的目标是建立一个人行横道表,但我无法加入备忘录/长文本字段并且使用带有 where 语句而不是加入的更新查询效率低下并且挂起,所以我决定构建一个字典来填充它,并通过查找 ID 填充下一列,问题是我遇到了“溢出”问题 - 我的假设是 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];

WHERE 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

【问题讨论】:

  • 为什么首先需要备忘录/长文本字段?

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


【解决方案1】:

问题不在于您的字典,而在于您正在制作的演员表。 VBA 整数很小(带符号的 16 位,最大值为 32,767)。因此,当您使用大于该 ID 的 ID 调用 CInt(CRtbl("CR_ID")) 时,您将溢出它试图返回的整数。改用 CLng() 转换为 Long(有符号 32 位,最大值为 2,147,483,647)。确保您还重构了其余代码以正确预期 Long。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多