Cómo compactar una base de datos Access con formato 2007 - 2016
Por Enrique Martínez Montejo
Última revisión: 19/10/2015
 

Con la biblioteca JRO (biblioteca Microsoft Jet and Replication Object 2.6 Library) ya no es posible compactar una base de datos Access 2007 - 2016, o cuyo destino sea una base de datos con formato Access 2007 - 2016, aunque se especifiquen los proveedores OleDb del Motor de Conectividad de Access (Microsoft.ACE.OLEDB.12.0 o Microsoft.ACE.OLEDB.15.0), tal y como explico en el artículo Cómo compactar una base de datos Access con JRO. Para ello hay que hacer uso de la biblioteca Microsoft Office 12.0 Access Database Engine Object Library, o su ensamblado de interoperabilidad primario Microsoft.Office.Interop.Access.Dao.dll, si dispone de Access 2007 o ha descargado los Componentes de conectividad de datos de Microsoft Office 2007 System. En caso de que disponga de Access 2010, la versión de la biblioteca COM o del PIA indicados anteriormente, sería la 14.0, cuyos componentes redistribuibles podrá descargar desde la siguiente dirección: Componente redistribuible del motor de base de datos de Microsoft Access 2010.

Pero en éste artículo no me voy a dedicar a explicar el trabajo fácil, que sería referenciar en nuestro proyecto alguna de las bibliotecas de Microsoft Office Access indicadas, para compactar una base de datos mediante una llamada al método CompactDatabase de un objeto DAO.DBEngine debidamente configurado, si no que para que nuestro proyecto de Visual Basic .net no dependa de una versión concreta de las bibliotecas mencionadas, voy a explicar cómo referenciar la biblioteca en tiempo de ejecución aplicando técnicas de reflexión.

Para ello vamos a insertar en nuestro proyecto el siguiente módulo estándar:

Imports System.Reflection

