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
答案 0 :(得分:2)
这个问题不是你的词典,它是你正在做的演员。 VBA整数很小(16位有符号,最大值32,767)。因此,当您使用大于此值的ID调用CInt(CRtbl("CR_ID"))
时,您将尝试返回其整数。使用CLng()
代替强制转换为Long(带符号的32位,最大值2,147,483,647)。确保您还重构其余代码以正确期望Long。
我刚做了一点测试,让一个字典只运行一段时间,添加项目(键是一个短字符串,值是一个递增的Long,类似于你的情况)。在切断它之前它已经达到300万个条目,并且它没有抱怨任何溢出或其他错误(并且主机进程的总内存使用量只是刮掉~0.5GB)。所以你应该可以随意填写你喜欢的字典,而不必担心记忆。