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

时间:2010-05-14 03:59:32

标签: ms-access vba

我正在运行几个VBA代码模块。在运行过程中,代码崩溃,因为Access的最大大小为2GB;但是,如果我在那时压缩数据库它只有200MB。

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

我最近偶然发现了这个问题,我在答案中遇到的一些事情是完全错误的:

  1. CAN' 紧凑并在VBA打开时通过VBA修复访问数据库!无论是否关闭所有表,如果您有独占锁等,
  2. 但是,如果关闭了与链接数据库的所有连接,则可以压缩链接数据库中的后端。这就是Tony Toews能够成功压缩和修复的原因。
  3. 这是不幸的,到目前为止最简单的解决方法是创建一个链接数据库。但如果这是不可取的,如果你愿意做一些奇怪的诡计,你可以做另外一件事。

    问题是在紧凑和修复发生时必须关闭主数据库。要解决这个问题,我们可以执行以下操作:

    1. 以编程方式创建VBScript文件
    2. 将代码添加到该文件中,以便我们可以压缩&修复我们的数据库而不打开它
    3. 异步打开并运行该文件
    4. 在紧凑型& amp;之前关闭我们的数据库修复发生
    5. 压缩并修复数据库(创建副本),删除旧数据库,重命名副本
    6. 重新打开我们的数据库,继续批处理
    7. 删除新创建的文件
    8. 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 app = CreateObject(""Access.Application"")" & vbCrLf & _
          "Set dbe = app.DBEngine" & 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 & _
          "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文件的行为可能会破坏这种方法。

答案 2 :(得分:1)

这在以前版本的MS-Access中有效,但由于我们运行Access 2010,因此失败了。

Sub CompactRepair()
Dim control As Office.CommandBarControl
Set control = CommandBars.FindControl(Id:=2071)
control.accDoDefaultAction
End Sub

当然,mdb将被关闭,压缩并重新打开。 自Access 2010以来,压缩操作必须由Microsoft进行调整。

希望这有帮助。

答案 3 :(得分:0)

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

有关步骤,请参阅here

答案 4 :(得分:0)

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

每个MS

  

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

答案 5 :(得分:0)

根据Microsoft的说法,只要文件是专门打开的,您就可以压缩打开的Access数据库。

请参阅http://support.microsoft.com/kb/288631压缩限制。