Cómo evitar el sobredimensionamiento de la base de datos después de usar objetos de acceso a datos (DAO)

Moderado: requiere aptitudes básicas de macro, codificación e interoperabilidad.

Este artículo solo se aplica a una base de datos de Microsoft Access (.mdb).

Síntomas

Una base de datos de Microsoft Access ha comenzado a inflarse (o crecer rápidamente en tamaño) después de implementar objetos de acceso a datos (DAO) para abrir un conjunto de registros.

Causa

Si no libera la memoria de un conjunto de registros cada vez que recorre en bucle el código del conjunto de registros, DAO puede volver a compilar, usando más memoria y aumentando el tamaño de la base de datos.

Solución

Para evitar consumir recursos innecesarios y aumentar el tamaño de la base de datos, use el método Close del objeto Recordset para cerrar explícitamente la memoria del conjunto de registros cuando ya no necesite el conjunto de registros.

Si la base de datos ha aumentado de tamaño porque no usó el método Close del objeto Recordset, puede reducir el tamaño de la base de datos ejecutando la utilidad Compact and Repair (en el menú Herramientas).

Más información

Al crear un objeto Recordset (o QueryDef) en el código, cierre explícitamente el objeto cuando haya terminado. Microsoft Access cierra automáticamente los objetos Recordset y QueryDef en la mayoría de las circunstancias. Sin embargo, si cierra explícitamente el objeto en el código, puede evitar instancias ocasionales cuando el objeto permanece abierto. En los pasos siguientes se muestra cómo usar DAO para cerrar un objeto Recordset o QueryDef.

  1. Inicie Microsoft Access.

  2. Abra la Northwind.mdb de base de datos de ejemplo.

    NOTA En el código de ejemplo de este artículo se usan objetos de Microsoft Data Access. Para que este código se ejecute correctamente, debe hacer referencia a la biblioteca de objetos de Microsoft DAO 3.6. Para ello, haga clic en Referencias en el menú Herramientas del Editor de Visual Basic y asegúrese de que la casilla Biblioteca de objetos de Microsoft DAO 3.6 esté activada.

  3. Copie el código siguiente en un nuevo módulo. El código de ejemplo siguiente abre y cierra un objeto Recordset y un objeto QueryDef, y muestra la información de Recordset y QueryDef dentro de los cuadros de mensaje.

    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. Ejecute la rutina subCloseObjects.