Anda di halaman 1dari 8

 

Indicar el path de la
base de datos usando
un data control
Ejemplos con ADO y DAO
Publicado: 18/Sep/2004
Actualizado: 18/Sep/2004
Autor: Guillermo 'guille' Som

En este ejemplo vamos a ver cómo indicar el path en el que se encuentra la


base de datos, pero lo haremos en tiempo de ejecución, es decir cuando la
aplicación esté ejecutándose.

Seguramente si lees el párrafo anterio en la que te digo lo que te voy a


explicar, no te parecerá nada del otro mundo, ya que eso se ha dicho y
explicado en varias ocasiones. Pero como resulta que aún hay mucha gente
que usa los controles "enlazados" y los data control y los asigna en modo de
diseño... pues... para ellos seguros que le irá bien esta "historia" que voy a
contar.

Seguramente cuando te explique la situación en la que puede ser útil saber lo


que te voy a contar, cambies de opinión.

Los precedentes (la situación)


Empecemos el ejemplo usando DAO, ya que en VB6 puede que haya más
gente (sobre todo los que empiezan) que usen el DataControl que está de
forma predeterminada en la barra de herramientas.

 Usando controles enlazados DAO


Estos son los pasos que debemos seguir para poder hacer el proyecto de
prueba:

1- Creamos un nuevo proyecto de Visual Basic 6 (cuando digo VB6, también se


puede aplicar a VB5 e incluso a VB4), añadimos el control Data, que está en el
Toolbox y se creará un objeto en el formulario llamado Data1.
2- Ahora le asignamos la base de datos que usaremos, lo más usual es que el
usuario seleccione el DataControl, se vaya a la ventana de propiedades,
seleccione la propiedad DatabaseName y busque una base de datos
(pulsando en el botón con los tres puntos suspensivos).

3- Una vez que hemos indicado el nombre de la base de datos, tendremos que
indicarle la tabla a la que queremos acceder. Para ello tendremos que
seleccionar la propiedad RecordSource y elegir de la lista desplegable la tabla
a usar.

Estos tres pasos serán los que nos permitan acceder a una base de datos
desde nuestro proyecto de VB6.

Nota:
En el zip con el código completo he incluido una base de
datos de prueba.
Copia esa base de datos (db2000.mdb) en el mismo
directorio del proyecto y úsala para asignarla al control data.
De esa forma será más fácil seguir las indicaciones de este
artículo.

Ahora vamos a añadir un control DataGrid, de forma que podamos manejar


de forma simple los datos de nuestra base de datos y de la tabla seleccionada.

Para añadir un DataGrid tendremos que hacer lo siguiente:

1- En el menú Proyecto (Project) seleccionamos Componentes


(Components...), nos mostrará un cuadro de diálogo con los controles ActiveX
que podemos añadir a nuestra aplicación. De ese cuadro de diálogo
seleccionaremos Microsoft Data Bound Grid Control (también se indicará la
versión del VB y el SP que se está usando, en mi caso sería 5.0 (SP3)).
Esto añadirá a la barra de herramientas el control DataGrid y haciendo doble-
click en él, lo añadiremos al formulario.

2- Seleccionamos el nuevo control que tenemos en el formulario, lo cambiamos


de tamaño y posición y ahora le indicaremos de dónde obtendrá los datos. Para
ello nos vamos a la ventana de propiedades (el DataGrid debe estar
seleccionado) y buscamos la propiedad DataSource, de la lista desplegable
seleccionamos el DataControl que usaremos para obtener los datos. En este
ejemplo será Data1 (que debería ser el único que se muestre).

Hecho todo esto, podemos pulsar F5 para ejecutar la aplicación y veremos que
el DataGrid se llena con los datos que tenga la tabla de la base de datos que le
indicamos al control Data.

Para probar que todo esto funciona como debe vamos a compilar el proyecto
(crear el ejecutable) y veamos si siempre funciona.
Para compilar el proyecto y crear el ejecutable, selecciona la opción Make del
menú File (si tienes el VB en español, seguramente tendrá otros nombres).

Ahora ve al directorio en el que está el EXE y ejecútalo (haz doble-click en él).


Si has seguido los pasos de forma correcta, debería mostrarte lo mismo que
cuando pulsaste F5 desde el IDE (entorno de desarrollo) de VB.

Haciendo que falle todo esto...


Para probar que no siempre funcionará, vamos a hacer ahora lo siguiente:

1- Asegúrate de que has cerrado la aplicación. Cierra también el VB6.

2- Crea un directorio en otro sitio.

3- Corta el ejecutable y la base de datos (se supone que la base de datos


estaba en el mismo directorio del proyecto, tal como se comenta en la nota)

4- Pégalos en el nuevo directorio.

5- Abre el ejecutable (ejecútalo, doble-click, ya sabes...)

Al ejecutarse la aplicación, nos indicará que no se puede encontrar la base de


