Cómo crear una nueva base de datos Microsoft Access
Por Enrique Martínez Montejo
Última revisión: 13/01/2013
 

El siguiente ejemplo utilizará las bibliotecas Microsoft ActiveX Data Objects (ADO) y ActiveX Data Objects para DDL y Seguridad (ADOX), mediante la interoperabilidad COM que nos ofrece la plataforma .NET, para crear una nueva base de datos Microsoft Access. Por tanto, lo primero que tiene que hacer es añadir una referencia COM a las bibliotecas de ADO y ADOX en su solución de Visual Basic .NET. Una vez efectuada la referencia, utilizaremos el método Create del objeto Catalog para crear la base de datos:

' Creamos un objeto Catalog
Dim cat As New ADOX.Catalog

Try
    ' Generamos una nueva base de datos Access 2000, 2002 ó 2003
    ' cat.Create("Provider = Microsoft.Jet.OLEDB.4.0;" & _
    '            "Data Source = C:\Mis documentos\Nuevo1.mdb")

    ' Generamos una nueva base de datos Access 2007-2013
    cat.Create("Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=C:\Mis documentos\Nuevo1.accdb"
)

    ' Cerramos el objeto ADODB.Connection que ímplicitamente
    ' se ha originado al crear el archivo de información.

    CType(cat.ActiveConnection, ADODB.Connection).Close()

    MessageBox.Show("Se ha creado con éxito la base de datos.", _
                    "Crear base de datos"
, _
                    MessageBoxButtons.OK, _
                    MessageBoxIcon.Information)

Catch ex As Exception
    MessageBox.Show(ex.Message, _
                    "Crear base de datos", _
                    MessageBoxButtons.OK, _
                    MessageBoxIcon.Error)
Finally
    ' Quitamos las referencias a las instancias de los objetos creados.
    cat.ActiveConnection = Nothing
    cat = Nothing

End Try

Si la instrucción Option Strict se encuentra activada, necesariamente deberá de utilizar la función CType para convertir explícitamente la propiedad ActiveConnection en un objeto ADODB.Connection. Una vez convertida, podrá cerrar la conexión utilizando para ello el método Close del objeto Connection. Si Option Strict se encuentra en Off (lo cual no se recomienda en absoluto en las soluciones para Visual Basic .NET), bastaría con cerrar la conexión de la siguiente manera:

cat.ActiveConnection.Close()

A decir verdad, no es necesario establecer una referencia a la biblioteca de ADO para crear la base de datos; con la biblioteca de ADOX es más que suficiente. Pero debe de saber que al crearse la base de datos, implícitamente se crea un objeto ADODB.Connection, el cual estará representado por la propiedad ActiveConnection del objeto Catalog definido. Por tal motivo, es por lo que necesitará cerrar expresamente la conexión, porque no es suficiente con establecer a Nothing el valor del objeto Catalog, dado que el recolector de elementos no utilizados liberará la instancia y recuperará los recursos asociados en un momento posterior, lo que no quiere decir que lo haga inmediatamente. Por tanto, si no cierra la conexión, puede ser que no pueda utilizar la base de datos creada en otro procedimiento de la aplicación, hasta que no cierre definitivamente la aplicación, sobre todo si en la cadena de conexión ha especificado un modo de apertura exclusivo.

Otra técnica que podríamos utilizar para evitar una referencia expresa en nuestra solución a la biblioteca de ADO, y poder eliminar de la memoria la referencia creada por el obteto Catalog, sería llamar expresamente al método Collect de la clase GC, una vez que hayamos asignado el valor Nothing a la variable objeto del tipo Catalog, de ésta manera forzamos al recolector de basura a eliminar de la memoria el objeto declarado. Posteriormente, podemos llamar al método WaitForPendingFinalizars de la clase GC, para que se detenga el proceso actual hasta que finalice el método Collect.

Para probar lo comentado anteriormente, comente la línea de código donde se cierra expresamente el objeto ADODB.Connection creado implícitamente por el objeto Catalog, y utilice la clase GC dentro del bloque Finally:

 ' Cerramos el objeto ADODB.Connection que ímplicitamente
 ' se ha originado al crear el archivo de información.

 ' CType(cat.ActiveConnection, ADODB.Connection).Close()

Finally
    cat = Nothing
    ' Obligamos a que se lleve a cabo la recolección de elementos no utilizados.
    GC.Collect()
    GC.WaitForPendingFinalizers()