''' <summary>
''' Módulo con métodos de ayuda para trabajar con bases de datos Microsoft Access.
''' </summary>
''' <author>Enrique Martínez Montejo - 2010</author>
''' <remarks></remarks>

Friend Module AccessDatabase

    ''' <summary>
    ''' Enumeración para la versión de la base de datos Microsoft Access.
    ''' </summary>
    ''' <remarks></remarks>

    <CLSCompliant(True), Flags()> _
    Public Enum AccessDatabaseTypeEnum
        ''' <summary>
        ''' Misma versión que la base de datos que se desea compactar.
        ''' </summary>

        dbSameVersion = 0
        ''' <summary>
        ''' Motor de base de datos Microsoft Jet versión 1.0.
        ''' </summary>

        dbVersion10 = 1
        ''' <summary>
        ''' Motor de base de datos Microsoft Jet versión 1.1.
        ''' </summary>

        dbVersion11 = 8
        ''' <summary>
        ''' Motor de base de datos Microsoft Jet versión 2.0.
        ''' </summary>

        dbVersion20 = &H10
        ''' <summary>
        ''' Motor de base de datos Microsoft Jet versión 3.0 (Access 95-97).
        ''' </summary>

        dbVersion30 = &H20
        ''' <summary>
        ''' Motor de base de datos Microsoft Jet versión 4.0 (Access 2000-2003).
        ''' </summary>

        dbVersion40 = &H40
        ''' <summary>
        ''' Microsoft Access 12.0 (Access 2007 o superior, sin cifrar
        ''' o con método de cifrado heredado).
        ''' </summary>

        dbVersion120 = &H80
        ''' <summary>
        ''' Microsoft Access 14.0 (Access 2010 o superior, sin cifrar
        ''' o con método de cifrado predeterminado).
        ''' </summary>

        dbVersion140 = &H100
    End Enum

    ''' <summary>
    ''' Compacta una base de datos Microsoft Accesss, teniendo la posibilidad de
    ''' especificar una nueva contraseña así como especificar una nueva versión y
    ''' criterio de ordenación para la nueva base de datos.
    ''' </summary>
    ''' <param name="source">Base de datos que se desea compactar.</param>
    ''' <param name="pwdSource">Contraseña de la base de datos de origen.</param>
    ''' <param name="destiny">Base de datos destino de la compactación.</param>
    ''' <param name="pwdDestiny">Nueva contraseña para la base de datos de destino,
    ''' o el valor Nothing o String.Empty para que la base de datos de destino
    ''' esté descifrada.</param>
    ''' <param name="version">Versión de la base de datos compactada.</param>
    ''' <param name="useLanguageGeneral">True para especificarle a la base de datos
    ''' de destino el lenguaje general de comparación de cadenas de texto, compatible
    ''' para secuencias de ordenación en inglés, alemán, francés, portugués, italiano
    ''' y español (alfab. internacional); False para utilizar la misma configuración
    ''' regional que tiene la base de datos que se desea compactar.</param>
    ''' <remarks></remarks>

    Friend Sub CompactDataBase(source As String, pwdSource As String, destiny As String, _
                               pwdDestiny As String, version As AccessDatabaseTypeEnum, _
                               useLanguageGeneral As Boolean)

        ' NOTA IMPORTANTE: el código compactará la base de datos utilizando la versión actual
        ' de la biblioteca de DAO que actualmente se encuentre instalada en el equipo. Quiere
        ' esto decir que si en el mismo equipo están instalados Access 2007, Access 2010,
        ' Access 2013 y Access 2016, prevalecerá la versión de DAO de la última instalación
        ' efectuada, o de la última versión que se haya utilizado al abrir la interfaz de
        ' usuario de Microsoft Access.
        '
        ' Si una base de datos de Access fue compactada utilizando Access 2010, 2013 o 2016,
        ' la base de datos resultante de la compactación puede que no sea reconocida por
        ' Microsoft Access 2007, sobre todo si se le ha asignado una contraseña a la
        ' base de datos de destino, porque a partir de Access 2010 se mejoró el sistema
        ' de cifrado, y el usuario de Microsoft Access puede haber decidido utilizar el
        ' cifrado predeterminado que da mayor seguridad que el cifrado heredado de versiones
        ' anteriores.
        '
        ' Verificar los valores de los parámetros pasados al procedimiento.
        '
        If (String.IsNullOrWhiteSpace(source)) Then
            Throw New ArgumentException("No se ha especificado la base de datos que se desea compactar.")
        End If

        If (Not IO.File.Exists(source)) Then
            Throw New IO.FileNotFoundException("No existe la base de datos que se desea compactar.")
        End If

        If (String.IsNullOrWhiteSpace(destiny)) Then
            Throw New ArgumentException("No se ha especificado la base de datos de destino.")
        End If

        If (IO.File.Exists(destiny)) Then
            Throw New ArgumentException("Ya existe un archivo con el mismo nombre que el archivo de destino especificado.")
        End If

        Dim dbe As Object = Nothing

        Try
            ' Crear mediante reflexión un objeto DAO.DBEngine mediante su ProgId.
            '

            Dim ty As Type = Nothing
            dbe = CreateObject("DAO.DBEngine.120", ty)

            If (dbe Is Nothing) Then
                Throw New Runtime.InteropServices.COMException( _
                "No se encuentra instalado ningún motor de datos Microsoft Access 2007 o superior.")
            End If

            ' Argumentos del método DAO.DBEngine.CompactDatabase, donde únicamente son requeridos
            ' los dos primeros argumentos, siendo opcionales los tres últimos, de ahí que por
            ' defecto se le especifique a estos el valor System.Reflection.Missing.Value.
            '

            Dim args As Object() = New Object() {source, destiny, Missing.Value, Missing.Value, Missing.Value}

            Dim locale As String = Nothing
            If (useLanguageGeneral) Then
                ' IMPORTANTE: Si se desea convertir una base de datos al formato de Access 2010,
                ' aparte de especificar el valor de versión dbVersion140, hay que asignarle
                ' explícitamente a la base de destino el valor 'locale' correspondiente a la
                ' constante DAO.dbLangGeneral o una contraseña, porque si no se le asigna valor
                ' alguno, o se le asigna otro 'locale' diferente, la base de datos resultante
                ' tendrá versión dbVersion120 (Access 2007).
                '
                ' Valor de la constante DAO.dbLangGeneral, compatible para secuencias de
                ' ordenación en inglés, alemán, francés, portugués, italiano y español
                ' (alfab. internacional).
                '

                locale = ";LANGID=0x0409;CP=1252;COUNTRY=0"   ' Valor de la constante DAO.dbLangGeneral
            End If

            ' Me decido por aplicar la misma técnica que utiliza Access 2007 o superior.
            ' Si se ha especificado una contraseña para la base de datos de destino, ésta
            ' se cifrará, de lo contrario se descifrará.
            '
            ' Para desencriptar la base de datos, primero tiene que estar encriptada, por
            ' lo que verificamos:
            '
            ' - Que se haya especificado una contraseña para la base de datos de origen, y
            ' - Que no se haya especificado una contraseña para la base de datos de destino.
            '

            Dim decrypt As Boolean = ((Not String.IsNullOrWhiteSpace(pwdSource)) AndAlso (String.IsNullOrWhiteSpace(pwdDestiny)))

            ' Para encriptar la base de datos, se necesita que se haya especificado
            ' una contraseña para la base de datos de destino.
            '

            Dim encrypt As Boolean = (Not String.IsNullOrWhiteSpace(pwdDestiny))
            If (encrypt) Then
                ' Cifrar la base de datos resultante
                locale &= ";pwd=" & pwdDestiny

            ElseIf (decrypt) Then
                ' Descifrar la base de datos resultante siempre y cuando la base
                ' de datos de origen se encuentre protegida mediante contraseña,
                ' porque si no lo está, se obtendrá el error 'Argumento no válido'
                ' si solamente se especifica el siguiente valor:
                '

                locale &= ";pwd="
            End If

            If (Not locale Is Nothing) Then
                ' Solamente especificaremos el valor del tercer parámetro del
                ' método DAO.DBEngine.CompactDatabase si el valor 'locale' es
                ' distinto de Nothing.

                args(2) = locale
            End If

            ' ¿Es un archivo de Access inferior a la versión de Access 2007?
            '

            Dim isMdbFile As Boolean = _
                ((version < AccessDatabaseTypeEnum.dbVersion120) AndAlso (version <> AccessDatabaseTypeEnum.dbSameVersion))

            If (isMdbFile) Then
                ' Se trata de una base de datos con versión inferior a Access 2007, por lo que hay
                ' que especificar explícitamente el valor 'dbEncrypt' para encriptar o 'dbDecrypt'
                ' para desencriptar la base de datos resultante a la misma vez que se compacta,
                ' valor éste último que se sumará con el de la versión de la base de datos destino
                ' de la compactación.
                '
                ' Para bases de datos con versión de Access 2007 o superior, no es necesario
                ' especificar los valores 'dbEncrypt' o 'dbDecrypt'.
                '

                If (encrypt) Then
                    args(3) = version + 2 ' Const dbEncrypt = 2

                Else
                    args(3) = version + 4 ' Const dbDecrypt = 4

                End If

            ElseIf (version <> AccessDatabaseTypeEnum.dbSameVersion) Then
                ' Asignar la versión de la base de datos resultante cuando
                ' sea una base de datos versión Access 2007 o superior.
                '

                args(3) = version

            End If

            If (Not String.IsNullOrWhiteSpace(pwdSource)) Then
                ' Por último, y siempre y cuando se haya especificado una contraseña para
                ' la base de datos de origen, le asignamos ésta al último parámetro del
                ' método DAO.DBEngine.CompactDatabase.
                '

                args(4) = ";pwd=" & pwdSource
            End If

            ' Compactar la base de datos.
            '

            ExecuteMethod(dbe, ty, "CompactDatabase", args)

            ' La base de datos se ha compactado satisfactoriamente.
            '
        Finally
            If (Not dbe Is Nothing) Then
                ' Disminuimos el contador de referencias y liberamos
                ' la referencia al objeto.

                Runtime.InteropServices.Marshal.FinalReleaseComObject(dbe)
                dbe = Nothing
            End If


        End Try

    End Sub

    ''' <summary>
    ''' Crea y devuelve una referencia al objeto COM especificado.
    ''' </summary>
    ''' <param name="progId">Nombre correspondiente al ProgId del objeto COM que se desea obtener.</param>
    ''' <param name="ty">Se devolverá el tipo asociado al identificador de programa especificado.</param>
    ''' <returns></returns>
    ''' <remarks></remarks>

    Private Function CreateObject(progId As String, ByRef ty As Type) As Object

        ' Obtener el tipo asociado al identificador de programa (ProgID) especificado.
        '

        ty = Type.GetTypeFromProgID(progId)

        Dim obj As Object = Nothing

        If (Not ty Is Nothing) Then
            ' Crear la instancia del tipo de objeto especificado.
            '
           
