Você está na página 1de 7

20/5/2018 Colección de Ejemplos de ADO .

NET

Cómo crear una nueva base de datos Microso Access


Por Enrique Mar nez Montejo
Úl ma revisión: 13/01/2013

El siguiente ejemplo u lizará las bibliotecas Microso Ac veX Data Objects (ADO) y Ac veX Data Objects
para DDL y Seguridad (ADOX), mediante la interoperabilidad COM que nos ofrece la plataforma .NET,
para crear una nueva base de datos Microso Access. Por tanto, lo primero que ene 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, u lizaremos 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 Op on Strict se encuentra ac vada, necesariamente deberá de u lizar la función


CType para conver r explícitamente la propiedad Ac veConnec on en un objeto ADODB.Connec on.
Una vez conver da, podrá cerrar la conexión u lizando para ello el método Close del objeto
http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 1/7
20/5/2018 Colección de Ejemplos de ADO .NET

Connec on. Si Op on 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.Connec on, el cual estará representado por la
propiedad Ac veConnec on del objeto Catalog definido. Por tal mo vo, 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 u lizados 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 u lizar la base de datos creada en otro
procedimiento de la aplicación, hasta que no cierre defini vamente 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 u lizar 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 po 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.Connec on creado implícitamente por el objeto Catalog, y u lice 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 u lizar 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:.

http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 2/7
20/5/2018 Colección de Ejemplos de ADO .NET

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 ene 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, enen 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 Microso
Jet que tengamos instalado por defecto en nuestro sistema. Si queremos crear una nueva base de datos
con un po 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
dis ntos pos de motores OLEDB que puede u lizar:

1 - para JET versión 1.0


2 - para JET versión 1.1
3 - para JET versión 2.x
4 - para JET versión 3.x
5 - para JET versión 4.x
6 - para Access 2007 - 2013

Si el usuario ene instalado en su sistema Microso 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 Microso 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 Microso 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\So ware\Microso \Office\11.0\Access\Se ngs (o ...
\Office\15.0\Access\Se ngs, si ene instalada la nueva versión de Access 2013), el cual puede tomar
uno de los siguientes valores DWORD:

9 - Formato Access 2000


10 - Formato Access 2002 - 2003
12 - Formato Access 2007 - 2013

Una vez creada la base de datos, la propiedad Ac veConnec on del objeto Catalog se puede asignar a
la propiedad Connec onString de un objeto Connec on de la biblioteca de ADO, de ésta forma no
http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 3/7
20/5/2018 Colección de Ejemplos de ADO .NET

tendremos que u lizar el método Open del objeto Connec on para abrir la base de datos:

Dim cnn As ADODB.Connection

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

Si bien la propiedad Ac veConnec on se puede asignar a un objeto Connec on de ADO, no se puede


asignar al mismo objeto del espacio de nombre OleDb.OleDbConnec on de ADO .NET, debido a que no
se permite dicha conversión.

El siguiente ejemplo presenta una función genérica que u liza únicamente la biblioteca de ADOX para
crear una base de datos Microso Access, con los datos de la cadena de conexión pasada a la subru na,
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
Microso .ACE.OLEDB.12.0 (o el proveedor Microso .ACE.OLEDB.15.0, éste úl mo introducido con la
versión de Microso 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

http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 4/7
20/5/2018 Colección de Ejemplos de ADO .NET

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 " & _

http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 5/7
20/5/2018 Colección de Ejemplos de ADO .NET

"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 Microso Access mediante reflexión


Cómo crear una nueva base de datos Microso SQL Server
Indice de Ejemplos de ADO .NET

Enrique Mar nez Montejo - 2006

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

http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 6/7
20/5/2018 Colección de Ejemplos de ADO .NET

NOTE: The informa on contained in this ar cle 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
ar cle.

http://mvp-access.es/softjaen/bases/adonet/sjadonet05.htm 7/7

Você também pode gostar