Как предотвратить раздутие базы данных после использования объектов доступа к данным (DAO)

Средний. Требуются базовые навыки макроса, программирования и взаимодействия.

Эта статья относится только к базе данных Microsoft Access (.mdb).

Симптомы

База данных Microsoft Access начала раздувать (или быстро увеличивать размер) после реализации объектов доступа к данным (DAO) для открытия набора записей.

Причина

Если вы не освобождаете память набора записей каждый раз, когда вы циклически просматриваете код набора записей, DAO может выполнить повторную компиляцию, используя больше памяти и увеличив размер базы данных.

Разрешение

Чтобы избежать потребления ненужных ресурсов и увеличения размера базы данных, используйте метод Close объекта Recordset, чтобы явно закрыть память набора записей, когда набор записей больше не нужен.

Если размер базы данных увеличился из-за того, что вы не использовали метод Close объекта Recordset, можно уменьшить размер базы данных, запустив служебную программу Compact and Repair (в меню Сервис).

Дополнительная информация

При создании объекта Recordset (или QueryDef) в коде явно закройте объект по завершении. Microsoft Access автоматически закрывает объекты Recordset и QueryDef в большинстве случаев. Однако если явно закрыть объект в коде, можно избежать случайных экземпляров, когда объект остается открытым. Ниже показано, как с помощью DAO закрыть объект Recordset или QueryDef.

  1. Запустите Microsoft Access.

  2. Откройте пример Northwind.mdb базы данных.

    ПРИМЕЧАНИЕ В примере кода в этой статье используются объекты Доступа к данным Майкрософт. Для правильного выполнения этого кода необходимо ссылаться на библиотеку объектов Microsoft DAO 3.6. Для этого щелкните Ссылки в меню Сервис в Редактор Visual Basic и убедитесь, что выбрано поле Библиотека объектов Microsoft DAO 3.6 проверка.

  3. Скопируйте следующий код в новый модуль. В следующем примере кода открывается и закрывается набор записей и объект QueryDef, а также отображаются сведения recordset и QueryDef в окнах сообщений.

    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.