Pasa Programación, apuntes y soluciones con Access
Página principal Mis apuntes de Access Mis utilidades Mis ejemplos Mis agradecimientos Enlaces a otras Webs

Fallos en Access

  1. Índice.
  2. Usar palabras reservadas.
  3. Usar caracteres especiales.
  4. Módulo y función con el mismo nombre.
  5. Bucles recursivos.
  6. Dejar objetos abiertos.
  7. Bibliografía.

Dejar objetos abiertos

Muchas veces usamos objetos para realizar determinadas tareas, como abrir otras bases de datos, actualizar tablas, enviar correos, ... Para usar estos objetos en VBA, los declaramos, inicializamos y usamos. Pero algunas veces, se nos olvida realizar el último paso: cerrarlos y descargarlos de memoria. Y si no los cerramos o descargamos, ¿qué ocurre? Que ese objeto se puede mantener en la memoria, o consumiendo recursos, mientras nuestra base de datos esté abierta. Y si sólo usamos un objeto y de vez en cuando, posiblemente no nos demos cuenta de esto. Pero cuando son muchos objetos, o consumen mucha memoria, o mantienen una conexión a otra base de datos o servidor de datos, nuestra aplicación, y el ordenador donde se ejecute, se van a resentir. Primero será el consumo de memoria, que se irá incrementando. A la vez, se incrementará el uso de la CPU y, si usamos conexiones a otras bases de datos, las nuevas conexiones se ralentizarán. E incluso, si nuestra base de datos trabaja en red, la velocidad de la red se puede ver afectada y disminuir con el paso del tiempo.

Para evitar estos problemas, debemos cerrar y/o descargar los objetos cuando no los usemos. Por ejemplo, si usamos un objeto Recordset para actualizar unos registros en una tabla, debemos cerrar su conexión mediante su método Close, y descargarlo de memoria asignándole el valor Nothing:

Public Sub ActualizaRegistros()
    Dim rst As DAO.Recordset
    Dim strSql As String
    Dim strCampo As String

    strSql = "SELECT Campo2 FROM Tabla1"
    Set rst = CurrentDb.OpenRecordset(strSql)

    Do While Not rst.EOF
        strCampo = "Modificado"

        rst.Edit
        rst("Campo2") = strCampo
        rst.Update
    Loop

    rst.Close
    Set rst = Nothing
End Sub

En este ejemplo, declaramos el objeto Recordset, lo abrimos asignándole un conjunto de registros, y después de realizar las modificaciones en los registros, lo cerramos con Close y le asignamos el valor Nothing para descargarlo de la memoria. Con esto nos aseguramos que el objeto ya no va a estar conectado a la tabla y a la base de datos, además de liberar la memoria que está usando.

Hay objetos que no tienen un método Close o equivalente. Estos objetos no suelen tener nada que liberar, como conexiones a bases de datos, por lo que no precisan de este tipo de métodos. Simplemente, con asignarles el valor Nothing liberaremos la memoria que ocupan, sin preocuparnos de nada más.

¿Y cómo sé que debo cerrar un objeto? Para saber si hay que liberar un objeto, debemos comprobar qué métodos tiene, y qué hace cada uno de ellos, además del archivo de ayuda que pueda tener el objeto, o ejemplos de uso que haya en Internet.

En la base de datos de ejemplo de los apuntes, hay dos funciones que abren una serie de objetos (Recordset), y trabajan con ellos. La diferencia entre ambas funciones es que una cierra esos objetos y la otra no. La diferencia es simple: el consumo de memoria tras usar los objetos y no cerrarlos, es mayor que si los cerramos:

Consumo antes de usar las funciones
Consumo de memoria de Access antes de usar las funciones.

Consumo tras usar los objetos sin cerrarlos
Consumo de memoria de Access después de usar la función que no cierra los objetos ni los destruye.

Consumo tras usar los objetos y cerrarlos
Consumo de memoria de Access después de usar la función que sí cierra los objetos y los destruye.

La diferencia en este caso no es considerable hoy en día, con los ordenadores que hay (no llega a 1 mega de memoria), pero es una diferencia que se puede incrementar, si se reutiliza la función una y otra vez. Además, el test se ha hecho contra la misma base de datos, pero si está en red, también se reduce la velocidad de esta, además que las conexiones a la base de datos aumentan.

2008 Patxi Sanz
Libro de visitas
Hosted by www.Geocities.ws

1