如何使用数据访问对象 (DAO) 防止数据库膨胀

中等:需要基本的宏、编码和互操作性技能。

本文仅适用于 Microsoft Access 数据库 (.mdb) 。

症状

在实现数据访问对象 (DAO) 以打开记录集后,Microsoft Access 数据库 (膨胀或大小) 迅速增长。

原因

如果不在每次循环访问记录集代码时释放记录集的内存,DAO 可能会重新编译,使用更多内存并增加数据库的大小。

解决方案

若要避免消耗不必要的资源并增加数据库大小,请使用 Recordset 对象的 Close 方法在不再需要记录集时显式关闭记录集的内存。

如果数据库由于未使用 Recordset 对象的 Close 方法而增加,可以通过运行“工具”菜单上的 “压缩和修复 ”实用工具 () 来减小数据库的大小。

更多信息

在代码中创建 Recordset (或 QueryDef) 对象时,请在完成后显式关闭对象。 在大多数情况下,Microsoft Access 会自动关闭 Recordset 和 QueryDef 对象。 但是,如果在代码中显式关闭对象,则可以避免在对象保持打开状态时出现偶尔的实例。 以下步骤演示如何使用 DAO 关闭 Recordset 或 QueryDef 对象。

  1. 启动 Microsoft Access。

  2. 打开示例数据库Northwind.mdb。

    注意 本文中的示例代码使用 Microsoft 数据访问对象。 若要正确运行此代码,必须引用 Microsoft DAO 3.6 对象库。 为此,请在 Visual Basic 编辑器的“工具”菜单上单击“引用”,并确保选中“Microsoft DAO 3.6 对象库检查”框。

  3. 将以下代码复制到新模块。 下面的示例代码打开和关闭 Recordset 和 QueryDef 对象,并在消息框中显示 Recordset 和 QueryDef 信息。

    VB
    Option Compare Database
    Option Explicit
    
    Sub subCloseObjects()
        Dim db As DAO.Database
        Dim rs As DAO.Recordset
        Dim qd As DAO.QueryDef
    
    Set db = CurrentDb
        Set rs = db.OpenRecordset("Employees", dbOpenTable)
        Set qd = db.QueryDefs("Invoices")
    
    rs.MoveLast    'Move to the last record in the Recordset.
    
    MsgBox "The Employees Recordset is open." & vbCrLf & _
               "The last Employee ID is " & rs![EmployeeID] & "."
        MsgBox "The Invoices query definition is open." & vbCrLf & _
               "The first field in the query is " & qd.Fields(0).Name
    
    'Explicitly close the Recordset and QueryDef objects.
        rs.Close
        qd.Close
    End Sub
    
    
  4. 运行 subCloseObjects 例程。