obj = Activator.CreateInstance(ty)
        End If

        Return obj

    End Function

    ''' <summary>
    ''' Ejecuta un método de instancia público en el objeto especificado.
    ''' </summary>
    ''' <param name="app">Instancia del objeto COM cuya método público se desea ejecutar.</param>
    ''' <param name="ty">El tipo asociado al programa especificado.</param>
    ''' <param name="methodName">Nombre del método de instancia público que se desea ejecutar.</param>
    ''' <param name="args">Matriz que contiene los argumentos que se van
    ''' a pasar al método que se desea ejecutar.</param>
    ''' <returns></returns>
    ''' <remarks></remarks>

    Private Function ExecuteMethod(app As Object, ty As Type, methodName As String, args As Object()) As Object

        Dim obj As Object = Nothing
       
        If
((Not app Is Nothing) AndAlso (Not ty Is Nothing)) Then

            ' Ejecutar el método especificado.
            '

            obj = ty.InvokeMember(methodName, _
                    BindingFlags.Instance Or BindingFlags.Public Or _
                    BindingFlags.IgnoreCase Or BindingFlags.InvokeMethod, _
                    Nothing, app, args)
        End If

        Return obj

    End Function

End Module

 

Cuando deseemos crear una nueva base de datos con formato Access 2010 llamada Nueva2010.accdb, como resultado de compactar una base de datos con formato Access 2002-2003 llamada Bd1.mdb, y además queremos asignarle una contraseña a la nueva base de datos para que su contenido se encuentre cifrado, llamaríamos al método CompactDatabase ejecutando lo siguiente:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Try
        ' Base que se desea compactar.
        '

        Dim origen As String = "C:\Mis documentos\Bd1.mdb"

        ' Base de datos de destino.
        '

        Dim destino As String = "C:\Mis documentos\Nueva2010.accdb"

        AccessDatabase.CompactDataBase(origen, String.Empty, destino, "contraseña", AccessDatabaseTypeEnum.dbVersion140, True)

        MessageBox.Show("Se ha compactado satisfactoriamente la base de datos.")

    Catch ex As Exception
        ' Se ha producido un error.
        '

        If (ex.InnerException Is Nothing) Then
            MessageBox.Show(ex.Message)
        Else
            MessageBox.Show(ex.InnerException.Message)
        End If

    End Try