datos y nos mostrará el path en el que estaba anteriormente.
La aplicación se abrirá, pero en el DataGrid no habrá nada... ya que no se ha
podido abrir la base de datos y por tanto no se pueden "ver" esos datos.

La solución:
Para que la aplicación vuelva a funcionar, tendríamos que volver a copiar la
base de datos en el directorio en el que estaba (el del proyecto).
Compruébalo moviendo (cortar y pegar) la base de datos al directorio del
proyecto.

El problema (colateral):
Pero... imagínate que lo que quieres hacer, es distribuir esta aplicación y la
base de datos.
Como hemos podido comprobar, la única forma de que funcione es creando un
directorio que se encuentre en el mismo "camino" que el que nosotros tenemos
en nuestro equipo.

Por ejemplo, en mi caso el directorio del proyecto es:


E:\gsCodigo\VBpruebas\Bases de datos\indicar el path de una base
de datos usando Data Control\conDAO
¿Que pasa si el cliente no tiene un disco E? O, peor aún, ¿que pasa si el disco E
del cliente es un CD-ROM?
Pues que no funcionará el programa. Y en caso de que si tenga un disco E,
tendremos que crear esos directorios para que todo funcione.

 
¿Cual es la mejor solución?
Creo que sería mejor que el programa pudiera funcionar si tanto el ejecutable
y la base de datos están en el mismo directorio, y lo más importante es: sea
cual sea ese directorio.
Es decir, nos dará igual si el disco en el que está la base y el exe es el disco C,
el E o el X, además de que el directorio puede ser cualquiera...

¿Cómo podemos hacerlo?


Indicándole al programa dónde está la base de datos.

Si la base de datos está en el mismo directorio que el ejecutable, podemos


hacer lo siguiente:

Private Sub Form_Load()


    Data1.DatabaseName = App.Path & "\db2000.mdb"
End Sub

De esta forma le indicamos al control data dónde localizar la base de datos y


todo volverá a funcionar de forma satisfactoria.
En este código, indicamos que el directorio en el que se encuentra la base de
datos es el mismo directorio desde el que se está ejecutando la aplicación.
En el caso de que la base de datos esté en otro directorio, simplemente
tenemos que usar ese directorio a la propiedad DatabaseName del data
control. Por ejemplo si leemos el path de un fichero de configuración (INI) o
desde el registro de Windows usando GetSetting, etc.

Nota:
Si tienes varias tablas en la misma base de datos y también
tienes varios controles data y a la vez varios controles
DataGrid enlazados con esos controles data, lo único que
tendrías que hacer es asignar a todos los controles data el
path correcto de la base de datos.
El resto de propiedades no hace falta cambiarlas ya que
seguirán siendo los mismos valores.

Este primer ejemplo es para usar con acceso a datos DAO.


Ahora veamos cómo hacer lo mismo pero con controles ADO.

 Usando controles enlazados ADO


Tal como vamos a comprobar, lo que vamos a hacer en esta ocasión, (usando
ADO), es casi lo mismo que en el caso de DAO, lo único que cambiará serán los
controles que vamos a usar, además de que el control data de ADO no tiene
las mismas propiedades que el de DAO.
Así que, veamos paso a paso cómo crear el proyecto, agregar los controles,
enlazarlos con la base de datos, etc., etc.

1- Creamos un nuevo proyecto de VB6

2- En el menú Proyecto (Project) seleccionamos Controles (Controls...), en el


cuadro de diálogo tenemos que seleccionar el control data de ADO, el cual (en
mi caso) tiene el nombre Microsoft ADO Data Control 6.0 (SP4) (OLEDB).

3- Repetimos el paso anterior, pero en esta ocasión seleccionamos Microsoft


DataGrid Control 6.0 (SP5) (OLEDB).

4- Con los dos pasos anteriores tendremos en el Toolbox dos nuevos controles,
hacemos doble-click en cada uno de ellos para agregarlos al formulario.

5- Seleccionamos el control data (Adodc1) para indicar la base de datos y la


tabla que vamos a usar. En la ventana de propiedades seleccionamos
ConnectionString y pulsamos en el botón con los tres puntos suspensivos
para que se muestre el asistente de conexión.

-De las tres opciones que nos muestra, seleccionamos la última: Use
Connection String, pulsamos en el botón Build... y se mostrará otro
cuadro de diálogo.
-Seleccionamos la primera ficha (Provider) y de la lista de proveedores
que muestra seleccionamos Microsoft.Jet.OLEDB.4.0 (si no se
muestra, es que no tienes ese proveedor y la base de datos de ejemplo
no te funcionará)
-Pulsa en Next>> para indicar el nombre de la base de datos, se
mostrará la segunda ficha (Connection).
-Escribe el nombre de la base de datos en la caja de texto que hay bajo
1. Select or enter a database name o pulsa en el botón con los tres
puntos para seleccionar una base (recuerda usar la base de datos que
acompaña al código la cual debe estar en el mismo directorio del
proyecto)
-No escribas nada en usuario y password, déjalos con los valores
predeterminados, ya que usaremos autentificación de Windows para
abrir la base.
-Para comprobar que se puede abrir la base de datos, pulsa en el botón
Test Connection y si todo va bien, te dirá que la conexión ha funcionado
correctamente.

