首先我要说的是,VB 不是我的母语。我编写了一个非常基本的脚本,用于查询要删除的 QuickBooks 项目列表,但是,在大约 400 次删除后,QuickBooks 会弹出一个错误:“内存不足。可能无法完成此操作。”我可以单击“确定”按钮,它将继续一条一条地更新记录,但是,我正在尝试删除其中大约 170,000 条记录,因此这不是一个选项。
我正在使用 FlexQuarters QODBC 连接到 QuickBooks 数据库。我已按照this article中的步骤进行操作增加 QuickBooks DB SERVER 的 InitialCache 和 MaxCache 设置,但是,这似乎仅适用于 DB SERVER 而不适用于应用程序缓存。 QuickBooks 信息屏幕中显示的设置如下:
文件信息
- 初始缓存:2048
- 最大缓存大小:3769
本地服务器信息
- 初始缓存:2048
- 缓存:12288
这些数字以 MB 为单位,因此我假设缓存大小应该足以执行操作而不会出现内存错误。最大缓存约占计算机上总可用 RAM 的 18%。
我想知道...有没有办法修改此 VB 脚本,以便在 250 次操作后清除 QuickBooks 中的应用程序缓存?
Private Sub Command0_Click()
Set cn = CreateObject("ADODB.Connection")
Dim rs As Recordset
Dim iCounter As Integer
Set rs = CurrentDb.OpenRecordset("SELECT ListID FROM ItemsForDeletion")
cn.ConnectionString = "DSN=QuickBooks Data QRemote"
While Not rs.EOF And iCounter < 250
cn.Open
cn.Execute ("DELETE FROM ItemInventory WHERE ListID='" & rs!ListID & "'")
cn.Close
CurrentDb.Execute ("DELETE FROM ItemsForDeletion WHERE ListID='" & rs!ListID & "'")
iCounter = iCounter + 1
rs.MoveNext
Wend
rs.Close
End Sub
请注意,原始代码在 WHILE 循环之外仅包含一个 cn.Open 和一个 cn.Close 语句,但一位 Intuit 开发人员告诉我们,这种方式可能不太可能产生内存错误(这显然没有成功)。
希望有办法解决这个问题。我不希望运行此过程 400 次,每次都重新启动,因为这是目前解决该问题的唯一方法。
更新
发布 this question 在 SuperUser 上,并确认 QB 中的应用程序缓存设置无法更改,尽管我的机器有大约 59GB 的可用 RAM。
此时,我想知道是否有任何方法可以让 VB 脚本重置应用程序缓存或限制其因上述查询而增长的大小?
更新
对于那些遇到同样问题的人,我能够找到一种“解决方法”,不是解决根本问题,而是可以方便地解决问题的结果。
一个简单的宏记录器(在本例中我使用 JitBit )来嗅探弹出的 QB 内存不足的警告消息框,并强制终止 QuickBooks 任务,重新打开它,重新启动 QODBC 驱动程序,然后重新启动 Access 查询。
一个被黑的解决方案,但至少我不需要在接下来的 80 小时里坐在电脑前做这件事。感谢上帝的宏!
仍然希望能够找到根本问题的答案。
更新
尝试在计算机上安装 SQL Server,并使用不同版本的 QODBC 数据库驱动程序(服务器驱动程序而不是桌面驱动程序)。最初似乎正在运行,但经过进一步检查后,新配置只是导致内存泄漏,导致“QBW32.EXE -silent”进程反复过载和重新启动。没有删除任何记录。
在这个问题得到解决之前,我们基本上已经停业了。如果有人对此事有任何想法,请在这里确实需要一些帮助。
最佳答案
您也许可以通过在循环内实际创建和销毁连接对象来解决该问题。 (当前您正在打开和关闭连接,但每次迭代仍使用相同的连接对象。)
如果这样的东西更适合您,我很感兴趣:
While Not rs.EOF
Set cn = CreateObject("ADODB.Connection")
cn.Open "DSN=QuickBooks Data QRemote"
cn.Execute "DELETE FROM ItemInventory WHERE ListID='" & rs!ListID & "'"
cn.Close
Set cn = Nothing
CurrentDb.Execute "DELETE FROM ItemsForDeletion WHERE ListID='" & rs!ListID & "'"
iCounter = iCounter + 1
rs.MoveNext
Wend
此外,作为旁注,当您通过记录集迭代表/查询时,使用单独的 SQL 语句从表/查询中删除记录通常不是一个好主意。而不是
CurrentDb.Execute "DELETE FROM ItemsForDeletion WHERE ListID='" & rs!ListID & "'"
这样做可能更安全、更方便
rs.Delete
关于ms-access - Access 2013 中的 VB 脚本在 QuickBooks Enterprise 14 中产生 "out of memory"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24769375/