End Sub

 

Ni que decir tiene que si la base de datos original Bd1.mdb se encuentra protegida con una contraseña, dicho valor tendrá necesariamente que especificarlo en el segundo parámetro del método CompactDatabase. Y si desea que la base de datos de destino conserve la misma contraseña que tiene la base de datos original, entonces tendrá que especificar el mismo valor a los parámetros segundo y cuarto del método CompactDatabase, porque si solamente especifica el valor de la contraseña de la base de datos de origen, y como valor de la contraseña de la base de datos de destino especifica una cadena de longitud cero o un valor Nothing, lo que hará es desproteger y descifrar la base de datos resultante de la compactación, es decir, la base Database1.accdb del ejemplo.

Si al ejecutar el ejemplo obtiene el mensaje de error El formato de archivo especificado no admite la secuencia de ordenación seleccionada, se debe a que la base de datos que se desea compactar no admite el criterio de ordenación representado por el valor de la constante DAO.dbLangGeneral, por tanto, en el último parámetro del método CompactDatabase deberá especificar el valor False para utilizar el mismo criterio de ordenación que tiene la base de datos original, en el ejemplo, la base de datos con formato Access 2002-2003 llamada Bd1.mdb.

Fíjese que todo el trabajo lo realiza los distintos procedimientos existentes en el módulo AccessDatabase, por lo que podrá compactar cualquier tipo de base de datos de Access que le permita la versión del motor de datos de Microsoft Access que actualmente tenga instalada en su equipo. Eso sí, lo que no puede hacer es compactar una base de datos de Access a una versión inferior. La versión de la base de datos compactada tiene que ser igual o superior a la versión de la base de datos que se desea compactar.

Como el código utiliza el método CompactDatabase de un objeto DAO.DBEngine correspondiente a la biblioteca de Access 2007 o superior,  necesariamente deberá tener instalados en el equipo cliente los componentes de acceso a datos de Access 2007, Access 2010,  Access 2013 o Access 2016, ya que el código utiliza el ProgId DAO.DBEngine.120 para referenciar en tiempo de ejecución la versión de la biblioteca de Access instalada en el equipo. Dado que el método CompactDatabase no convierte los objetos propios de Microsoft Access, como formularios o informes, no debe utilizar CompactDatabase para convertir una base de datos que contiene estos objetos, tal y como así se indica en la ayuda del método DBEngine.CompactDatabase. En este caso tendría que compactar la base de datos desde la propia interfaz de usuario de Microsoft Access.

