如何在打开数据库时压缩MS Access数据库,使用vba
我正在运行几个VBA代码模块。在运行过程中,由于Access达到2GB的最大大小,代码崩溃;但是,如果我在那时压缩数据库,它只有200MB。如何在打开数据库时压缩MS Access数据库,使用vba
在代码运行时,是否可以定期压缩数据库?
是的,你可以。但是,您必须关闭所有使用数据库文件的记录集和数据库变量,表单和报表。您可以通过运行代码并查看LDB文件是否不再存在来测试。当然,除了你自己以外,所有用户都必须不在数据库文件中。
您可以遍历Forms集合(实际上是打开的表单)和Reports集合来克服它们。当然,一旦你完成了处理,你将需要重新打开任何自动启动表格等,等等。
是的,但我得到的是,当你的数据库打开或通过vba时你无法压缩数据库 – tksy 2010-05-14 11:14:59
然后你的FE有一些对数据库打开的东西,它可以在未绑定的表单上包含组合框或列表框,或者其他人拥有数据库打开。我使用这种技术经常从第三方内部备份BE数据库。 – 2010-05-14 18:32:15
我不确定vb,但我总是通过调用“/ compact “命令行开关。我认为你可以通过命令行开关调用数据库,就像在vb中轻松打开任何文件一样。
每MS
压缩和修复Access数据库或压缩Access项目中,/ compact选项之前指定,然后关闭访问。如果您在/ compact选项后省略目标文件名称,则该文件将压缩为原始名称和文件夹。要压缩到不同的名称,请指定一个目标文件。如果您未在目标数据库或目标Access项目中包含路径,则默认情况下会在“我的文档”文件夹中创建目标文件。在Access项目中,此选项压缩Access项目(.adp)文件,但不压缩SQL Server数据库。
问题是关于文件打开时的压缩。你的建议并没有改变那根本不可能的事实。 – 2010-10-27 20:53:37
我最近偶然到了这个问题,有些事我的答案在这里遇到的只是简单的错误:
- 您不能压缩和修复通过VBA的Access数据库,而它的开放!无论所有桌子是否关闭,是否拥有排他锁,等等。
- 但是,如果关闭所有连接,则可以从链接数据库压缩后端。这就是为什么Tony Toews能够成功实现紧凑和修复的原因。
这是不幸的,到目前为止最简单的解决方法是创建一个链接的数据库。但如果这是不可取的,如果你愿意做一些奇怪的诡计,你可以做另一件事。
问题在于紧凑和修复发生时主数据库必须关闭。要解决这个问题,我们可以做到以下几点:
- 编程方式创建一个VBScript文件
- 将代码添加到该文件,所以我们可以压缩&,而无需打开它
- 打开修复我们的数据库,并运行该文件异步
- 关闭我们的数据库紧凑&修复发生
- 紧凑之前和修复数据库(创建副本),删除旧,重命名副本
- 重新打开我们的数据库,继续批量
- 删除新创建的文件
Public Sub CompactRepairViaExternalScript()
Dim vbscrPath As String
vbscrPath = CurrentProject.path & "\CRHelper.vbs"
If Dir(CurrentProject.path & "\CRHelper.vbs") <> "" Then
Kill CurrentProject.path & "\CRHelper.vbs"
End If
Dim vbStr As String
vbStr = "dbName = """ & CurrentProject.FullName & """" & vbCrLf & _
"resumeFunction = ""ResumeBatch""" & vbCrLf & _
"Set dbe = WScript.CreateObject(""DAO.DBEngine.120"")" & vbCrLf & _
"Set objFSO = CreateObject(""Scripting.FileSystemObject"")" & vbCrLf & _
"On Error Resume Next" & vbCrLf & _
"Do" & vbCrLf & _
"If Err.Number <> 0 Then Err.Clear" & vbCrLf & _
"WScript.Sleep 500" & vbCrLf & _
"dbe.CompactDatabase dbName, dbName & ""_1""" & vbCrLf & _
"errCount = errCount + 1" & vbCrLf & _
"Loop While err.Number <> 0 And errCount < 100" & vbCrLf & _
"If errCount < 100 Then" & vbCrLf & _
"objFSO.DeleteFile dbName" & vbCrLf & _
"objFSO.MoveFile dbName & ""_1"", dbName" & vbCrLf & _
"Set app = CreateObject(""Access.Applition"")" & vbCrLf & _
"app.OpenCurrentDatabase dbName" & vbCrLf & _
"app.UserControl = True" & vbCrLf & _
"app.Run resumeFunction" & vbCrLf & _
"End If" & vbCrLf & _
"objFSO.DeleteFile Wscript.ScriptFullName" & vbCrLf
Dim fileHandle As Long
fileHandle = FreeFile
Open vbscrPath For Output As #fileHandle
Print #fileHandle, vbStr
Close #fileHandle
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run """" & vbscrPath & """"
Set wsh = Nothing
Application.Quit
End Sub
这确实上面列出的所有步骤,并通过调用调用该数据库上的ResumeBatch
功能恢复批次功能(没有任何参数)。
请注意,像点击运行保护和防病毒/政策不喜欢vbscript文件的东西可以毁了这种方法。
这个工作在MS-访问的早期版本,但失败,因为我们运行的是Access 2010
Sub CompactRepair()
Dim control As Office.CommandBarControl
Set control = CommandBars.FindControl(Id:=2071)
control.accDoDefaultAction
End Sub
当然,MDB将被关闭,压缩和重新开放。 自从Access 2010以来,压缩操作必须由微软改编。
希望这会有所帮助。
你在处理过程中是否追加和删除了很多东西?如果是这样,那么你有一个设计错误 - 附加然后删除的数据是临时数据,不应该附加到你的真实数据文件中,而是附加到另一个临时数据库中。 – 2010-05-14 20:09:00