End Try

Si deseamos establecer una contraseña en el momento de crear la base de datos, hay que utilizar la siguiente cadena de conexión, procurando que la longitud de la contraseña no exceda de veinte caracteres:

cat.Create ("Provider = Microsoft.Jet.OLEDB4.0;" & _
            "Data Source = C:\Mis documentos\Nuevo1.mdb;"
& _
            "Jet OLEDB:Database Password = 1234"
)

Hay que tener especial cuidado en no separar con un espacio en blanco las palabras OLEDB: y Database, porque de hacerlo nos encontraremos con el error No se pudo encontrar el archivo ISAM instalable. Por tanto, la escritura correcta es OLEDB:Database, sin espacios en blanco, lo que también es válido para cualquier otro nombre de propiedad que comience por Jet OLEDB:.

En el momento de crear la base de datos por defecto pertenece al usuario admin, por lo que si queremos que la base de datos pertenezca a otro usuario, debemos especificar en la cadena de conexión el nombre de usuario y su contraseña, si tiene establecida alguna. Para ello, necesariamente tendremos que especificar la ruta del archivo de información de grupos de trabajo donde se encuentre previamente incluido el usuario. Asimismo, tendrá que pertenecer a un grupo de trabajo que tenga los permisos oportunos para crear bases de datos, porque de lo contrario obtendremos un error. Por defecto, los usuarios pertenecientes a los grupos Admins o Users, tienen permiso para crear una base de datos. El siguiente ejemplo, creará una base de datos cuyo propietario será el usuario establecido en la propiedad User ld:

cat.Create ("Provider = Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source = C:\Mis documentos\Nuevo1.mdb;" & _
            "Jet OLEDB:Database Password = 1234;" & _
            "Jet OLEDB:System Database = C:\Mis documentos\System.mdw;" & _
            "User Id = José Pérez;" & _
            "Password = abcd")

La versión de la base de datos creada será la que corresponda con el motor de base de datos Microsoft Jet que tengamos instalado por defecto en nuestro sistema. Si queremos crear una nueva base de datos con un tipo de versión en concreto, deberemos de especificar en la cadena de conexión la propiedad Jet OLEDB:Engine Type, la cual puede tomar uno de los siguientes valores, que corresponderá con los distintos tipos de motores OLEDB que puede utilizar:

Si el usuario tiene instalado en su sistema Microsoft Access 2003, el que se cree una base de datos formato Access 2000 o Access 2002 - 2003 dependerá del formato de archivo predeterminado que tenga establecido como valor por defecto en el cuadro de diálogo Opciones de Microsoft Access, por tanto, si especificamos en la cadena de conexión el parámetro:

Jet OLEDB:Engine Type = 5

La base de datos creada tendrá formato Access 2000, si así lo tenemos especificado en nuestras Opciones de Microsoft Access; en caso contrario, la base de datos tendrá el formato de Access 2002 - 2003.

Dicho valor se guarda en el parámetro Default File Format de la siguiente clave del registro de Windows, HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Access\Settings (o ... \Office\15.0\Access\Settings, si tiene instalada la nueva versión de Access 2013), el cual puede tomar uno de los siguientes valores DWORD:

Una vez creada la base de datos, la propiedad ActiveConnection del objeto Catalog se puede asignar a la propiedad ConnectionString de un objeto Connection de la biblioteca de ADO, de ésta forma no tendremos que utilizar el método Open del objeto Connection para abrir la base de datos:

Dim cnn As ADODB.Connection

cnn = CType(cat.ActiveConnection, ADODB.Connection)

Si bien la propiedad ActiveConnection se puede asignar a un objeto Connection de ADO, no se puede asignar al mismo objeto del espacio de nombre OleDb.OleDbConnection de ADO .NET, debido a que no se permite dicha conversión.

El siguiente ejemplo presenta una función genérica que utiliza únicamente la biblioteca de ADOX para crear una base de datos Microsoft Access, con los datos de la cadena de conexión pasada a la subrutina, por lo que también nos puede servir para crear una base de datos con el nuevo formato de Access 2007 - 2013, siempre y cuando especifiquemos en la cadena de conexión el proveedor de datos Microsoft.ACE.OLEDB.12.0 (o el proveedor Microsoft.ACE.OLEDB.15.0, éste último introducido con la versión de Microsoft Access 2013). El procedimiento contempla la posibilidad de que exista la base de datos que se desea crear, por lo que si procede, se le preguntará al usuario si desea sobrescribir la base de datos existente:


Private Function CreateDatabase(ByVal connString As String, _
                                ByVal overWrite As Boolean) As Boolean

    Dim parameters() As String
    Dim dataSource As String
    Dim dataBase As String = ""
    Dim index, x As Integer
    Dim CrLf As String = Convert.ToChar(13) & Convert.ToChar(10)

    ' Cargamos en un array los distintos
    ' parámetros de la cadena de conexión

    parameters = connString.Split(";"c)

    ' Buscamos el parámetro Data Source
    For x = 0 To parameters.GetUpperBound(0)
        index = parameters(x).ToUpper.IndexOf("DATA SOURCE")
        If (index <> -1) Then
            dataSource = parameters(x)
            ' Buscamos la ruta de la base de datos, eliminando
            ' de la cadena el nombre del parámetros, el signo =
            ' y los espacios en blanco que pudiera haber

            index = dataSource.IndexOf("="c)
            dataBase = dataSource.Substring(index).TrimStart(" "c, "="c)
            Exit For
        End If
    Next

    ' Si no se ha especificado el parámetro Data Source,
    ' abandonamos el procedimiento

    If (dataBase Is Nothing) Then Return False

    ' Si existe la base de datos, pedimos confirmación
    ' para eliminarla

    If ((System.IO.File.Exists(dataBase)) AndAlso (overWrite = False)) Then
        If (MessageBox.Show("Ya existe un archivo de base de datos con el nombre '" & _
                        dataBase & "'. ¿Desea reemplazarlo?"
, _
                        "Crear base de datos", _
                        MessageBoxButtons.YesNo, _
                        MessageBoxIcon.Exclamation) = DialogResult.No) Then Return False
    End If

    ' Creamos un objeto Catalog
    Dim cat As New ADOX.Catalog

    ' Creo un objeto DirectoryInfo que apunte a la
    ' carpeta donde se creará la base de datos

    Dim di As New System.IO.DirectoryInfo(dataBase)

    ' Creo un objeto FileInfo que apunte al archivo
    ' de copia de seguridad
    '

    Dim fi As New System.IO.FileInfo(di.FullName & "~")

    Try
        ' Creamos un objeto DirectoryInfo para la copia de seguridad
        If (System.IO.File.Exists(dataBase)) Then
            ' Renombro la base de datos existente
            System.IO.File.Move(dataBase, fi.FullName)
        End If

        ' Generamos una nueva base de datos Microsoft Access
        cat.Create(connString)

        ' Se ha creado con éxito la base de datos
        '
        ' Elimino la copia de seguridad efectuada

        System.IO.File.Delete(fi.FullName)

        Return True

    Catch ex As Exception
        MessageBox.Show("No se ha podido crear la base de datos." & _
                        CrLf & CrLf & _
                        "Compruebe los parámetros de la cadena de conexión " & _
                        "e inténtelo de nuevo.", _
                        "Crear base de datos", _
                        MessageBoxButtons.OK, _
                        MessageBoxIcon.Exclamation)

        ' Si procede, restauro la base de datos
        If (System.IO.File.Exists(fi.fullname)) Then
            System.IO.File.Move(fi.FullName, dataBase)
        End If

        Return False

    Finally
        ' Forzamos el borrado del objeto de la memoria
        cat = Nothing
        GC.Collect()
        GC.WaitForPendingFinalizers()

    End Try

End Function
 

Al procedimiento, simplemente lo llamaríamos de la siguiente manera, si nuestra intención es no mostrar ningún cuadro de diálogo de confirmación de la eliminación, en el supuesto de que ya exista la base de datos:

CreateDatabase("Provider = Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source = C:\Mis documentos\Nuevo1.accdb;" & _
               "Jet OLEDB:Database Password = contraseña;" & _
               "Jet OLEDB:System Database = C:\Mis documentos\System.mdw;" & _
               "User Id = Jose Perez;" & _
               "Password = abcd", True)

 

 

Otros enlaces de interés:

Cómo crear una base de datos Microsoft Access mediante reflexión

Cómo crear una nueva base de datos Microsoft SQL Server

Indice de Ejemplos de ADO .NET

 


Enrique Martínez Montejo - 2006

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.