¿Para qué necesito compactar una base de datos?

Para responder a esta pregunta, mejor que sea el propio responsable del producto el que se lo indique: Ayudar a prevenir y corregir problemas con los archivos de base de datos mediante Compactar y reparar.

¿Qué significa cifrar/descifrar una base de datos?

Si una base de datos no se encuentra cifrada, su contenido podrá ser leído como texto plano por cualquier editor de texto, como bien puede ser el Bloc de Notas, por tanto, no es la mejor solución tener una base de datos descifrada si en ella se incluyen datos privados o sensibles que no deseamos que sean conocidos por cualquier persona. En cambio, al cifrar la base de datos se codificarán los datos existentes en las tablas volviéndose ilegibles, con lo que se evitará que personas no autorizadas puedan leer su contenido como texto plano.

Con el nuevo sistema de archivo *.accdb introducido con Access 2007, el contenido de la base de datos se cifrará cuando ésta sea protegida con una contraseña, y se descifrará cuando se anule o elimine dicha contraseña. En versiones anteriores de Microsoft Access 2007, había que cifrar/descifrar explícitamente el contenido de la base de datos, ya que no bastaba con protegerla con una contraseña para que los datos estuviesen cifrados. El método CompactDatabase mostrado en éste artículo no hace distinción entre cualquier versión de base de datos de Access, cifrando su contenido al compactar cuando se especifique una contraseña para la base de datos de destino, y descifrándolo cuando no se haya especificado contraseña alguna (una cadena de longitud cero o el valor Nothing).

Es importante advertirle que si está utilizando el bloqueo por registros o filas (que dicho sea de paso es el valor predeterminado de bloqueo), éste tipo de bloqueo se modificará automáticamente al cifrar la base de datos con una contraseña, pasándose a utilizar el bloqueo a nivel de página. Si su aplicación es multiusuario y los datos se encuentran compartidos, el bloqueo a nivel de página puede afectar a la disponibilidad de los datos.

Problemas de incompatibilidad al abrir con Access 2007 una base de datos protegida con Access 2010 o superior

Este es un problema que varios usuarios me han preguntado sobre la imposibilidad de abrir con Access 2007 una base de datos protegida con Access 2010 o superior, y tal inconveniente surge a raíz de la introducción en Access 2010 de un nuevo sistema de cifrado mejorado respecto al que dispone Access 2007, cifrado que hace imposible que se pueda abrir dicha base de datos protegida con una versión de Access inferior, la cual no reconoce dicho sistema de cifrado. ¡Así de sencillo!

Backward compatibility between Access 2010 and Access 2007

Cuando se crea una nueva base de datos con formato *.accdb correspondiente a Access 2007 o superior (incluida la última versión de Access 2016), dicha base de datos tiene la versión 12.0. Si esa base de datos posteriormente la protegemos con una contraseña desde la propia interfaz de usuario de Access 2010 o superior, o compactamos mediante el método CompactDatabase comentado en este artículo utilizando los objetos de Access 2010 o superior, la versión de la base de datos resultante cambiará a la número 14.0, con lo cual, esa nueva versión superior ya no es reconocida por Access 2007. Es como si desde Access 2003 queremos abrir una base de datos con formato *.accdb. Lógicamente no se podrá abrir, obteniendo el oportuno mensaje de error.

No se puede abrir la base de datos 'C:\Carpeta\Archivo.accdb'. Es posible que su aplicación no reconozca este tipo de base de datos o que el archivo esté dañado.

Pero no basta desproteger la base de datos para que pueda ser abierta desde Access 2007, porque la versión de la base de datos desprotegida seguirá siendo 14.0 por lo que continuará no siendo reconocida por Microsoft Access 2007, y como he comentado más arriba, tampoco puede compactar una base de datos con una versión superior (14.0 - Access 2010) para crear una nueva base de datos con una versión inferior (12.0 - Access 2007).

Si necesitan abrir con Access 2007 una base de datos protegida, tienen que protegerla con el mismo Access 2007 o con su biblioteca de objetos, y se podrá abrir con Access 2010 y superior, no gozando del sistema de cifrado introducido por Access 2010. Pero si desean hacer uso de este último sistema de cifrado, entonces olvídense de querer abrir la base de datos protegida con Access 2007 o su biblioteca de objetos. Por ahora no veo yo otra solución, por lo que tendrán que sopesar entre poder abrir la base de datos dentro de un conjunto más amplio de posibilidades o disponer de una mejor protección de seguridad, aunque el abanico de posibilidades de abrirla disminuya.

