使用Excel VBA清理大型csv文件。为此,我将csv文件加载到访问数据库中,然后使用sql查询执行所有数据转换活动。因此,抽象过程如下Excel -Access DB -ADO。内存泄漏 - >超出系统资源
打开Excel - >开始单击打包访问数据库 - >将csv文件加载到不同的表 - >使用adoddb连接执行不同的DDl以及数据库上的DML语句 - >输出最终数据。
我在这里面临的问题是内存使用总是由excel增加。它似乎访问数据库处理也添加到Excel本身。所以最终我得到了错误"System Resource Exceeded"
。
每次执行查询时。内存使用率高涨并永远不会下降。这些查询在3-4个表中大约有10k到10万条记录。
为什么内存使用永远不会下降?
每当我做一个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
这有助于一点点。
而不是每次打开和关闭使用一个单独的连接对象我试图使用一个公开的连接对象,它是从开始打开,只有当过程完成时关闭。通过这种方式,内存消耗减少,并且进程运行更多时间。
为什么不直接在Access中执行所有操作?似乎没有必要从Excel去操纵Access。 –
我们没有安装访问界面。只需使用喷气发动机。所以用户可以打开Excel工具并提供输入。 – kten
你可以发布代码吗? –