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

El código fuente de los ejemplos y la base de datos: nombreBase_datacontrolADOyDAO.zip 42 KB
Recuerda copiar la base de datos en los directorios del proyecto.


Bases de datos ADO --- Índice de VB6 --- Base da datos DAO

ir al índice