Quizás para desequilibrar la balanza en favor de Access 2010 o superior, me siento en la obligación de comentarles que Access 2007 hace ya unos cuantos años que salió al mercado, y que tras ese tiempo transcurrido han aparecido a octubre de 2015 tres versiones superiores de Microsoft Access: 2010, 2013 y 2016. La versión de Access 2007 no dispone de arquitectura para 64 bits, lo que no sucede con Access 2010 o superior, que tienen versiones separadas para arquitecturas de 32 y 64 bits, por lo que si utilizamos Access 2007 para nuestros desarrollos en Visual Basic .NET o en C#, necesitaremos compilar nuestras aplicaciones para 32 bits. Y si a todo esto le añadimos que las versiones posteriores a Access 2007 disponen de un mejor sistema de cifrado, ¿qué más quieren que les diga? Personalmente me inclinaría por utilizar Access 2010 o superior.

Programación de datos con Microsoft Access 2010

Tipos de bases de datos de Access que podrá compactar

¿Puedo compactar una base de datos con formato Access 2007 o superior creando una base de datos con formato *.mdb?

Si utiliza la propia interfaz de usuario de Microsoft Access, solamente podrá compactar la base de datos actualmente abierta, o aquella otra que se seleccione mediante el cuadro de diálogo Base de datos a compactar, la cual creará una base de datos resultante de la compactación que tendrá la misma versión que la base de datos original. Por tanto, en principio podríamos decir que no es posible crear mediante la compactación una base de datos con una versión superior o inferior a la base de datos que se desea compactar. Pero esto no es del todo cierto si para compactar utilizamos el método DAO.DBEngine.CompactDatabase, biblioteca de objetos que a muchos de nosotros nos es familiar desde versiones de Visual Basic muy lejanas ya en el tiempo.

Siempre y cuando una base de datos con formato Access 2007 o superior no haga uso de ciertas características que se encuentran inexistentes en versiones previas de Access, es posible mediante el método DAO.DBEngine.CompactaDatabase (método que le recuerdo es el que utiliza el ejemplo presentado en este artículo) crear una base de datos con formato Microsoft Jet 4.0 (Access 2000-2003) con los datos existentes en una base de datos con formato Access 2007 o superior, ya que tan solo tendrá que especificar el valor dbVersion40 a su parámetro version.

No obstante, si a la hora de ejecutar el método DAO.DBEngine.CompactDatabase obtiene el mensaje de error La operación no se puede completar en esta base de datos porque utiliza datos adjuntos o campos de búsqueda con varios valores, esa base de datos no se va a poder compactar creando una base de datos con formato Access 2000-2003. Y si por el contrario obtiene el mensaje de error No se puede realizar esta operación; las características de esta versión no están disponibles para bases de datos con formatos más antiguos, se debe a que está queriendo compactar una base de datos con un formato superior a un formato de archivo inferior, lo que no está permitido. Por ejemplo, este último error lo obtendrá si intenta compactar una base de datos con formato Access 2000 o superior a una base de datos con un formato inferior (Access 1.0 a Access 97).

Si desde su propia aplicación .NET desea impedir que con el método CompactDatabase se pueda compactar bases de datos a una versión de formato de archivo inferior que el que tiene la base de datos de origen, antes de llamar al método CompactDatabase, tiene que abrir explícitamente la base de dator de origen mediante el método DAO.DBEngine.OpenDatabase para obtener un objeto DAO.Database. Una vez obtenido este objeto, tendrá que consultar el valor de su propiedad Version para verificar si es inferior o no al valor especificado en el parámetro version del método CompactDatabase y actuar en consecuencia. Por supuesto, no se olvide de llamar al método Close del objeto DAO.Database obtenido para cerrar la base de datos de origen antes de proceder a su compactación.

Le comento que el método DAO.DBEngine.OpenDatabase también se puede invocar mediante reflexión, tal cual se hace en el ejemplo de más arriba con el método CompactDatabase. Pero la implementación del mismo, ya la dejo en sus manos.

 

Otros enlaces de interés:

Cómo compactar una base de datos Access con JRO

Indice de Ejemplos de ADO .NET


Enrique Martínez Montejo - 2015

NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.

NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.