6- Ahora vamos a indicar que tabla queremos usar. Asegúrate que el control
data está seleccionado y en la ventana de propiedades selecciona
RecordSource y pulsa en el botón con los tres puntos para que se muestre el
asistente.

-De la primera lista desplegable selecciona 2- adCmdTable.


-De la segunda lista selecciona la tabla que quieres usar (en nuestro
caso será Table1).
7- Ya tenemos asignado el control data para que sepa que base de datos y que
tabla debe usar.

8- Ahora vamos a indicarle al DataGrid que use el control data como fuente de
datos, por tanto selecciona el DataGrid y en la ventana de propiedades
selecciona la propiedad DataSource y de la lista desplegable tienes que
seleccionar el control data que tiene la conexión a la tabla que queremos usar,
en nuestro caso Adodc1.

9- Pulsa F5 para probar que todo funciona bien.

Con todos estos pasos tendremos una aplicación similar al del ejemplo anterior
y además, con los mismos problemas, es decir, la base de datos que usará el
ejecutable (el cual no tiene ni una línea de código) será la que hemos indicado
en el control data.
Por tanto para que funcione, la base de datos tiene que estar en el path
indicado en tiempo de diseño.
Si  hacemos la misma prueba que antes de compilar la aplicación y mover el
ejecutable y la base de datos a un directorio diferente, no funcionará.

La primera opción de ADO para que funcione:

Para que funcione debemos indicarle al data control dónde se encuentra la


base de datos, pero resulta que el control data ADO no tiene una propiedad
DatabaseName como su primo el data control DAO.
En el control ADO tenemos que usar la cadena de conexión (como en las bases
de datos de SQL Server), por tanto debemos modificar dicha cadena de
conexión para que apunte a la base de datos adecuada.
Aquí tenemos el código a añadir al proyecto para que todo funcione
correctamente:

Private Sub Form_Load()


    ' Aquí se puede indicar el path de la base de datos:
    Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
& _
                              "Data Source=" & App.Path &
"\db2000.mdb;" & _
                              "Persist Security Info=False"

    Adodc1.Refresh
    Set DataGrid1.DataSource = Adodc1.Recordset
End Sub
 

En el caso de ADO, además de indicarle el path correcto debemos usar este


código adicional:
Adodc1.Refresh para que se carguen los datos desde la base de datos.
Set DataGrid1.DataSource = Adodc1.Recordset porque debemos asignar los
datos que el control data ha cargado. Esto último no es "estrictamente"
necesario, pero si no lo hacemos el contenido de la base de datos no será el
correcto.
¿Por qué este código extra?
Por la sencilla razón de que el control data intentará obtener los datos de la
base de datos y después rellenar el DataGrid.

Además, en el caso del control data de ADO si la base de datos no está en el


sitio adecuado, se mostrará un mensaje de aviso de que la base de datos no se
ha encontrado, aunque después cargará bien los datos y funcionará
correctamente.
 

La segunda opción de ADO para que funcione

Por tanto es preferible no asignar en tiempo de diseño la cadena de conexión a


la base de datos, ni tampoco asignar el RecordSource, en este caso, el código
a usar será el siguiente:

Private Sub Form_Load()


' Aquí se puede indicar el path de la base de datos:
Adodc1.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path &
"\db2000.mdb;" & _
"Persist Security Info=False"

Adodc1.RecordSource = "Table1"
Adodc1.Refresh
Set DataGrid1.DataSource = Adodc1.Recordset
End Sub

En este caso, lo que hacemos es indicar también la tabla de la que se


extraerán los datos.
 

La tercera opción de ADO para que funcione

Otra opción es no indicar el path de la base de datos, sino sólo el nombre de la


base, de esta forma, la base se buscará en el mismo path del ejecutable.
Con lo cual la cadena de conexión podría quedar de la siguiente forma:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2000.mdb;Persist
Security Info=False

Y ya no será necesario usar ningún código en el evento Load del formulario.

 
Bueno, confío en que con estas explicaciones, (las cuales he preferido
indicarlas en plan "paso a paso para principiantes" porque, casi con seguridad,
todo esto lo necesitarán los que no tengan mucho manejo con el uso de bases
de datos...), te quede más claro porqué algunas veces las aplicaciones que
usan los controles enlazados no funcionan al cambiar el path en el que se
encuentra la base de datos.

¡Que lo disfrutes!

Nos vemos.
Guillermo

Anda mungkin juga menyukai