我有一个访问文件与一些数据。为了执行某些计算,我需要使用从原始数据中计算(生成)的值创建某些表。这些临时表的大小大约是500 MB,每个标准,我都使用它。根据不同的标准,这必须反复进行至少50次。
一旦第一部分完成-临时表可以被丢弃。问题是在访问中,即使在删除行和删除表后,文件大小仍然很高。因此,在每次传递之后,尽管删除了表,但大小仍然增加。很快就会达到2GB的极限。
已尝试解决方案:1. 使用VBA -创建临时mdb文件->在那里创建表->链接到原始访问文件-保存生成的值->用于计算->删除文件再来一遍。
这是非常慢插入记录到这个表。我相信是因为它是一个链表。我要执行的插入数以十万为单位。
-
使用VBA压缩和修复当前DB -没有明确的答案。
-
使用一个单独的accdb文件'control_file_,它将在原始访问文件,删除表,压缩和修复上做工作,然后再为下一个标准做一遍。请告知此VBA代码。VBA代码的连续性仍然存在。
我可以推荐解决压缩数据库问题的最简单方法是简单地使用我不久前发布的代码,用于重新启动和编程压缩MSAccess数据库。
否则,使用单独的临时数据库可能是最好的。关于性能的一件事是:如果你注意保持一个链接表总是打开的,那么使用一个单独的链接数据库并不会变慢。导致操作缓慢的原因是数据库引擎需要过于频繁地创建和删除数据库锁文件。如果您保持一个链接表打开(打开一个记录集到一个虚拟表,不关闭它),那么锁文件将保留,您将获得适当的性能。
在Access 2007中不可能对当前数据库进行压缩和修复。您看到的所有技术要么是错误的,要么是旧版本的Access。
我和你有同样的问题,最好的方法是分割你的数据库,这样你就可以在BE中执行你的计算,并压缩和修复临时数据库。此外,你在性能方面的问题实际上可以用雷诺的想法来解决。
我遇到了同样的问题,我的数据库在原始数据导入时膨胀。我决定使用数据库对象(DAO)来创建临时数据库,导入数据,从该临时数据库查询,然后删除它,而不是分割数据库并常规地压缩后端。基本代码如下所示:
Sub tempAccessDatabaseImport()
Dim mySQL As String
Dim tempDBPath As String
Dim myWrk As DAO.Workspace
Dim tempDB As DAO.Database
Dim myObject
'Define temp access database path
tempPathArr = Split(Application.CurrentProject.Path, "")
For i = LBound(tempPathArr) To UBound(tempPathArr)
tempDBPath = tempDBPath + tempPathArr(i) + ""
Next i
tempDBPath = tempDBPath + "tempDB.accdb"
'Delete temp access database if exists
Set myObject = CreateObject("Scripting.FileSystemObject")
If myObject.FileExists(tempDBPath) Then
myObject.deleteFile (tempDBPath)
End If
'Open default workspace
Set myWrk = DBEngine.Workspaces(0)
'DAO Create database
Set tempDB = myWrk.CreateDatabase(tempDBPath, dbLangGeneral)
'DAO - Import temp xlsx into temp Access table
mySQL = "SELECT * INTO tempTable FROM (SELECT vXLSX.*FROM [Excel 12.0;HDR=YES;DATABASE=" & RAWDATAPATH & "].[" & WORKSHEETNAME & "$] As vXLSX)"
'DAO Execute SQL
Debug.Print mySQL
Debug.Print
tempDB.Execute mySQL, dbSeeChanges
'Do Something Else
'Close DAO Database object
tempDB.Close
Set tempDB = Nothing
myWrk.Close
Set myWrk = Nothing
'Delete temp access database if exists
If myObject.FileExists(tempDBPath) Then
'myObject.deleteFile (tempDBPath)
End If
End Sub