Excel -Access DB -ADO。记忆泄漏 - >超出系统资源

时间:2016-04-19 09:30:26

标签: vba ms-access excel-2010 adodb

我使用Excel VBA清理大型csv文件。为此,我将csv文件加载到访问数据库,然后使用SQL查询我执行所有数据转换活动。所以抽象的过程就像这样

打开Excel - >在开始时单击包装访问数据库 - >将csv文件加载到不同的表 - >使用adoddb连接在数据库上执行不同的DDl和DML语句 - >输出最终数据。

我在这里遇到的问题是内存使用率总是上升为excel。似乎访问数据库处理也被添加到excel本身。所以我最终得到错误"System Resource Exceeded"

每次执行查询。内存使用率很高,永远不会下降。查询在3-4个表中大约有10k到100k记录。

为什么内存使用率永远不会降低?

每次我执行ddl / dml查询时,都会打开adodb连接并关闭它。我在使用后关闭所有记录集并设置为空。但是内存使用率仍然没有下降。

看到相关的不同文章。但大多数人都在讨论同一个excel文件中的数据。在我的情况下,没有数据保存在内存或excel文件中。

我在这里看到一篇来自微软的文章,其中也谈到了excel本身的数据。 https://support.microsoft.com/en-us/kb/319998

有人知道任何解决方法吗?

例如:要从csv文件向表中加载数据,请使用以下代码

 StrSql = "SELECT * into " & TableName & " FROM [Text;FMT=Delimited;HDR=YES;DATABASE=" & DSPath & "].[" & DSName & "]"
    ExecuteSQL StrSql


Private Function ExecuteSQL(Sql As String) As Long
  Dim Con As ADODB.Connection
  Dim I As Long

  Connect Con
  Con.Execute Sql, I
  ExecuteSQL = I
  CloseCon Con
End Function

Public Sub CloseCon(ByRef Con As ADODB.Connection)
  If Not Con Is Nothing Then
     If Con.State = adStateOpen Then
        Con.Close
        Set Con = Nothing
     End If
  End If
End Sub

Public Sub Connect(ByRef Con As ADODB.Connection)
Dim ConStr As String

If Not Con Is Nothing Then
    If Con.State = adStateOpen Then
        Exit Sub
    End If
End If
On Error GoTo err
    CloseCon Con
    Set Con = New ADODB.Connection
    ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBFile & ";Persist Security Info=False"
    Con.Open ConStr, , , -1
    Exit Sub
err:
End Sub

这有点帮助。

每次打开和关闭时都不使用单独的连接对象,而是尝试使用从开头打开并仅在完成进程时关闭的公共连接对象。这样,内存消耗减少,流程运行的时间更长

1 个答案:

答案 0 :(得分:2)

您的代码看起来很合理。问题是Microsoft在您的引用中确认:“ ADO查询使用的内存无法通过关闭和释放ADO对象来回收。释放内存的唯一方法是退出Excel。 < / p>

所以我们现在必须退出Excel然后回收资源。

  1. “退出Excel”表示必须关闭您工作的当前工作簿,或

  2. “退出Excel”表示退出所有Excel实例,以便有效地从内存中删除Excel。

  3. 广告。 1:在这种情况下,您可以创建一个“父工作簿”,启动包含ADODB处理的一部分的另一个工作簿。它在部分处理之后退出,并且您的父级启动一个新的,另一个继续处理的工作簿,等等。使用一些智能切割&amp;粘贴以调整何时退出每个工作簿。

    广告2:在这种情况下,您使用例如单词以启动Excel.Application的新实例并以与1相同的方式继续。只是希望MS-Office不是那么集成,以至于当任何Office程序运行时ADO DLL都不会退出...

    当然,抱怨微软确认您的IT部门手头有错误,安装Access UI可能会更好。