如何在打开数据库时压缩MS Access数据库,使用vba

问题描述:

我正在运行几个VBA代码模块。在运行过程中,由于Access达到2GB的最大大小,代码崩溃;但是,如果我在那时压缩数据库,它只有200MB。如何在打开数据库时压缩MS Access数据库,使用vba

在代码运行时,是否可以定期压缩数据库?

+3

你在处理过程中是否追加和删除了很多东西?如果是这样,那么你有一个设计错误 - 附加然后删除的数据是临时数据,不应该附加到你的真实数据文件中,而是附加到另一个临时数据库中。 – 2010-05-14 20:09:00

您只能压缩未打开的数据库(或将其压缩为不同名称的文件)。

请参阅here的步骤。

是的,你可以。但是,您必须关闭所有使用数据库文件的记录集和数据库变量,表单和报表。您可以通过运行代码并查看LDB文件是否不再存在来测试。当然,除了你自己以外,所有用户都必须不在数据库文件中。

您可以遍历Forms集合(实际上是打开的表单)和Reports集合来克服它们。当然,一旦你完成了处理,你将需要重新打开任何自动启动表格等,等等。

+0

是的,但我得到的是,当你的数据库打开或通过vba时你无法压缩数据库 – tksy 2010-05-14 11:14:59

+0

然后你的FE有一些对数据库打开的东西,它可以在未绑定的表单上包含组合框或列表框,或者其他人拥有数据库打开。我使用这种技术经常从第三方内部备份BE数据库。 – 2010-05-14 18:32:15

我不确定vb,但我总是通过调用“/ compact “命令行开关。我认为你可以通过命令行开关调用数据库,就像在vb中轻松打开任何文件一样。

每MS

压缩和修复Access数据库或压缩Access项目中,/ compact选项之前指定,然后关闭访问。如果您在/ compact选项后省略目标文件名称,则该文件将压缩为原始名称和文件夹。要压缩到不同的名称,请指定一个目标文件。如果您未在目标数据库或目标Access项目中包含路径,则默认情况下会在“我的文档”文件夹中创建目标文件。在Access项目中,此选项压缩Access项目(.adp)文件,但不压缩SQL Server数据库。

+0

问题是关于文件打开时的压缩。你的建议并没有改变那根本不可能的事实。 – 2010-10-27 20:53:37

根据微软的说法,只要文件是专门打开的,你就可以压缩一个开放的Access数据库。

请参阅http://support.microsoft.com/kb/288631压实的局限性。

我最近偶然到了这个问题,有些事我的答案在这里遇到的只是简单的错误:

  1. 不能压缩和修复通过VBA的Access数据库,而它的开放!无论所有桌子是否关闭,是否拥有排他锁,等等。
  2. 但是,如果关闭所有连接,则可以从链接数据库压缩后端。这就是为什么Tony Toews能够成功实现紧凑和修复的原因。

这是不幸的,到目前为止最简单的解决方法是创建一个链接的数据库。但如果这是不可取的,如果你愿意做一些奇怪的诡计,你可以做另一件事。

问题在于紧凑和修复发生时主数据库必须关闭。要解决这个问题,我们可以做到以下几点:

  1. 编程方式创建一个VBScript文件
  2. 将代码添加到该文件,所以我们可以压缩&,而无需打开它
  3. 打开修复我们的数据库,并运行该文件异步
  4. 关闭我们的数据库紧凑&修复发生
  5. 紧凑之前和修复数据库(创建副本),删除旧,重命名副本
  6. 重新打开我们的数据库,继续批量
  7. 删除新创建的文件
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以来,压缩操作必须由微软改编。

希望这会有所帮助。