ms-access - Access 2013 中的 VB 脚本在 QuickBooks Enterprise 14 中产生 "out of memory"错误

标签 ms-access caching odbc vba quickbooks

首先我要说的是,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/

相关文章:

sql - 从 sql 表中查询二进制字段的一部分

arrays - 使用 VBA 和 JSON 解析嵌套数组

java - 多个用户可以使用 Java 同时连接到 Microsoft Access 数据库吗?

caching - Redis 管道,处理缓存未命中

macos - 在 Mac 上通过命令行创建 ODBC 连接

c++ - 如何使用 ODBC API 读取 SQL Server 列排序规则元数据?

ms-access - MS Access 自动编号问题

sql - ADODB/Access : Update Multiple Fields from Record in Same Table

ruby-on-rails - 如何使 Rails caches_page 在 capistrano 部署中存活下来?

django - django 是否在查询之间缓存模型数据?