Access 2013 中的 VB 脚本在 QuickBooks Enterprise 14 中产生“内存不足”错误

Posted

技术标签:

【中文标题】Access 2013 中的 VB 脚本在 QuickBooks Enterprise 14 中产生“内存不足”错误【英文标题】:VB script in Access 2013 produces "out of memory" error in QuickBooks Enterprise 14 【发布时间】:2014-07-15 22:41:07 【问题描述】:

我首先要说 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 次,每次都重新启动,这是目前解决问题的唯一方法。

更新

在 SuperUser 上发布 this question 并确认无法更改 QB 中的应用程序缓存设置,尽管我的机器有大约 59GB 的可用 RAM。

此时,我想知道 VB 脚本是否有任何方法可以重置应用程序缓存或限制由于上述查询而增长的大小?

更新

对于那些遇到同样问题的人,我能够找到一种“解决方法”,不是解决根本问题,而是方便地解决问题的结果。

一个简单的宏记录器(在这种情况下我使用JitBit)嗅探弹出的警告消息框QB is out of memory,并强制终止QuickBooks任务,重新打开它,重新启动QODBC驱动程序,然后重新启动 Access 查询。

一个被黑的解决方案,但至少我不需要在接下来的 80 小时内坐在我的电脑上。感谢上帝的宏!

仍然希望能找到根本问题的答案。

更新

尝试在机器上安装 SQL Server,使用不同版本的 QODBC 数据库驱动程序(服务器驱动程序而不是桌面驱动程序)。最初,似乎正在运行,但在进一步检查后,新配置只是导致内存泄漏,导致“QBW32.EXE -silent”进程反复过载并重新启动。没有记录被删除。

在这个问题得到解决之前,我们基本上已经停业了。请,如果有人对此事有任何想法,真的需要一些帮助。

【问题讨论】:

【参考方案1】:

您可以通过在循环内实际创建和销毁连接对象来解决此问题。 (目前您正在打开和关闭连接,但每次迭代仍然使用相同的连接对象。)

如果这样的方法对您更有效,我会很感兴趣:

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

另外,作为旁注,当您通过 Recordset 遍历表/查询时,使用单独的 SQL 语句从表/查询中删除记录通常不是一个好主意。而不是

    CurrentDb.Execute "DELETE FROM ItemsForDeletion WHERE ListID='" & rs!ListID & "'"

这样做可能更安全,更方便

    rs.Delete

【讨论】:

好主意,但这实际上使错误出现得更快。一败涂地。在解决此问题之前,我们将停业。【参考方案2】:

噩梦结束了。在联系了每一位*** QB 专家寻求帮助后,在被告知在 QuickBooks 文件上执行这种大小的数据库查询时,如果不进一步破坏我们的文件或破坏与我们的 CRM 的同步,那么有人能够获得任务完成。我们现在终于与网络 CRM 同步,所有操作都已完美执行,所有损坏都从我们的文件中消除。

Matt Clark of QBorNotQB.com 成功了。任何有类似问题的人,我向你保证,这是你唯一可行的解​​决方案。在 MONTHS 尝试绕过 QuickBooks 中微不足道的应用程序缓存后,这个人能够在不到 36 小时内完成。

【讨论】:

在不泄露 Matt 的任何“商业机密”的情况下,您能否告诉我们解决方案涉及的内容?它只是对您自己的代码(VBA 或其他)的调整吗? ...更改配置文件或注册表项? ... QODBC 驱动程序的补丁? 据我了解,他正在使用专有软件与某种超级计算系统相结合。不确定这是否意味着像我这样的“超级”计算机,还是定义上的“超级计算机”。老实说,我什至没有要求更多的细节。我会给马特发一封电子邮件,看看他能不能泄露一两个秘密。

以上是关于Access 2013 中的 VB 脚本在 QuickBooks Enterprise 14 中产生“内存不足”错误的主要内容,如果未能解决你的问题,请参考以下文章

将 VB.NET 代码从 Visual Studio Express 复制到 Microsoft Access 2013

如何在 VB 中检索 64 位/Access 2013 的 Windows 用户 ID?

在 INSERT INTO 语句中插入值时出现语法错误。 -VB 和 ACCESS 2013

VB6 / SQL“长文本”比较不正确(MS Access 2013)

从 VB.NET 查询 Access 数据库中的 Yes/No 字段

VB.Net 使用创建表查询将 MS Access 表中的 AllowZeroLength 属性设置为否