Está en la página 1de 106

Usar base de datos de SQL Server 2005 desde Visual Basic 6.

0
Tanto una base normal como un fichero .mdf

Publicado el 26/May/2007 Revisado el 26/May/2007 Autor: Guillermo 'guille' Som

En este artculo te explico cmo usar una base de datos de SQL Server 2005 con Visual Basic 6.0, tanto desde un fichero .mdf como en una base de una instancia de SQL Server 2005 o SQL Server 2005 Express.

Introduccin:
Cuando instalas SQL Server 2005 (tanto la versin completa como la versin Express), se aade un nuevo proveedor de bases de datos OLEDB: SQLNCLI. Ese proveedor lo tendrs que usar en tus cadenas de conexin en lugar de SQLOLEDB que es el que usars para acceder a una base de datos de SQL Server 2000 con Visual Basic 6.0.

Requisitos para el ejemplo


En este ejemplo vamos a usar un control FlexGrid para asignar un Recordset y mostrar los datos directamente. Por tanto, tendrs que crear un nuevo proyecto de Visual Basic 6.0 y agregar ese componente, el cual se muestra como:Microsoft Hierarchical FlexGrid Control 6.0 (SP4) (OLEDB) y en realidad es el control MSHFLXGD.OCX. Tambin tendrs que aadir una referencia a la librera de OLEDB, en mi caso he usado Microsoft ActiveX Data Objects 2.8 Library, pero supongo que con otra versin anterior funcionar, pero no lo he probado, y como esa referencia est disponible despus de instalar el SQL Server 2005 Express, pues... para qu complicarnos? Dependiendo de la forma en que quieras acceder a la base de datos, necesitars (como es de suponer) una base de datos de SQL Server 2005, por ejemplo la base de datos "pubs".

Si lo que pretendes es acceder a un fichero con la extensin .mdf, pues tendrs que tener el fichero al que quieres acceder. Es decir una base de datos de SQL Server 2005 en un fichero fsico, el cual puedes guardar en el mismo directorio del ejecutable o donde ms te plazca, que esa es una de las ventajas de SQL Server 2005: el poder usar un fichero de base de datos directamente, con lo que no necesitas distribuir una base de tipo Access.

El cdigo de ejemplo
En el cdigo de ejemplo, te voy a mostrar las dos formas de acceder.

1.- Acceder a una base de una instancia


En el caso de la base de datos "pubs", la cadena de conexin ser la siguiente:
Provider=SQLNCLI; Initial Catalog=pubs; Data Source=(local)\SQLEXPRESS; integrated security=SSPI; persist security info=True;

En este caso, la base de datos se supone que est en la instancia SQLEXPRESS del servidor del equipo actual, si no es as, tendrs que cambiar el valor de Data Source. La base de datos es pubs, si no fuera esa, cambia el nombre asignado a Initial Catalog. La autenticacin usada es la de Windows, si no fuera esa, tendrs que indicar el usuario y el password y cambiar adecuadamente el valor de Integrated Security, aqu tienes un ejemplo de cmo "formar" una cadena de conexin a una base de datos de SQL Server. Suponiendo que la conexin a la base de datos la hacemos desde el evento Click de un botn y que la cadena de seleccin esSELECT * FROM authors, para mostrar los datos en el control FlexGrid (llamado MSHFlexGrid1), el cdigo sera el siguiente:
Private Sub btnConectar_Click() ' La conexin a la base de datos Dim cn As ADODB.Connection Set cn = New ADODB.Connection

' Para la cadena de seleccin Dim sSelect As String

' Para una base de datos normal: sSelect = "SELECT * FROM authors"

cn.Open "Provider=SQLNCLI; " & _

"Initial Catalog=pubs; " & _ "Data Source=(local)\SQLEXPRESS; " & _ "integrated security=SSPI; persist security info=True;"

' El recordset para acceder a los datos Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset

' Abrir el recordset de forma esttica, no vamos a cambiar datos rs.Open sSelect, cn, adOpenStatic

' Permitir redimensionar las columnas MSHFlexGrid1.AllowUserResizing = flexResizeColumns

' Asignar el recordset al FlexGrid Set MSHFlexGrid1.DataSource = rs

rs.Close cn.Close

End Sub

2- Acceder a una base de un fichero


Para acceder a una base de datos que est en un fichero, necesitars indicar la ruta (path) en la que est ese fichero con la extensin .mdf. En este ejemplo, esa ruta est en la variable sBase. La cadena de conexin sera la siguiente:
Provider=SQLNCLI; AttachDBFileName= ruta completa del fichero de la base de datos; Data Source=(local)\SQLEXPRESS; integrated security=SSPI; persist security info=True;

Como es de suponer, el nombre (y el directorio completo) de la base de datos es lo que tienes que asignar aAttachDBFileName. Adems debes indicar en Data Source el nombre de la instancia de SQLEXPRESS que se usar para acceder a esa base de datos, al menos debes indicar una instancia vlida. En el siguiente cdigo tienes cmo usar una base de datos llamada PruebaPrecios.mdf que est en un directorio llamadobases del disco E. Esa base de datos debe tener una tabla llamada Clientes que es la que se usa en el siguiente ejemplo, que como en el cdigo del ejemplo anterior, se ejecuta desde

el evento Click de un botn y asigna los datos al FlexGrid que tenemos en el formulario.
Private Sub btnConectar_Click() ' La conexin a la base de datos Dim cn As ADODB.Connection Set cn = New ADODB.Connection

' Para la cadena de seleccin Dim sSelect As String

' Para usar un fichero directamente: Dim sBase As String

' Poner aqu el path y el nombre de la base sBase = "E:\bases\PruebaPrecios.mdf"

' Y la cadena de seleccin adecuada sSelect = "SELECT * FROM Clientes" ' cn.Open "Provider=SQLNCLI; " & _ "AttachDBFileName=" & sBase & "; " & _ "Data Source=(local)\SQLEXPRESS; " & _ "integrated security=SSPI; persist security info=True;"

' El recordset para acceder a los datos Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset

' Abrir el recordset de forma esttica, no vamos a cambiar datos rs.Open sSelect, cn, adOpenStatic

' Permitir redimensionar las columnas Me.MSHFlexGrid1.AllowUserResizing = flexResizeColumns

' Asignar el recordset al FlexGrid Set Me.MSHFlexGrid1.DataSource = rs

rs.Close cn.Close

End Sub

Y eso es todo, recuerda que la parte importante es saber el nombre del proveedor OLEDB que tenemos que usar, que en el caso de SQL Server 2000 es SQLOLEDB y en el caso de SQL Server 2005 es SQLNCLI. Adems debes indicar el nombre de la instancia de SQL Server adecuada, pero por lo general podrs usar el nombre que te he mostrado en el cdigo de ejemplo. Por lo dems, el cdigo a usar una vez que hemos conectado ser el que habitualmente usemos en nuestras aplicaciones de acceso a datos.

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 cmo indicar el path en el que se encuentra la base de datos, pero lo haremos en tiempo de ejecucin, es decir cuando la aplicacin est ejecutndose. Seguramente si lees el prrafo 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 an hay mucha gente que usa los controles "enlazados" y los data control y los asigna en modo de diseo... pues... para ellos seguros que le ir bien esta "historia" que voy a contar. Seguramente cuando te explique la situacin en la que puede ser til saber lo que te voy a contar, cambies de opinin.

Los precedentes (la situacin)


Empecemos el ejemplo usando DAO, ya que en VB6 puede que haya ms 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, tambin se puede aplicar a VB5 e incluso a VB4), aadimos 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 ms 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 botn 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 sern los que nos permitan acceder a una base de datos desde nuestro proyecto de VB6.

Nota: En el zip con el cdigo 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 ms fcil seguir las indicaciones de este artculo.

Ahora vamos a aadir un control DataGrid, de forma que podamos manejar de forma simple los datos de nuestra base de datos y de la tabla seleccionada. Para aadir un DataGrid tendremos que hacer lo siguiente: 1- En el men Proyecto (Project) seleccionamos Componentes (Components...), nos mostrar un cuadro de dilogo con los controles ActiveX que podemos aadir a nuestra aplicacin. De ese cuadro de dilogo seleccionaremos Microsoft Data Bound Grid Control(tambin se indicar la versin del VB y el SP que se est usando, en mi caso sera 5.0 (SP3)). Esto aadir a la barra de herramientas el control DataGrid y haciendo doble-click en l, lo aadiremos al formulario. 2- Seleccionamos el nuevo control que tenemos en el formulario, lo cambiamos de tamao y posicin y ahora le indicaremos de dnde obtendr los datos. Para ello nos vamos a la ventana de propiedades (el DataGrid debe estar seleccionado) y buscamos la propiedadDataSource, de la lista desplegable seleccionamos el DataControl que usaremos para obtener los datos. En este ejemplo ser Data1 (que debera ser el nico que se muestre).

Hecho todo esto, podemos pulsar F5 para ejecutar la aplicacin 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 opcin Make del men File (si tienes el VB en espaol, seguramente tendr otros nombres). Ahora ve al directorio en el que est el EXE y ejectalo (haz doble-click en l). Si has seguido los pasos de forma correcta, debera 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- Asegrate de que has cerrado la aplicacin. Cierra tambin 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- Pgalos en el nuevo directorio. 5- Abre el ejecutable (ejectalo, doble-click, ya sabes...) Al ejecutarse la aplicacin, nos indicar que no se puede encontrar la base de datos y nos mostrar el path en el que estaba anteriormente. La aplicacin 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 solucin: Para que la aplicacin vuelva a funcionar, tendramos que volver a copiar la base de datos en el directorio en el que estaba (el del proyecto). Comprubalo moviendo (cortar y pegar) la base de datos al directorio del proyecto. El problema (colateral): Pero... imagnate que lo que quieres hacer, es distribuir esta aplicacin 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 an, 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 solucin?


Creo que sera mejor que el programa pudiera funcionar si tanto el ejecutable y la base de datos estn en el mismo directorio, y lo ms 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, adems de que el directorio puede ser cualquiera... Cmo podemos hacerlo? Indicndole al programa dnde 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 dnde localizar la base de datos y todo volver a funcionar de forma satisfactoria. En este cdigo, indicamos que el directorio en el que se encuentra la base de datos es el mismo directorio desde el que se est ejecutando la aplicacin. 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 configuracin (INI) o desde el registro de Windows usando GetSetting, etc.

Nota: Si tienes varias tablas en la misma base de datos y tambin tienes varios controles data y a la vez varios controles DataGrid enlazados con esos controles data, lo nico que tendras 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 seguirn siendo los mismos valores.

Este primer ejemplo es para usar con acceso a datos DAO. Ahora veamos cmo hacer lo mismo pero con controles ADO.

Usando controles enlazados ADO

Tal como vamos a comprobar, lo que vamos a hacer en esta ocasin, (usando ADO), es casi lo mismo que en el caso de DAO, lo nico que cambiar sern los controles que vamos a usar, adems de que el control data de ADO no tiene las mismas propiedades que el de DAO. As que, veamos paso a paso cmo 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 dilogo 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 ocasin 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 botn con los tres puntos suspensivos para que se muestre el asistente de conexin. -De las tres opciones que nos muestra, seleccionamos la ltima: Use Connection String, pulsamos en el botn Build... y se mostrar otro cuadro de dilogo. -Seleccionamos la primera ficha (Provider) y de la lista de proveedores que muestra seleccionamosMicrosoft.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 botn con los tres puntos para seleccionar una base (recuerda usar la base de datos que acompaa al cdigo la cual debe estar en el mismo directorio del proyecto) -No escribas nada en usuario y password, djalos con los valores predeterminados, ya que usaremos autentificacin de Windows para abrir la base. -Para comprobar que se puede abrir la base de datos, pulsa en el botn Test Connection y si todo va bien, te dir que la conexin ha funcionado correctamente. 6- Ahora vamos a indicar que tabla queremos usar. Asegrate que el control data est seleccionado y en la ventana de propiedades selecciona RecordSource y pulsa en el botn 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 conexin 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 aplicacin similar al del ejemplo anterior y adems, con los mismos problemas, es decir, la base de datos que usar el ejecutable (el cual no tiene ni una lnea de cdigo) 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 diseo. Si hacemos la misma prueba que antes de compilar la aplicacin y mover el ejecutable y la base de datos a un directorio diferente, no funcionar.

La primera opcin de ADO para que funcione: Para que funcione debemos indicarle al data control dnde 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 conexin (como en las bases de datos de SQL Server), por tanto debemos modificar dicha cadena de conexin para que apunte a la base de datos adecuada. Aqu tenemos el cdigo a aadir 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, adems de indicarle el path correcto debemos usar este cdigo 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 cdigo extra? Por la sencilla razn de que el control data intentar obtener los datos de la base de datos y despus rellenar el DataGrid.

Adems, 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 despus cargar bien los datos y funcionar correctamente.

La segunda opcin de ADO para que funcione Por tanto es preferible no asignar en tiempo de diseo la cadena de conexin a la base de datos, ni tampoco asignar el RecordSource, en este caso, el cdigo 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 tambin la tabla de la que se extraern los datos.

La tercera opcin de ADO para que funcione Otra opcin es no indicar el path de la base de datos, sino slo el nombre de la base, de esta forma, la base se buscar en el mismo path del ejecutable. Con lo cual la cadena de conexin podra 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 ningn cdigo en el evento Load del formulario.

Bueno, confo en que con estas explicaciones, (las cuales he preferido indicarlas en plan "paso a paso para principiantes" porque, casi con seguridad, todo esto lo necesitarn los que no tengan mucho manejo con el uso de bases de datos...), te quede ms 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 cdigo 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.

Conectar a una base de datos de SQL Server con VB6


(Abrir una tabla y mostrar los campos/columnas de la tabla)

Publicado: 10/Sep/2004 Actualizado: 26/May/2007 Pulsa aqu, si quieres ver cmo conectar a una base de SQL Server 2005

Es curioso, pero de todos los ejemplos que tengo sobre acceso a bases de datos, (usando VB6 y anteriores), no tena ninguno que usase una base de datos de SQL Server, todos los ejemplos eran de bases de Access. Pero ms vale tarde que nunca, verdad? Pues aqu tienes un ejemplo para acceder a una base de datos de SQL Server, abrir una tabla y, para que el ejemplo no sea demasiado corto, mostraremos en un combo todos los campos (columnas) de dicha tabla. Seguramente en otras ocasiones pondr ejemplos ms completos que usen bases de datos de SQL Server, aunque, si te fijas, lo nico que diferencia el uso de este tipo de bases de datos y las de Access es la forma de conectarse al "proveedor" de la base de datos. Para este ejemplo, tendremos un formulario en el que colocaremos un botn llamado cmdAbrir y un ComboBox llamado cboCampos. Tambin necesitaremos una referencia a: Microsoft ActiveX Data Objects 2.0 Library o cualquier versin superior que tengas. En la parte general de declaraciones tendremos definidas dos variables, una de un objeto Connection y otra de un objeto Recordset. En el evento del botn cmdAbrir haremos todo el proceso de conectar a la base de datos, cargar el recordset con la tabla que queramos acceder y mostraremos los campos de dicha tabla en el combo.

Aqu tienes el cdigo completo. Nota: He resaltado en negrita y en rojo los sitios en los que deberas indicar tus propios datos, es decir, el Data Source (fuente de datos), la base de datos (Initial Catalog) y la tabla a abrir. En este ejemplo, el Data Source usado en el ejemplo, es el que instala el SDK de .NET Framework.

'----------------------------------------------------------------------------' Conectar a una base de datos de SQL Server (08/Sep/04) ' y mostrar los campos de la tabla ' ' Para que este ejemplo funcione, necesitamos una referencia a: ' Microsoft ActiveX Data Objects 2.0 Library (o superior) ' ' Guillermo 'guille' Som, 2004 '----------------------------------------------------------------------------Option Explicit Private cnn As ADODB.Connection Private rst As ADODB.Recordset Private Sub cmdAbrir_Click() Dim tField As ADODB.Field ' ' Por si ya estaba abierta... Set cnn = Nothing Set rst = Nothing ' ' Crear los objetos Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset '

' abrir la base usando las credenciales de Windows cnn.Open "Provider=SQLOLEDB; " & _ "Initial Catalog=pubs; " & _ "Data Source=(local)\NETSDK; " & _ "integrated security=SSPI; persist security info=True;" ' ' abrir el recordset indicando la tabla a la que queremos acceder rst.Open "SELECT * FROM authors", cnn, adOpenDynamic, adLockOptimistic ' ' Asignar los nombres de los campos al combo With cboCampos .Clear For Each tField In rst.Fields .AddItem tField.Name Next .ListIndex = 0 End With ' ' Cerrar el recordset y la conexin rst.Close cnn.Close ' End Sub

Conectar a una base de datos de SQL Server con VB6


(Abrir una tabla y mostrar los campos/columnas de la tabla)

Publicado: 10/Sep/2004

Actualizado: 26/May/2007 Pulsa aqu, si quieres ver cmo conectar a una base de SQL Server 2005

Es curioso, pero de todos los ejemplos que tengo sobre acceso a bases de datos, (usando VB6 y anteriores), no tena ninguno que usase una base de datos de SQL Server, todos los ejemplos eran de bases de Access. Pero ms vale tarde que nunca, verdad? Pues aqu tienes un ejemplo para acceder a una base de datos de SQL Server, abrir una tabla y, para que el ejemplo no sea demasiado corto, mostraremos en un combo todos los campos (columnas) de dicha tabla. Seguramente en otras ocasiones pondr ejemplos ms completos que usen bases de datos de SQL Server, aunque, si te fijas, lo nico que diferencia el uso de este tipo de bases de datos y las de Access es la forma de conectarse al "proveedor" de la base de datos. Para este ejemplo, tendremos un formulario en el que colocaremos un botn llamado cmdAbrir y un ComboBox llamado cboCampos. Tambin necesitaremos una referencia a: Microsoft ActiveX Data Objects 2.0 Library o cualquier versin superior que tengas. En la parte general de declaraciones tendremos definidas dos variables, una de un objeto Connection y otra de un objeto Recordset. En el evento del botn cmdAbrir haremos todo el proceso de conectar a la base de datos, cargar el recordset con la tabla que queramos acceder y mostraremos los campos de dicha tabla en el combo. Aqu tienes el cdigo completo. Nota: He resaltado en negrita y en rojo los sitios en los que deberas indicar tus propios datos, es decir, el Data Source (fuente de datos), la base de datos (Initial Catalog) y la tabla a abrir. En este ejemplo, el Data Source usado en el ejemplo, es el que instala el SDK de .NET Framework.

'-----------------------------------------------------------------------------

' Conectar a una base de datos de SQL Server (08/Sep/04) ' y mostrar los campos de la tabla ' ' Para que este ejemplo funcione, necesitamos una referencia a: ' Microsoft ActiveX Data Objects 2.0 Library (o superior) ' ' Guillermo 'guille' Som, 2004 '----------------------------------------------------------------------------Option Explicit Private cnn As ADODB.Connection Private rst As ADODB.Recordset Private Sub cmdAbrir_Click() Dim tField As ADODB.Field ' ' Por si ya estaba abierta... Set cnn = Nothing Set rst = Nothing ' ' Crear los objetos Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset ' ' abrir la base usando las credenciales de Windows cnn.Open "Provider=SQLOLEDB; " & _ "Initial Catalog=pubs; " & _ "Data Source=(local)\NETSDK; " & _ "integrated security=SSPI; persist security info=True;" ' ' abrir el recordset indicando la tabla a la que queremos acceder rst.Open "SELECT * FROM authors", cnn, adOpenDynamic, adLockOptimistic ' ' Asignar los nombres de los campos al combo With cboCampos

.Clear For Each tField In rst.Fields .AddItem tField.Name Next .ListIndex = 0 End With ' ' Cerrar el recordset y la conexin rst.Close cnn.Close ' End Sub

Algunas instrucciones SQL para manejar los datos


Publicado el 02/May/2004 Actualizado el 26/May/2008 Autor: Guillermo 'guille' Som Nota 26/May/08: Aqu tienes ms ejemplos de instrucciones de SQL usadas desde ADO.NET Los links: Sobre el contenido de esta seccin Seleccionar los datos a cargar de una tabla (SELECT) (02/May/04) Clasificar los datos seleccionados (ORDER BY) (02/May/04) Indicar el nmero mximo de registros a devolver (TOP) (02/May/04) Actualizar los datos segn un criterio (UPDATE) (02/May/04) Eliminar los datos segn un criterio (DELETE) (02/May/04)

Seleccionar los datos a cargar de una tabla (02/May/04) Esta es la forma ms sencilla y habitual de usar las rdenes SQL. Normalmente usaremos este tipo de instrucciones para cargar los datos en un DataTable (si trabajamos con ADO.NET o en un Recordset si trabajamos con ADO o DAO). Por ejemplo:

SELECT * FROM Clientes WHERE Provincia = 'Madrid' Este cdigo SQL selecciona los registros de la tabla Clientes que residan en Madrid. Los campos que devolvera seran todos, ya que hemos indicado * despus de SELECT. Si slo queremos que devuelva los datos contenidos en los campos Nombre, Apellidos y NIF haramos esto otro: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' TIP: Por rendimiento, es recomendable devolver slo los campos que realmente necesitamos en lugar de devolver todos los campos.

Clasificar los datos seleccionados (ORDER BY) (02/May/04) Tambin podemos indicar que esos datos se devuelvan clasificados por cualquier campo, por ejemplo por los Apellidos de forma ascendente (la forma predeterminada): SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos Pero si queremos los datos de mayor a menor (descendente), le aadimos la instruccin DESC despus del campo por el que queremos clasificar: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC O si queremos que la clasificacin se haga usando dos campos, esos campos los indicaremos separados por comas: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos, Nombre Y si queremos que el orden sea descendente, le aadimos a continuacin la instruccin DESC detrs de cada campo: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC, Nombre DESC Tambin podemos clasificar en distinto orden los campos indicados tras ORDER BY, por ejemplo: SELECT * FROM Clientes ORDER BY Apellidos DESC, Nombre ASC, NIF DESC .

Indicar el nmero mximo de filas a devolver (TOP) (02/May/04)

Al realizar una seleccin de datos clasificados (usando ORDER BY), podemos indicar el nmero de filas (registros) mximos que queremos devolver, para ello indicaremos TOP y el nmero de filas o el porcentaje de filas a devolver: Con las siguientes instrucciones se devolvern los primeros 50 registros (si los hay) que cumplan las condiciones indicadas: SELECT TOP 50 Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC TOP no diferencia filas que sean iguales, es decir, si la fila 50 y la 51 tienen los mismos Apellidos, devolver 51. En este otro ejemplo, se devolver el 20% de las filas que coincidan con las instrucciones SQL indicadas: SELECT TOP 20 PERCENT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC Nota: Dependiendo de que estemos usando DAO o ADO el nmero de filas devueltas puede que sea distinto de cuando usamos ADO.NET, al menos en una misma tabla, usando TOP 150, con ADO me devolva 151 filas y con ADO.NET me devolva 150. No se si es que TOP se comporta de forma diferente en ADO.NET .

Actualizar los datos segn un criterio (UPDATE) (02/May/04) Si lo que quieres es actualizar el contenido de un campo cuando se cumpla un criterio indicado, en lugar de recorrer todas las filas, podemos usar UPDATE / SET, por ejemplo: UPDATE Clientes SET NPr = 28 WHERE Provincia = 'Madrid' Esto har que se asigne un valor 28 al campo NPr de todos los clientes que cumplan lo que se indica despus de WHERE, es decir que cumplan el criterio indicado. Tambin podemos indicar (despus de SET) varios campos a actualizar, separndolos por comas: UPDATE Clientes SET NPr = 28, Patrn = 'San Isidro' WHERE Provincia = 'Madrid' Una vez ejecutadas estas instrucciones SQL no se podr deshacer los cambios, al menos si estamos trabajando con Recordsets DAO o ADO, ya que si trabajamos con ADO.NET, esos datos slo se harn permanentes al actualizar "fsicamente" los datos con el DataAdapter. .

Eliminar los datos segn un criterio (DELETE) (02/May/04) De la misma forma que podemos actualizar la informacin mediante un criterio WHERE, podemos eliminar los registros de forma "masiva" usando la instruccin DELETE. Por ejemplo para eliminar todos los Clientes de Madrid: DELETE * FROM Clientes WHERE Provincia = 'Madrid'

Nota: Ni que decir tiene que este tipo de instrucciones SQL hay que usarla con muchsima precaucin, ya que si la tabla est ligada a otra, tambin se perdern los datos relacionados. Y una vez eliminados los datos... ya no se pueden recuperar. El uso de DELETE no elimina la tabla, aunque se eliminaran todos los registros. .

Sobre el contenido de esta seccin. En esta pgina te mostrar algunas instrucciones SQL que te permitirn manejar datos de forma ms o menos fcil o al menos te servirn como punto de referencia cuando necesites hacer algo en concreto. Algunas de estas instrucciones (u rdenes) servirn tanto para bases de datos del tipo Access como de SQL Server (e incluso otros proveedores de datos), en la medida de lo posible, intentar indicar si hay alguna restriccin para algunos de los proveedores. Tambin intentar informarte cmo usar esas instrucciones, ya que algunas simplemente servirn para seleccionar datos y otros harn cambios en las tablas afectadas. Los ejemplos principalmente sern para usar con ADO.NET, pero en otras ocasiones tambin sern vlidas para ADO e incluso para DAO, en estos casos es posible que existan otros links (enlaces) a las pginas de ADO y DAO "normales", las que estn en la seccin de VB. Si no se indica nada (sobre todo si no hay ejemplos de cdigo), las instrucciones SQL indicadas sern vlidas tanto para DAO, ADO y ADO.NET y para bases de Access o SQL Server

Nota: El que se llame rdenes SQL (o instrucciones SQL), no quiere decir que slo sean vlidos para bases de datos SQL Server, ya que el "lenguaje" SQL es un estndar (o casi) que se usa para manejar los datos de cualquier base de datos, (al menos las de Access y SQL Server).

usando ADO, desde un formulario Web (.aspx)


Publicado el 02/Ene/2004 Actualizado el 02/Ene/2004

Panorama

Introduccin
En este ejemplo se accede a una base de datos de Access usando ADO. Como vers el cdigo ser parecido al que se usara en una pgina ASP normal. Lo nico que tenemos que hacer es: Indicar que se va a usar compatibilidad con COM. Esto se consigue indicando aspcompat = true en la directiva ASP.NET indicada al principio de la pgina. La forma de acceder a los objetos ADO (que son COM/ActiveX) ya que habr que usar cdigo "compatible" con punto NET, al menos en la forma de llamar a los mtodos y funciones, es decir usando los parntesis para encerrar los parmetros. Ya que por lo dems, el cdigo es "exactamente" el mismo que se usara con ASP y VBScript.

En el ejemplo siguiente, se da por supuesto que existe un directorio llamado "datos" que est en el mismo directorio que la pgina ASPX, si cambias la localizacin de ese directorio, tendrs que cambiar el cdigo de la conexin, ms concretamente en el parmetro a Server.MapPath(...). En el zip con el ejemplo, incluyo una pequea base de datos que es la usada en el formulario Web. Por tanto, si lo descomprimes, procura que la base de datos se quede dentro del directorio "datos". De forma predeterminada se crear ese directorio.

Dnde descomprimir el fichero? Dentro del directorio "localhost", por defecto es: C:\Inetpub\wwwroot Para acceder a la pgina de prueba, tendrs que usar http://localhost/ejemploAccessADO.aspx Por supuesto esto slo ser posible si tienes el Windows 2000/XP Profesional o un Windows Server que tenga instalado el IIS. En este ejemplo slo muestro el cdigo de Visual Basic, ya que al fin y al cabo es VBScript.

Nota: Este ejemplo realmente no utiliza ningn control ASP.NET, slo cdigo "puro y duro".

El link al cdigo de ejemplo: ejemploAccess.zip (13.4KB) El cual incluye tambin el ejemplo de acceso a ADO.NET (tanto para VB como para C#)

El cdigo para VBSCRIPT.

<% @Page aspcompat=true Language = VB %> <html> <head> <title>Acceso a datos con compatibilidad ASP (COM)</title> </head> <BODY bgcolor="#FFFFFF" text="#000000"> <p><font face="Verdana" size="4">Prueba de acceso a base de datos Access con ADO desde ASP.NET</font> <hr noshade size="3"> <font face="Verdana" size="2"> <br> <% ' Variables usadas para crear los objetos, etc.

Dim Rst, Cnn Dim sConn, sTip Dim sTitulo, sLink, sApartado, sDescripcion Dim s, i ' Crear los objetos Cnn = Server.CreateObject("ADODB.Connection") ' Crear la conexin a la base de datos sConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ Server.MapPath("datos\elguille.mdb") & ";" Cnn.Open(sConn) ' Crear la cadena SQL s = "SELECT * FROM Titulos ORDER BY Apartado ASC" Rst = Cnn.Execute(s) On Error Resume Next Err.Clear ' Buscar desde el principio Rst.MoveFirst i = 0 Do While Not (Rst.BOF Or Rst.EOF) i = i + 1 With Rst ' Asignar a las variables el contenido del registro sTitulo = .Fields("Titulo").Value & "" sLink = .Fields("Link").Value & "" sApartado = .Fields("Apartado").Value & "" sDescripcion = .Fields("Descripcion").Value & "" ' Mostrar los datos hallados Response.Write(i & "- <a href='" & sLink & "'>" & _ sTitulo & "</a> <b>(" & _ sApartado & ")</b><br>" & sDescripcion & "<br>") End With ' ' Mostrar el siguiente registro Rst.MoveNext Loop Response.Write("<br>")

Err.Clear If i = 0 Then Response.Write("<br><b>No se ha encontrado ningn registro que contenga") Response.Write(" lo que has especificado.</b><br>") Response.Write("Pulsa en este link para <b>") Response.Write("<a href='mostrarDatosTodo.aspx'>" Response.Write("Mostrar todos los registros</a></b>.<br>") End If ' Rst.Close Cnn.Close Rst = Nothing Cnn = Nothing ' %> <hr noshade size="3"> </font> </body> </html>

Comprobar si un Recordset est vaco (18/Dic/2003) Como sabrs, se puede usar .BOF o .EOF para comprobar si est en los lmites del recordset. BOF devolver True si el "puntero" est antes del primer registro, por otro lado EOF nos indicar si ese puntero est despus del ltimo registro, pero la recomendacin para comprobar si realmente est vaco es que se cumplan esas dos condiciones: que tanto BOF como EOF sean True, por tanto podremos hacer una comprobacin como esta: With rst If .EOF And .BOF Then lblData.Caption = "No hay ningn registro activo" .MoveFirst Else Text1(0) = .Fields("Au_ID") ' Por si el dato es nulo, aadirle una cadena vacia Text1(1) = .Fields("Author") & "" Text1(2) = .Fields("Year Born") & "" End If

End With

Aunque tambin se podra comprobar que .BOF Or .EOF sean True, es decir, hacer algo como esto: If .EOF Or .BOF Then pero ya te digo que lo ms correcto es usar AND, al menos eso es lo que he ledo en la documentacin de ADO. Espero que esta pequea aclaracin te pueda ser de utilidad. Nos vemos. Guillermo

Ms consejos para mejorar el acceso a los datos, aportados por Norman A. Armas (25/Oct/2001) Algunos consejos para mejorar el acceso a datos: -Abrir el recordset o el Data slo en el momento necesario, NUNCA abrir los recordsets o datas en el momento de cargar la forma (salvo en casos en que no queda mas remedio) Por ejemplo si tienes un formulario con varios combos no es necesario llenarlos en el momento de cargar la forma, una buena costumbre es cargarlos en el momento en que el usuario haga click en el combo. -No cargar mas de 100 records como mximo en un grid o lista, si es necesario mostrar ms, jugar con el SELECT TOP y el WHERE para mostrar los datos en bloques de a 100 (o menos de 100)

Compactar una base de datos con password y cambiarlo. (24/Oct/2001) Para compactar una base de datos con password (o contrasea), se hace prcticamente igual que en una base de datos sin password, lo nico que hay que hacer es aadirle la cadena correspondiente al cdigo mostrado anteriormente. Este sera el cdigo para compactar una base de datos con password:
je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";" & _ "Jet OLEDB:Database Password=PasswordAnterior", _ "Data Source=" & sDBTmp & ";"

Y este otro para cambiarle el password actual y ponerle otro:


je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";" & _ "Jet OLEDB:Database Password=PasswordAnterior", _

"Data Source=" & sDBTmp & ";" & _ "Jet OLEDB:Database Password=NuevoPassword"

Consejos para mejorar el acceso a los datos (04/Oct/2001) Esta seccin te mostrar algunos consejos con los cuales podrs mejorar el acceso a los datos, el primero de ellos, con el que inauguramos esta seccin es de Norman A. Armas, si crees que tienes alguno que se pueda aadir, me lo mandas. Gracias. 1. Consejo aportado por Norman A. Armas, publicado el 04/Oct/2001 Nunca usar SELECT * FROM TuTabla., especifica siempre que campos son los que se quieren seleccionar en ese momento y que record o records

Cdigo de ejemplo de compacta, crear base y crear tablas con ADO (29/Sep/2001)
Este es el link al cdigo completo de los tres casos indicados: Cmo crear una base de datos con ADO, Cmo crear tablas y Cmo compactar una base de datos. En la pgina se muestra el cdigo completo, el cual puedes bajar mediante un fichero comprimido. Que lo disfrutes! Guillermo

Compactar una base de datos usando ADO y VB (29/Sep/2001)


Para compactar bases de datos usando ADO, tienes que crear una referencia a Microsoft Jet and Replication Objects 2.6 Library (JRO). Nota: JRO slo se puede usar con bases de datos Microsoft JET Aqu tienes el cdigo necesario para compactar una base de datos: Private Sub cmdCompactar_Click() ' Compactar una base de datos con ADO

Dim sDBTmp As String Dim je As JRO.JetEngine ' On Error GoTo ErrCompactar ' Set je = New JRO.JetEngine ' ' Crear un nombre "medio" aleatorio sDBTmp = "DBT_" & Format$(Minute(Now), "00") & Format$(Second(Now), "00") & ".mdb" ' Asegurarnos de que no existe una base con el nombre temporal If Len(Dir$(sDBTmp)) Then Kill sDBTmp End If ' lblInfo.Caption = " Compactando la base de datos..." lblInfo.Refresh ' ' Compactar la base de datos je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";", _ "Data Source=" & sDBTmp & ";" ' ' Eliminar la base de datos original Kill txtNombreBase.Text ' ' Renombrar la base temporal con el original Name sDBTmp As txtNombreBase.Text ' lblInfo.Caption = " Base de datos compactada." lblInfo.Refresh ' Exit Sub ' ErrCompactar: ' Mostrar el mensaje de error MsgBox "Error al compactar la base de datos:" & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation, "Error al compactar la base de datos" Err.Clear lblInfo.Caption = " *** Error al compactar la base de datos ***"

lblInfo.Refresh End Sub Para ms informacin: Compacting a Database (MDAC Technical Articles)

Crear una tabla en una base de datos usando ADO y VB (29/Sep/2001)


Hay que crear una referencia a ADOX (ver Cmo crear una base de datos con ADO). El cdigo, casi simplificado, sera algo como esto:

Dim cat As ADOX.Catalog Dim tbl As ADOX.Table ' Set cat = New ADOX.Catalog Set tbl = New ADOX.Table ' ' Abrir el catlogo cat.ActiveConnection = _ "Provider=" & cboProvider.Text & ";" & _ "Data Source=" & txtNombreBase.Text & ";" ' ' Crear la nueva tabla With tbl .Name = txtNombreTabla.Text ' Crear los campos y aadirlos a la tabla. ' Esto hay que hacerlo antes de aadir la tabla a la coleccin de tablas .Columns.Append "ID", adInteger ' Dependiendo del tipo de proveedor, los datos de cadena sern de un tipo u otro If cboProvider.Text = "Microsoft.Jet.OLEDB.3.51" Then ' Para Access 97 .Columns.Append "Nombre", adVarChar, 50 de 50 caracteres .Columns.Append "email", adVarChar, 100 .Columns.Append "Telefono", adVarChar .Columns.Append "Observaciones", adLongVarChar larga, (Memo) ' Una cadena ' Una cadena

Else ' Para Access 2000 .Columns.Append "Nombre", adVarWChar, 50 de 50 caracteres .Columns.Append "email", adVarWChar, 100 .Columns.Append "Telefono", adVarWChar .Columns.Append "Observaciones", adLongVarWChar ' Una cadena larga, (Memo) End If .Columns("Nombre").Attributes = adColNullable contener nulos .Columns("email").Attributes = adColNullable .Columns("Telefono").Attributes = adColNullable .Columns("Observaciones").Attributes = adColNullable End With ' ' Aadir la nueva tabla a la base de datos cat.Tables.Append tbl ' Set tbl = Nothing Set cat = Nothing En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor), sNombreBase (el nombre y path de la base de datos) y sNombreTabla para el nombre de la tabla. Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Los tipos de datos de cadena adVarChar y adLongVarChar son los que aceptan las tablas para Access 97, las tablas de Access 2000 se deben usar los del tipo adVarWChar y adLongWChar. Nota 2: Los campos se aaden a la tabla por orden alfabtico, independientemente del orden en el que se han aadido. Nota del 27/Dic/02: Esto slo ocurre si se usa el JET 3.51, con JET 4.0 los crea en el orden indicado al crearlos. Gracias Jose Angel Calvo. Si alguien sabe cmo hacer que no se clasifiquen, (en JET 3.51), por favor que me lo diga, gracias ' Permite ' Una cadena

Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Crear una base de datos con ADO, usando cdigo de VB (29/Sep/2001)


Para poder crear una base de datos, desde Visual Basic, usando ADO (ActiveX Data Objects), tenemos que crear en nuestro proyecto una referencia a: Microsoft ADO Ext. 2.6 for DDL and Security (msadox.dll), y crear un objeto del tipo Catalog. Nota: Esta referencia es para la versin 2.6 de ADO, por tanto puede ser que, si la versin que tienes instalada es otra, en lugar de 2.6 aparezca otra numeracin. ADOX slo est disponible a partir de la versin 2.1 de ADO.

Veamos, de forma simple, cmo crear una base de datos: Dim cat As ADOX.Catalog Set cat = New ADOX.Catalog ' ' Crear la base de datos cat.Create "Provider=" & sProvider & ";" & _ "Data Source=" & sNombreBase & ";" En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor) y sNombreBase (el nombre y path de la base de datos). Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Si la base de datos ya existe, dar un error. Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Abrir una base de datos ADO con contrasea (05/Sep/2001)


Para abrir una base de datos ADO con contrasea, podemos hacerlo al crear la conexin. He probado varias de las formas que se indican en la ayuda, pero la nica que me ha funcionado es la que aqu te muestro... as que, si a ti te funciona de otra forma, pues... eso, que uses la que mejor te parezca... je, je.

Este cdigo es para bases de datos del tipo Access 97, en caso de que quieras usar una de Access 2000, hay que cambiar el provider por: Provider=Microsoft.Jet.OLEDB.4.0; Set Cnn = New ADODB.Connection Cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51; " & _ "Data Source=" & sBase & ";" & _ "Jet OLEDB:Database Password=laclave" En este ejemplo, asumimos que tenemos una variable llamada Cnn del tipo ADODB.Connection y otra, sBase del tipo String, a la que se ha asignado el nombre de la base de datos a la que queremos acceder.

Cmo manejar fechas en consultas


(adems de otras cosillas ms...)

Ejemplos con ADO y DAO


Publicado: 09/Jul/2003 Actualizado: 10/Jul/2003

Lo que vamos a ver aqu es algo bastante simple, ser el uso de una fecha en una consulta SQL. Nota: Recuerda (o lo aclaro) que una consulta SQL no es una consulta hecha a una base de datos del tipo SQL, sino es una cadena "SELECT" que se usa para obtener los datos de una base de datos, sea del tipo que sea. El problema con las fechas es que no siempre funciona como nos gustara, sobre todo si en la consulta se indica ms de una fecha o varias condiciones sobre una misma fecha. Por regla general, (al menos yo), usbamos la funcin DateValue() para convertir la fecha en un valor de slo fecha, (no, no es que me est liando, bueno, un poco s, pero es que normalmente un tipo de datos fecha (Date) suele incluir la fecha y la hora y con DateValue nos quedamos slo con la fecha), por la sencilla razn de que esa funcin la podemos usar tanto "dentro" de la cadena SQL como fuera de ella para convertir el valor de una variable en un dato de tipo fecha, dentr ode un rato veremos un ejemplo. Pero esto no siempre funciona, por tanto lo ms recomendable es que los datos de fechas contenidos en variables, que vayamos a usar en una

consulta, la convirtamos en un dato que no de problemas a confusin al motor de la base de datos. Hasta no hace mucho lo que yo haca (seguramente recomendado por alguien en algn momento) es convertir la fecha en el formato "americano": #mm/dd/yyyy#, es decir, poner primero el mes, despus el da y a continuacin el ao. Pero esto no siempre funcionaba, incluso si cambiaba el carcter / por - para que la fecha quedara #mm-dd-yyyy#. Despus de mucho probar, la solucin que he encontrado es usar el formato de fechas #yyyy/mm/dd#, es decir empezar desde atrs por el ao, el mes y el da y todo esto siempre encerrado entre un par de almohadillas (#). Para que me resulte ms fcil, me he creado una funcin que convierte una fecha en el formato indicado, a esta funcin la he llamadoFechaSQL y es la siguiente: La funcin FechaSQL: Public Function FechaSQL(ByVal vFecha As String) As String ' Funcin para convertir una fecha al formato mm/dd/yy ( 7/Ago/97) ' La fecha la convierte al formato: #yyyy/mm/dd# (30/May/01) ' On Local Error GoTo SQLDateValErr ' If IsDate(vFecha) Then ' si es una fecha vlida, convertirla FechaSQL = "#" & Format$(vFecha, "yyyy/mm/dd") & "#" Else ' si no es una fecha vlida, devolverlo sin modificar FechaSQL = vFecha End If ' Exit Function ' SQLDateValErr: ' Si hay error, la fecha por defecto 1-Ene-1980 Err = 0 FechaSQL = "#1980/01/01#" End Function Esta funcin recibe una parmetro que ser una fecha vlida (o debera serlo), debido a que es posible que el parmetro pasado a la funcin no sea

una fecha vlida, se comprueba mediante la funcin de Visual Basic IsDate(), si es una fecha correcta, la devolvemos en el formato #yyyy/mm/dd#, en caso de que no sea una fecha vlida, simplemente devolvemos la misma cadena que hemos recibido en el parmetro. Si se produjera un error, devolveramos una fecha ficticia. Ahora veamos cmo haca yo antes las consultas. Nota: Si no quieres tragarte esta batallita, puedes pasar al cdigo "propuesto" usando la funcin FechaSQL o bien pasar a ver el ejemplo prctico. Supongamos que tenemos un campo de una tabla que se llama FechaTrmino (con tilde en la e) y quera comprobar todos los datos entre la fecha actual (o la indicada en la variable fechaActual) y un nmero de das despus, (el nmero de das estar indicado en la variable cuantosDias), lo que hasta hace poco haca era esto: Dim s As String Dim rs As Recordset Dim dFin As Date Dim fechaActual As Date Dim cuantosDias As Long ' fechaActual = Format$(txtFecha, "dd/mm/yyyy") cuantosDias = txtDias dFin = (fechaActual + cuantosDias) ' la cadena de la consulta SQL s = "SELECT * FROM Tabla WHERE " & _ "DateValue([FechaTrmino]) >= " & DateValue(fechaActual) & _ " AND DateValue([FechaTrmino]) <= " & DateValue(dFin) ' realizar la consulta ' en DAO sera algo as: ' (se supone que Db es del tipo DataBase y ya est instanciada) Set rs = Db.OpenRecordset(s, dbOpenForwardOnly) ' en ADO sera algo como esto: ' (se supone que cnn es del tipo ADODB.Connection y ya est instanciada) Set rs = New Recordset

rs.Open s, cnn, adOpenForwardOnly, adLockReadOnly Pero esto no funciona. Si quitamos la comparacin que hay detrs de AND si funciona, pero entonces nos devolver todos los registros (filas) que sean igual o posterior a la fecha contenida en fechaActual, por tanto tendramos que hacer posteriormente un bucle comprobando que las fechas sean inferiores a la fecha indicada en dFin. Suponiendo que la cadena de la consulta es: s = "SELECT * FROM Tabla WHERE DateValue([FechaTrmino]) >= " & DateValue(fechaActual) El bucle que habra que hacer sera algo as: With rs Do While Not .EOF ' en ADO no indicar el campo dentro de corchetes! If .Fields("[FechaTrmino]") <= DateValue(dFin) Then '... End If .MoveNext Loop End With Pero esto es trabajo doble... ya que... Usando la funcin FechaSQL, podemos hacer la consulta de esta forma: ' la cadena de la consulta SQL, usando FechaSQL s = "SELECT * FROM Tabla WHERE " & _ "[FechaTrmino] >= " & FechaSQL(fechaActual) & " AND [FechaTrmino] <= " & FechaSQL(dFin)

Y slo devolver las filas que estn entre las dos fechas indicadas. Si ests usando DAO debers tener en cuenta que para acceder al campo FechaTrmino mediante Fields del recordset, tendrs que usar el nombre de ese campo dentro de corchetes. Si ests usando ADO no tendrs que usar los corchetes, si lo haces te dar error. Nota: Es posible que me haya estado complicando la vida, pero... as es

como lo haca y como lo hago ahora. De todas formas, te aclaro que no soy ningn experto en bases de datos... as que... es posible que haya mejores formas de hacer lo que te he comentado y lo que te voy a mostrar, as que... no me regaes si sabes cmo hacerlo mejor, simplemente comprtelo! (seguramente ya sabrs cmo...)

Un ejemplo prctico de todo lo dicho.


Ahora veremos un ejemplo completo de cmo poner todo esto en prctica. En este ejemplo veremos estas cosillas: Crear una base de datos. Introducir automticamente unos campos (ID y FechaTrmino) Saber / acceder a los campos de una tabla. Aadir / eliminar campos de una tabla. Rellenar la tabla con datos ficticios. Realizar una consulta desde una fecha indicada y dentro del nmero de das indicados. Recorrer el contenido del recordset y comprobar si hay datos. Mostrar el resultado de la consulta en un ListView. Calcular el tiempo empleado en la consulta usando la clase cGetTimer. Habilitar/ deshabilitar los controles contenidos en un control Frame.

La intencin es mostrarte el cdigo relacionado con el acceso a datos tanto para DAO como ADO, por tanto, puedes pulsar en estos links para ver el cdigo de cada una de esas versiones de acceso a datos. Ejemplo usando DAO. Ejemplo usando ADO (por terminar)

En esos mismos links tienes acceso al cdigo completo. Aqu te muestro las capturas de los dos formularios usados por los ejemplos.

El formulario para crear la base y los campos con DAO

El formulario para crear la base y los campos con ADO

El formulario para realizar la consulta

Que lo disfrutes! Nos vemos. Guillermo

Ejemplo usando DAO:


Este es el cdigo usado para todo lo mencionado en la relacin anterior, no se incluye el cdigo de la clase cGetTimer, ya que a dicho cdigo puedes acceder usando el link anteriormente indicado. Para usar DAO, en referencias tendrs que aadir una a: Microsoft DAO 3.51 Object Library Para usar el ListView tendrs que aadir el componente: Microsoft Windows Common Controls 6.0 (SP6)

Este es el cdigo completo del ejemplo de DAO (fechasDAO.zip 12.0 Bytes)

El cdigo del formulario para crear la base y los campos, etc. '----------------------------------------------------------------------------' Crear una base de datos DAO (09/Jul/03) ' ' Con el botn de crear la base de datos, se crear una tabla ' con los campos ID, Nombre y FechaTrmino. ' NO BORRAR ESOS CAMPOS para poder probar lo de la consulta. ' ' Guillermo 'guille' Som, 2003 '----------------------------------------------------------------------------Option Explicit Private sCampos() As String ' Array con los campos en la tabla ' Private Enum eTamao

Nombre = 22& Tipo = 10& Tamao = 7& AlloZeroLength = 7& Required = 6& End Enum '----------------------------------------------------------------------------' Procedimientos privados (no de eventos) '----------------------------------------------------------------------------Private Sub crearBase(ByVal sBase As String) ' Crear la base de datos indicada ' Dim Db As Database Dim Fd As Field Dim Tb As TableDef Dim Idx As Index Dim i As Long Dim tVersion As DatabaseTypeEnum ' On Error Resume Next 'If sBase = "" Then Exit Sub i = Len(Dir$(sBase)) If Err Then i = 1 If i Then MsgBox "La base de datos indicada ya existe." & vbCrLf & _ "Tendrs que eliminarla antes...", vbCritical Exit Sub End If ' '------------------------------------------------------------------------' Crear base de datos, idioma general (dbLangGeneral) ' y para la versin indicada del Jet de Access '------------------------------------------------------------------------Select Case True ' Definir una Tabla ' Para crear un ndice

Case optVersion(0) tVersion = dbVersion10 Case optVersion(1) tVersion = dbVersion11 Case optVersion(2) tVersion = dbVersion20 Case optVersion(3) tVersion = dbVersion30 End Select Set Db = CreateDatabase(sBase, dbLangGeneral, tVersion) ' ' Primero la tabla de las tareas Set Tb = Db.CreateTableDef(txtTabla.Text) ' Vamos a crear el Campo ID que ser un ndice Set Fd = Tb.CreateField("ID", dbLong) ' Ahora vamos a asignar las propiedades de contador, etc. Fd.Attributes = dbAutoIncrField Or dbUpdatableField Or dbFixedField Tb.Fields.Append Fd ' El resto de los campos Set Fd = Tb.CreateField("Nombre", dbText, 50) Tb.Fields.Append Fd Set Fd = Tb.CreateField("FechaTrmino", dbDate) Tb.Fields.Append Fd ' ' Creamos un ndice con el ID Set Idx = New Index Idx.Name = "PrimaryKey" Idx.Unique = True Idx.Primary = True Idx.Fields = "ID" ' Aadimos el ndice a la tabla Tb.Indexes.Append Idx ' Aadimos la tabla a la base Db.TableDefs.Append Tb ' ' Cerramos la base Db.Close '

MsgBox "Nueva base de datos " & sBase & " creada.", vbInformation End Sub Private Function ajusta(ByVal Cadena As String, _ ByVal Ancho As Long, _ Optional Alineado As AlignmentConstants = vbLeftJustify _ ) As String ' Ajustar la cadena al ancho especificado Dim s As String ' ' Alinear segn el parmetro Alineado (06/Nov/00) s = Left$(Cadena, Ancho) If Alineado = vbLeftJustify Then s = Left$(s & Space$(Ancho), Ancho) ElseIf Alineado = vbRightJustify Then s = Right$(Space$(Ancho) & s, Ancho) Else Do While Len(s) < Ancho s = " " & s & " " Loop s = Left$(s, Ancho) End If ajusta = s End Function Private Sub mostrarCampos(Td As TableDef) '------------------------------------------------------------------------' Inicializar los campos de la tabla especificada '------------------------------------------------------------------------Dim Fd As Field Dim tIndex As Index Dim s As String Dim n As Long ' 'On Local Error Resume Next '

' recorrer los campos de la tabla n = -1 ' List1.Clear s = ajusta("Nombre:", eTamao.Nombre) & " " & ajusta("Tipo:", eTamao.Tipo) & " " & ajusta("Tamao:", eTamao.Tamao) & " " & ajusta("CeroLen", eTamao.AlloZeroLength) & " " & ajusta("Requer", eTamao.Required) List1.AddItem s s = String$(eTamao.Nombre, "-") & " " & String$(eTamao.Tipo, "-") & " " & String$(eTamao.Tamao, "-") & " " & String$(eTamao.AlloZeroLength, "-") & " " & String$(eTamao.Required, "-") List1.AddItem s For Each Fd In Td.Fields s = "" With Fd n = n + 1 ReDim Preserve sCampos(n) sCampos(n) = .Name ' s = s & ajusta(.Name, eTamao.Nombre) & " " ' Aadir el "nombre" del tipo 's = s & ajusta(.Type, eTamao.Tipo) & " " s = s & ajusta(tipoToString(.Type), eTamao.Tipo) & " " s = s & ajusta(CStr(.Size), eTamao.Tamao, vbRightJustify) & " " No s = s & IIf(.AllowZeroLength, " ") & " " s = s & IIf(.Required, " List1.AddItem s End With Next ' Err = 0 End Sub Private Function tipoToString(ByVal elTipo As DataTypeEnum, _ Optional ByVal ConTipo As Boolean = False) As String S S No ", " ")

", "

' Devuelve una cadena segn el tipo de datos (05/Nov/00) Dim s As String ' Select Case elTipo Case dbBigInt s = "dbBigInt" Case dbBinary s = "dbBinary" Case dbBoolean s = "dbBoolean" Case dbByte s = "dbByte" Case dbChar s = "dbChar" Case dbCurrency s = "dbCurrency" Case dbDate s = "dbDate" Case dbDecimal s = "dbDecimal" Case dbDouble s = "dbDouble" Case dbFloat s = "dbFloat" Case dbGUID s = "dbGUID" Case dbInteger s = "dbInteger" Case dbLong s = "dbLong" Case dbLongBinary s = "dbLongBinary" Case dbMemo s = "dbMemo" Case dbNumeric s = "dbNumeric" Case dbSingle s = "dbSingle" Case dbText

s = "dbText" Case dbTime s = "dbTime" Case dbTimeStamp s = "dbTimeStamp" Case dbVarBinary s = "dbVarBinary" Case Else 'If ConTipo Then ' 'Else s = "dbMemo" 'End If End Select If ConTipo Then s = s & " (" & CStr(elTipo) & ")" End If tipoToString = s End Function Private Sub habilitarCampos(Optional ByVal habilitar As Boolean = True) ' habilitar / deshabilitar los controles contenidos en FrameCampos Dim tControl As Control Dim s As String ' s = FrameCampos.Name For Each tControl In Controls ' deshabilitar/habilitar slo los contenidos en el FrameCampos If tControl.Container.Name = s Then tControl.Enabled = habilitar End If Next End Sub '----------------------------------------------------------------------------Private Sub cmdAdd_Click() ' Aadir el campo indicado a la tabla s = "Tipo desconocido"

Dim tBase As Database Dim tTableDef As TableDef Dim tField As Field Dim i As Long Dim s As String ' On Error GoTo ErrAdd ' Set tBase = OpenDatabase(Me.txtBase) Set tTableDef = tBase.TableDefs(txtTabla.Text) ' With Me.cboTipo i = .ItemData(.ListIndex) End With With tTableDef Set tField = .CreateField(Me.txtNombre, i, Me.txtLongitud) .Fields.Append tField With tField '.Fields(txtNombre) If Me.chkAllowZeroLength Then .AllowZeroLength = True Else .AllowZeroLength = False End If If Me.chkRequired Then .Required = True Else .Required = False End If ' aadirlo a la lista s = ajusta(.Name, eTamao.Nombre) & " " s = s & ajusta(tipoToString(.Type), eTamao.Tipo) & " " s = s & ajusta(CStr(.Size), eTamao.Tamao, vbRightJustify) & " " No s = s & IIf(.AllowZeroLength, " ") & " " s = s & IIf(.Required, " List1.AddItem s End With End With S S No ", " ")

", "

' tBase.Close ' Exit Sub ' ErrAdd: MsgBox "Error al aadir el campo: " & txtNombre & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation Or vbOKOnly, "Error al borrar campos" tBase.Close End Sub Private Sub cmdConsulta_Click() With fComprobarFechasDAO .NombreBase = txtBase .NombreTabla = txtTabla .Show vbModal, Me End With End Sub Private Sub cmdCrearBase_Click() crearBase txtBase.Text End Sub Private Sub cmdDel_Click() ' Eliminar el campo de la tabla Dim tBase As Database Dim tTableDef As TableDef Dim tIndex As Index Dim b As Boolean Dim i As Long ' On Error GoTo 0 'ErrDel ' Set tBase = OpenDatabase(Me.txtBase) Set tTableDef = tBase.TableDefs(txtTabla.Text) ' Si es un ndice, borrarlo de la tabla de ndices (08/May/01) On Error Resume Next

b = tTableDef.Indexes(Me.txtNombre).Unique If Err = 0 Then If b = False Then tTableDef.Indexes.Delete Me.txtNombre Else If MsgBox("ATENCION! El campo " & txtNombre & " es un ndice nico." & vbCrLf & "Quieres borrarlo?", vbYesNo Or vbExclamation) = vbYes Then On Error GoTo ErrDel tTableDef.Indexes.Delete Me.txtNombre End If End If End If Err = 0 On Error GoTo ErrDel tTableDef.Fields.Delete Me.txtNombre ' ' si llegamos aqu, es que se ha borrado ' eliminar el campo de la lista For i = 0 To List1.ListCount - 1 If InStr(List1.List(i), txtNombre) > 0 Then List1.RemoveItem i Exit For End If Next ' tBase.Close ' Exit Sub ' ErrDel: MsgBox "Error al borrar el campo: " & txtNombre & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation Or vbOKOnly, "Error al borrar campos" tBase.Close End Sub Private Sub cmdMostrarCampos_Click() ' abrir la tabla sealada por el combo

Dim Db As Database Dim Td As TableDef ' ReDim sCampos(0) ' Set Db = OpenDatabase(txtBase) For Each Td In Db.TableDefs If Td.Name = txtTabla Then ' si es la tabla buscada... mostrarCampos Td habilitarCampos True Exit For End If Next Db.Close Set Db = Nothing End Sub Private Sub cmdRellenarBase_Click() ' rellenar la base de datos con datos ficticios Dim i As Long, j As Long Dim k As Long, n As Long Dim s As String Dim cuantosDias As Long Dim tDb As Database Dim tRs As Recordset ' On Error GoTo ErrRellenar ' ' asegurarnos de que hemos leido los campos cmdMostrarCampos_Click ' n = UBound(sCampos) If n = 0 Then MsgBox "La tabla debera tener al menos dos campos", vbInformation Exit Sub End If ' Set tDb = OpenDatabase(txtBase)

s = "SELECT * FROM " & txtTabla Set tRs = tDb.OpenRecordset(s, dbOpenDynaset) ' Me.MousePointer = vbHourglass DoEvents Randomize j = txtRegsitros For i = 1 To j ' crear registros ficticios cuantosDias = Int(Rnd * 20) + 20 With tRs .AddNew For k = 0 To n ' slo aadir datos en campos de fecha, texto y moneda Select Case .Fields(sCampos(k)).Type Case DataTypeEnum.dbDate If Rnd > 0.5 Then .Fields(sCampos(k)) = Now + Int(Rnd * cuantosDias) Else .Fields(sCampos(k)) = Now Int(Rnd * cuantosDias) End If Case DataTypeEnum.dbText .Fields(sCampos(k)) = ajusta(sCampos(k) & " " & i, .Fields(sCampos(k)).Size, vbLeftJustify) Case DataTypeEnum.dbCurrency .Fields(sCampos(k)) = CCur(Rnd * 15000) End Select Next .Update End With Next ' tRs.Close tDb.Close ' Me.MousePointer = vbDefault DoEvents

MsgBox "Se han aadido " & j & " regsitros a la tabla " & txtTabla, vbInformation Exit Sub ' ErrRellenar: MsgBox "Se ha producido un error:" & vbCrLf & _ Err.Number & " " & Err.Description, vbCritical, "Error al aadir regsitros" Err = 0 End Sub Private Sub Form_Load() Move (Screen.Width - Width) \ 4, 0 ' ' Asignar al combo los tipos de datos a elegir With cboTipo .Clear .AddItem "dbText" .ItemData(.NewIndex) = DataTypeEnum.dbText .AddItem "dbCurrency" .ItemData(.NewIndex) = DataTypeEnum.dbCurrency .AddItem "dbDate" .ItemData(.NewIndex) = DataTypeEnum.dbDate .AddItem "dbLong" .ItemData(.NewIndex) = DataTypeEnum.dbLong .AddItem "dbDouble" .ItemData(.NewIndex) = DataTypeEnum.dbDouble .AddItem "dbInteger" .ItemData(.NewIndex) = DataTypeEnum.dbInteger .AddItem "dbBoolean" .ItemData(.NewIndex) = DataTypeEnum.dbBoolean .AddItem "dbMemo" .ItemData(.NewIndex) = DataTypeEnum.dbMemo .AddItem "dbByte" .ItemData(.NewIndex) = DataTypeEnum.dbByte .AddItem "dbChar" .ItemData(.NewIndex) = DataTypeEnum.dbChar .AddItem "dbLongBinary" .ItemData(.NewIndex) = DataTypeEnum.dbLongBinary .AddItem "dbSingle"

.ItemData(.NewIndex) = DataTypeEnum.dbSingle .AddItem "dbFloat" .ItemData(.NewIndex) = DataTypeEnum.dbFloat .AddItem "dbBigInt" .ItemData(.NewIndex) = DataTypeEnum.dbBigInt .AddItem "dbBinary" .ItemData(.NewIndex) = DataTypeEnum.dbBinary .AddItem "dbDecimal" .ItemData(.NewIndex) = DataTypeEnum.dbDecimal .ListIndex = 0 End With txtNombre = "Nombre" txtLongitud = "50" chkAllowZeroLength.Value = vbChecked chkRequired.Value = vbUnchecked ' deshabilitar el contenido del Frame1(1) habilitarCampos False End Sub Private Sub List1_Click() ' Mostrar la informacin del campo seleccionado Dim i As Long Dim s As String ' With List1 i = .ListIndex If i > 1 Then s = .List(i) Me.txtNombre = Trim$(Left$(s, eTamao.Nombre)) s = LTrim$(Mid$(s, eTamao.Nombre + 1)) Me.cboTipo.Text = Trim$(Left$(s, eTamao.Tipo)) s = (Mid$(s, eTamao.Tipo + 2)) Me.txtLongitud = Trim$(Left$(s, eTamao.Tamao)) s = LTrim$(Mid$(s, eTamao.Tamao + 1)) If Trim$(Left$(s, eTamao.AlloZeroLength)) = "S" Then Me.chkAllowZeroLength.Value = vbChecked Else

Me.chkAllowZeroLength.Value = vbUnchecked End If s = LTrim$(Mid$(s, eTamao.AlloZeroLength + 1)) If Trim$(s) = "S" Then Me.chkRequired.Value = vbChecked Else Me.chkRequired.Value = vbUnchecked End If End If End With End Sub

El cdigo del formulario para hacer la consulta y mostrar los datos '----------------------------------------------------------------------------' Prueba de consulta con fechas en base de datos DAO (09/Jul/03) ' ' Los campos que debe tener la tabla de la base indicada sern: ' ' ' Guillermo 'guille' Som, 2003 '----------------------------------------------------------------------------Option Explicit Public NombreBase As String datos Public NombreTabla As String Private mCuantosDias As Long Private Db As Database Private Sub cmdProcesar_Click() ' procesar los datos a mostrar Dim fechaActual As Date Dim s As String Dim dFin As Date ' Nombre de la base de ' El nombre de la tabla ID, Nombre y FechaTrmino

Dim tRs As Recordset Dim tGT As cGetTimer Dim n As Long ' On Error Resume Next Set Db = OpenDatabase(NombreBase) If Err Then MsgBox "Error al abrir la base de datos: " & NombreBase & vbCrLf & _ Err.Number & " " & Err.Description Exit Sub End If ' fechaActual = Format$(txtFecha, "dd/mm/yyyy") mCuantosDias = txtDias dFin = (fechaActual + mCuantosDias) ' ListView1.ListItems.Clear ' Set tGT = New cGetTimer tGT.StartTimer ' n = 0 Err.Number = 0 s = "SELECT ID, Nombre, [FechaTrmino] FROM " & NombreTabla & " WHERE [FechaTrmino] >= " & FechaSQL(fechaActual) & " AND [FechaTrmino] <= " & FechaSQL(dFin) & " ORDER BY [FechaTrmino]" Set tRs = Db.OpenRecordset(s, dbOpenForwardOnly) If Err Then MsgBox "Error al abrir el Recordset" & vbCrLf & _ Err.Number & " " & Err.Description Exit Sub End If With tRs If (.EOF = True) And (.BOF = True) Then ' Si no hay datos... With ListView1.ListItems.Add(, , "0") .SubItems(1) = "No hay datos entre las fechas " & Format$(fechaActual, "dd/mm/yyyy")

.SubItems(2) = Format$(dFin, "dd/mm/yyyy") End With Else n = 0 Do While Not .EOF n = n + 1 With ListView1.ListItems.Add(, , tRs.Fields("ID")) .SubItems(1) = Trim$(tRs.Fields("Nombre")) .SubItems(2) = Format$(tRs.Fields("[FechaTrmino]") & "", "dd/mm/yyyy") End With .MoveNext Loop End If End With tRs.Close Db.Close ' tGT.StopTimer lblInfo.Caption = "Tiempo: " & tGT.ElapsedTime & " (" & n & ")" End Sub Private Sub Form_Load() ' Asignar el nombre de la base de datos 'NombreBase App.Path & "PruebaDAO.mdb" ' If Year(Now) > 2003 Then lblInfo.Caption = "Guillermo 'guille' Som, 2003-" & Year(Now) Else lblInfo.Caption = "Guillermo 'guille' Som, 2003" End If ' mCuantosDias = 10& txtDias.Text = mCuantosDias ' ' crear las columnas del ListView

' (aunque ya estn creadas en tiempo de diseo) With ListView1 .ColumnHeaders.Clear .ColumnHeaders.Add , , "ID", 800 .ColumnHeaders.Add , , "Nombre", 3200 .ColumnHeaders.Add , , "Fecha Trmino", 1400, lvwColumnRight .GridLines = True .FullRowSelect = True .LabelEdit = lvwManual End With End Sub

Ejemplo usando ADO:


Este es el cdigo usado para todo lo mencionado en la relacin anterior, no se incluye el cdigo de la clase cGetTimer, ya que a dicho cdigo puedes acceder usando el link anteriormente indicado. Para usar ADO, en referencias tendrs que aadir una a: Microsoft ActiveX Data Objects 2.5 Library Adems de una a ADOX: Microsoft ADO Ext. 2.7 for DDL and Security (la versin pude ser cualquier otra anterior a la 2.7) Para usar el ListView tendrs que aadir el componente: Microsoft Windows Common Controls 6.0 (SP6) Nota: He de aclarar que para mi gusto, este cdigo no est terminado, ya que, por ejemplo, los tipos de datos no estn "comprobados", simplemente los he sustituido "a mocho". Adems, (y esto es ms grave), que con el motor 3.51 (el compatible con Access 97) no he logrado crear un campoAuntonumrico, sin embargo usando el 4.0 si que se crea sin problemas... Lo mismo es que estoy demasiado "ofuscado", en fin... a ver si con ms calma o con la ayuda de alguna alma caritativa lo dejo solucionado...

Nota del 10/Jul/03: Pues la aparicin del alma caritativa no se ha hecho esperar, gracias a Joaqun Delgado Pastor, tenemos la solucin. Y esta consiste en lo siguiente:

-Usar siempre el proveedor Microsoft.Jet.OLEDB.4.0 -Aadir esta cadena a la cadena de conexin: -Para Access 97: Jet OLEDB:Engine Type=4; -Para Access 2000: Jet OLEDB:Engine Type=5; De esta forma se crear correctamente el campo autonumrico y segn se seleccione la opcin 3.51 o 4.0 se crear una base de datos compatible con Access 97 o Access 2000/XP respectivamente. En el cdigo mostrado estn hechas las correcciones correspondientes para usar este nueva forma. Si quieres, ahora en los dos Options en lugar de indicar el "motor" Jet, se puede indicar si ser con formato Access 97 o con formato Access 2000/XP. En el cdigo incluido en el Zip ya est modificado.

Este es el cdigo completo del ejemplo de ADO (fechasADO.zip 12.8 KB) El cdigo del formulario para crear la base y los campos, etc. '----------------------------------------------------------------------------' Crear una base de datos ADO (09/Jul/03) ' ' Con el botn de crear la base de datos, se crear una tabla ' con los campos ID, Nombre y FechaTrmino. ' NO BORRAR ESOS CAMPOS para poder probar lo de la consulta. ' ' Guillermo 'guille' Som, 2003 '----------------------------------------------------------------------------Option Explicit Private sProvider As String Private sCampos() As String ' Array con los campos en la tabla ' Private Enum eTamao Nombre = 22& Tipo = 10& Tamao = 7&

AlloZeroLength = 7& Required = 6& End Enum '----------------------------------------------------------------------------' Procedimientos privados (no de eventos) '----------------------------------------------------------------------------Private Sub crearBase(ByVal sBase As String) ' Crear la base de datos indicada ' Dim i As Long ' Dim tbl As ADOX.Table Dim cat As ADOX.Catalog Dim idx As ADOX.Index Dim col As ADOX.Column ' Dim sProviderDes As String ' On Error Resume Next ' 'If sBase = "" Then Exit Sub i = Len(Dir$(sBase)) If Err Then i = 1 If i Then MsgBox "La base de datos indicada ya existe." & vbCrLf & _ "Tendrs que eliminarla antes...", vbCritical Exit Sub End If ' On Error GoTo 0 ' ' Gracias a Joaquin Delgado Pastor (10/Jul/03), con esto funciona: ' Select Case True

Case Me.optVersion(0) 'sProvider = "Microsoft.Jet.OLEDB.3.51" ' sProviderDes = "Jet OLEDB:Engine Type=4;" Case Me.optVersion(1) 'sProvider = "Microsoft.Jet.OLEDB.4.0" sProviderDes = "Jet OLEDB:Engine Type=5;" End Select sProvider = "Microsoft.Jet.OLEDB.4.0" ' ' Crear la base de datos Set cat = New ADOX.Catalog cat.Create "Provider=" & sProvider & ";" & _ "Data Source=" & txtBase & ";" & sProviderDes ' Set cat = New ADOX.Catalog Set tbl = New ADOX.Table ' ' Abrir el catlogo cat.ActiveConnection = _ "Provider=" & sProvider & ";" & _ "Data Source=" & txtBase & ";" ' ' Crear la nueva tabla With tbl .Name = txtTabla.Text ' Crear los campos y aadirlos a la tabla. ' Esto hay que hacerlo antes de aadir la tabla a la coleccin de tablas Set col = New ADOX.Column With col .Name = "ID" .Type = adInteger ' Autoincrement no existe como propiedad en 3.51 If sProvider <> "Microsoft.Jet.OLEDB.3.51" Then Set .ParentCatalog = cat

.Properties("AutoIncrement") = True End If End With .Columns.Append col ' ' Set idx = New ADOX.Index idx.Name = "IDx" idx.PrimaryKey = True idx.Unique = True idx.IndexNulls = adIndexNullsDisallow idx.Columns.Append "ID" .Indexes.Append idx ' ' ' Dependiendo del tipo de proveedor, los datos de cadena sern de un tipo u otro If sProvider = "Microsoft.Jet.OLEDB.3.51" Then ' Para Access 97 .Columns.Append "Nombre", adVarChar, 50 ' Una cadena de 50 caracteres .Columns.Append "FechaTrmino", adDate Else ' Para Access 2000 .Columns.Append "Nombre", adVarWChar, 50 ' Una cadena de 50 caracteres .Columns.Append "FechaTrmino", adDate End If .Columns("Nombre").Attributes = adColNullable ' Permite contener nulos .Columns("FechaTrmino").Attributes = adColNullable End With ' ' Aadir la nueva tabla a la base de datos cat.Tables.Append tbl ' Set tbl = Nothing Set cat = Nothing ' '

MsgBox "Nueva base de datos " & sBase & " creada.", vbInformation End Sub Private Function ajusta(ByVal Cadena As String, _ ByVal Ancho As Long, _ Optional Alineado As AlignmentConstants = vbLeftJustify _ ) As String ' Ajustar la cadena al ancho especificado Dim s As String ' ' Alinear segn el parmetro Alineado (06/Nov/00) s = Left$(Cadena, Ancho) If Alineado = vbLeftJustify Then s = Left$(s & Space$(Ancho), Ancho) ElseIf Alineado = vbRightJustify Then s = Right$(Space$(Ancho) & s, Ancho) Else Do While Len(s) < Ancho s = " " & s & " " Loop s = Left$(s, Ancho) End If ajusta = s End Function Private Sub mostrarCampos(Td As Table) '------------------------------------------------------------------------' Inicializar los campos de la tabla especificada '------------------------------------------------------------------------Dim Fd As Column Dim s As String Dim n As Long ' 'On Local Error Resume Next ' ' recorrer los campos de la tabla

n = -1 ' List1.Clear s = ajusta("Nombre:", eTamao.Nombre) & " " & ajusta("Tipo:", eTamao.Tipo) & " " & ajusta("Tamao:", eTamao.Tamao) & " " & ajusta("CeroLen", eTamao.AlloZeroLength) & " " & ajusta("Requer", eTamao.Required) List1.AddItem s s = String$(eTamao.Nombre, "-") & " " & String$(eTamao.Tipo, "-") & " " & String$(eTamao.Tamao, "-") & " " & String$(eTamao.AlloZeroLength, "-") & " " & String$(eTamao.Required, "-") List1.AddItem s For Each Fd In Td.Columns s = "" With Fd n = n + 1 ReDim Preserve sCampos(n) sCampos(n) = .Name ' s = s & ajusta(.Name, eTamao.Nombre) & " " ' Aadir el "nombre" del tipo 's = s & ajusta(.Type, eTamao.Tipo) & " " s = s & ajusta(tipoToString(.Type), eTamao.Tipo) & " " s = s & ajusta(CStr(.DefinedSize), eTamao.Tamao, vbRightJustify) & " " s = s & IIf((.Attributes And adColNullable) = adColNullable, " S ", " No ") & " " s = s & IIf((.Attributes And adIndexNullsAllow) = adIndexNullsAllow, " ") List1.AddItem s End With Next ' Err = 0 End Sub Private Function tipoToString(ByVal elTipo As DataTypeEnum, _ Optional ByVal ConTipo As Boolean = False) As String S ", " No

' Devuelve una cadena segn el tipo de datos (05/Nov/00) Dim s As String ' Select Case elTipo Case DataTypeEnum.adBigInt s = "adBigInt" Case DataTypeEnum.adBinary s = "adBinary" Case DataTypeEnum.adBoolean s = "adBoolean" Case DataTypeEnum.adChar s = "adChar" Case DataTypeEnum.adVarChar s = "adVarChar" Case DataTypeEnum.adCurrency s = "adCurrency" Case DataTypeEnum.adDate s = "adDate" Case DataTypeEnum.adDecimal s = "adDecimal" Case DataTypeEnum.adDouble s = "adDouble" Case DataTypeEnum.adSingle s = "adSingle" Case DataTypeEnum.adGUID s = "adGUID" Case DataTypeEnum.adInteger s = "adInteger" Case DataTypeEnum.adNumeric s = "adNumeric" Case DataTypeEnum.adLongVarBinary s = "adLongVarBinary" Case DataTypeEnum.adNumeric s = "adNumeric" Case DataTypeEnum.adSingle s = "adSingle" Case DataTypeEnum.adDBTime s = "adDBTime" Case DataTypeEnum.adDBDate

s = "adDBDate" Case DataTypeEnum.adVarBinary s = "adVarBinary" Case Else s = "adVarChar" End Select If ConTipo Then s = s & " (" & CStr(elTipo) & ")" End If tipoToString = s End Function Private Sub habilitarCampos(Optional ByVal habilitar As Boolean = True) ' habilitar / deshabilitar los controles contenidos en FrameCampos Dim tControl As Control Dim s As String ' s = FrameCampos.Name For Each tControl In Controls ' deshabilitar/habilitar slo los contenidos en el FrameCampos If tControl.Container.Name = s Then tControl.Enabled = habilitar End If Next End Sub '----------------------------------------------------------------------------Private Sub cmdAdd_Click() ' Aadir el campo indicado a la tabla Dim i As Long Dim s As String Dim cat As ADOX.Catalog Dim tTable As ADOX.Table 'Dim col As ADOX.Column ' On Error GoTo ErrAdd '

Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=" & sProvider & "; Data Source=" & txtBase.Text Set tTable = cat.Tables(txtTabla.Text) ' With Me.cboTipo i = .ItemData(.ListIndex) End With With tTable .Columns.Append txtNombre, i, txtLongitud With .Columns(txtNombre) If Me.chkAllowZeroLength Then .Attributes = adColNullable End If ' aadirlo a la lista s = ajusta(.Name, eTamao.Nombre) & " " s = s & ajusta(tipoToString(.Type), eTamao.Tipo) & " " s = s & ajusta(CStr(.DefinedSize), eTamao.Tamao, vbRightJustify) & " " s = s & IIf((.Attributes And adColNullable) = adColNullable, " S ", " No ") & " " s = s & " " 'IIf(.Required, " ") List1.AddItem s End With End With ' Set tTable = Nothing Set cat = Nothing ' Exit Sub ' ErrAdd: MsgBox "Error al aadir el campo: " & txtNombre & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation Or vbOKOnly, "Error al borrar campos" End Sub Private Sub cmdConsulta_Click() S ", " No

Load fComprobarFechasADO With fComprobarFechasADO .NombreBase = txtBase .NombreTabla = txtTabla .Provider = sProvider .Show vbModal, Me End With End Sub Private Sub cmdCrearBase_Click() crearBase txtBase.Text End Sub Private Sub cmdDel_Click() ' Eliminar el campo de la tabla Dim b As Boolean Dim i As Long Dim cat As ADOX.Catalog Dim tTable As ADOX.Table Dim col As ADOX.Column ' ' Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=" & sProvider & "; Data Source=" & txtBase.Text Set tTable = cat.Tables(txtTabla.Text) ' ' ' Si es un ndice, borrarlo de la tabla de ndices (08/May/01) On Error Resume Next b = tTable.Indexes(txtNombre).Unique If Err = 0 Then If b = False Then tTable.Indexes.Delete txtNombre Else If MsgBox("ATENCION! El campo " & txtNombre & " es un ndice nico." & vbCrLf & "Quieres borrarlo?", vbYesNo Or vbExclamation) = vbYes Then On Error GoTo ErrDel tTable.Indexes.Delete txtNombre

End If End If End If Err = 0 On Error GoTo ErrDel tTable.Columns.Delete txtNombre ' ' si llegamos aqu, es que se ha borrado ' eliminar el campo de la lista For i = 0 To List1.ListCount - 1 If InStr(List1.List(i), txtNombre) > 0 Then List1.RemoveItem i Exit For End If Next ' Set tTable = Nothing Set cat = Nothing ' Exit Sub ' ErrDel: MsgBox "Error al borrar el campo: " & txtNombre & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation Or vbOKOnly, "Error al borrar campos" End Sub Private Sub cmdMostrarCampos_Click() ' abrir la tabla sealada por el combo Dim cat As ADOX.Catalog Dim tTable As ADOX.Table ' Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=" & sProvider & "; Data Source=" & txtBase.Text Set tTable = cat.Tables(txtTabla.Text) ' ReDim sCampos(0) '

mostrarCampos tTable habilitarCampos True ' Set tTable = Nothing Set cat = Nothing End Sub Private Sub cmdRellenarBase_Click() ' rellenar la base de datos con datos ficticios Dim i As Long, j As Long Dim k As Long, n As Long Dim s As String Dim cuantosDias As Long Dim cnn As ADODB.Connection Dim tRs As ADODB.Recordset ' 'On Error GoTo ErrRellenar On Error GoTo 0 ' ' asegurarnos de que hemos leido los campos cmdMostrarCampos_Click ' n = UBound(sCampos) If n = 0 Then MsgBox "La tabla debera tener al menos dos campos", vbInformation Exit Sub End If ' Set cnn = New ADODB.Connection cnn.Open "Provider=" & sProvider & "; Data Source=" & txtBase s = "SELECT * FROM " & txtTabla Set tRs = New Recordset tRs.Open s, cnn, adOpenDynamic, adLockOptimistic ' Me.MousePointer = vbHourglass DoEvents Randomize j = txtRegsitros

For i = 1 To j ' crear registros ficticios cuantosDias = Int(Rnd * 20) + 20 With tRs .AddNew For k = 0 To n ' slo aadir datos en campos de fecha, texto y moneda Select Case .Fields(sCampos(k)).Type Case DataTypeEnum.adDate If Rnd > 0.5 Then .Fields(sCampos(k)) = Now + Int(Rnd * cuantosDias) Else .Fields(sCampos(k)) = Now Int(Rnd * cuantosDias) End If Case DataTypeEnum.adVarChar, DataTypeEnum.adVarWChar .Fields(sCampos(k)) = ajusta(sCampos(k) & " " & i, .Fields(sCampos(k)).DefinedSize, vbLeftJustify) Case DataTypeEnum.adCurrency .Fields(sCampos(k)) = CCur(Rnd * 15000) End Select Next .Update End With Next ' Set tRs = Nothing cnn.Close ' Me.MousePointer = vbDefault DoEvents MsgBox "Se han aadido " & j & " regsitros a la tabla " & txtTabla, vbInformation Exit Sub ' ErrRellenar: MsgBox "Se ha producido un error:" & vbCrLf & _

Err.Number & " " & Err.Description, vbCritical, "Error al aadir regsitros" Err = 0 End Sub Private Sub Form_Load() Move (Screen.Width - Width) \ 4, 0 ' 'txtBase = App.Path & "\PruebaDAO.mdb" txtBase = "PruebaADO.mdb" 'sProvider = "Microsoft.Jet.OLEDB.3.51" ' con el proveedor 4.0 el autoincremento no da error sProvider = "Microsoft.Jet.OLEDB.4.0" ' ' Asignar al combo los tipos de datos a elegir With cboTipo .Clear ' Tipos de datos de DAO y ADO (equivalencias) 'dbBinary 'dbBoolean 'dbByte 'dbCurrency 'dbDate 'dbDecimal 'dbDouble 'dbGUID 'dbInteger 'dbLong 'dbLongBinary 'dbMemo 'dbSingle 'dbText adBinary adBoolean adUnsignedTinyInt adCurrency adDate adNumeric adDouble adGUID adSmallInt adInteger adLongVarBinary adLongVarWChar adSingle adVarWChar

.AddItem tipoToString(DataTypeEnum.adVarChar) .ItemData(.NewIndex) = DataTypeEnum.adVarChar .AddItem "adCurrency" .ItemData(.NewIndex) = DataTypeEnum.adCurrency .AddItem "adDate" .ItemData(.NewIndex) = DataTypeEnum.adDate .AddItem "adNumeric" .ItemData(.NewIndex) = DataTypeEnum.adNumeric

.AddItem "adDouble" .ItemData(.NewIndex) = DataTypeEnum.adDouble .AddItem "adInteger" .ItemData(.NewIndex) = DataTypeEnum.adInteger .AddItem "adBoolean" .ItemData(.NewIndex) = DataTypeEnum.adBoolean .AddItem "adVarBinary" .ItemData(.NewIndex) = DataTypeEnum.adVarBinary .AddItem "adChar" .ItemData(.NewIndex) = DataTypeEnum.adChar .AddItem "adSingle" .ItemData(.NewIndex) = DataTypeEnum.adSingle .AddItem "adBigInt" .ItemData(.NewIndex) = DataTypeEnum.adBigInt .AddItem "adBinary" .ItemData(.NewIndex) = DataTypeEnum.adBinary .AddItem "adDecimal" .ItemData(.NewIndex) = DataTypeEnum.adDecimal .ListIndex = 0 End With txtNombre = "Nombre" txtLongitud = "50" chkAllowZeroLength.Value = vbChecked chkRequired.Value = vbUnchecked ' deshabilitar el contenido del Frame1(1) habilitarCampos False End Sub Private Sub List1_Click() ' Mostrar la informacin del campo seleccionado Dim i As Long Dim s As String ' With List1 i = .ListIndex If i > 1 Then s = .List(i) Me.txtNombre = Trim$(Left$(s, eTamao.Nombre)) s = LTrim$(Mid$(s, eTamao.Nombre + 1))

Me.cboTipo.Text = Trim$(Left$(s, eTamao.Tipo)) s = (Mid$(s, eTamao.Tipo + 2)) Me.txtLongitud = Trim$(Left$(s, eTamao.Tamao)) s = LTrim$(Mid$(s, eTamao.Tamao + 1)) If Trim$(Left$(s, eTamao.AlloZeroLength)) = "S" Then Me.chkAllowZeroLength.Value = vbChecked Else Me.chkAllowZeroLength.Value = vbUnchecked End If s = LTrim$(Mid$(s, eTamao.AlloZeroLength + 1)) If Trim$(s) = "S" Then Me.chkRequired.Value = vbChecked Else Me.chkRequired.Value = vbUnchecked End If End If End With End Sub Private Sub optVersion_Click(Index As Integer) If Index = 0 Then sProvider = "Microsoft.Jet.OLEDB.3.51" Else sProvider = "Microsoft.Jet.OLEDB.4.0" End If End Sub

El cdigo del formulario para hacer la consulta y mostrar los datos '----------------------------------------------------------------------------' Prueba de consulta con fechas en base de datos ADO (09/Jul/03) ' ' Los campos que debe tener la tabla de la base indicada sern:

' '

ID, Nombre y FechaTrmino

' Guillermo 'guille' Som, 2003 '----------------------------------------------------------------------------Option Explicit Public NombreBase As String datos Public NombreTabla As String Public Provider As String Private mCuantosDias As Long ' Objetos para acceder directamente a la base usando cdigo Private cnn As ADODB.Connection Private Sub cmdProcesar_Click() ' procesar los datos a mostrar Dim fechaActual As Date Dim s As String Dim dFin As Date Dim tRs As Recordset Dim tGT As cGetTimer Dim n As Long ' Set cnn = New ADODB.Connection ' cnn.Open "Provider=" & Provider & "; Data Source=" & NombreBase ' fechaActual = Format$(txtFecha, "dd/mm/yyyy") mCuantosDias = txtDias dFin = (fechaActual + mCuantosDias) ' ListView1.ListItems.Clear ' Set tGT = New cGetTimer tGT.StartTimer ' ' en ADO no hace falta indicar el campo FechaTrmino entre corchetes ' Nombre de la base de ' El nombre de la tabla

s = "SELECT ID, Nombre, [FechaTrmino] FROM " & NombreTabla & " WHERE [FechaTrmino] >= " & FechaSQL(fechaActual) & " AND [FechaTrmino] <= " & FechaSQL(dFin) & " ORDER BY [FechaTrmino]" Set tRs = New Recordset tRs.Open s, cnn, adOpenForwardOnly, adLockReadOnly 'adLockOptimistic With tRs If (.EOF = True) And (.BOF = True) Then ' Si no hay datos... With ListView1.ListItems.Add(, , "0") .SubItems(1) = "No hay datos entre las fechas " & Format$(fechaActual, "dd/mm/yyyy") .SubItems(2) = Format$(dFin, "dd/mm/yyyy") End With Else n = 0 Do While Not .EOF n = n + 1 With ListView1.ListItems.Add(, , tRs.Fields("ID")) .SubItems(1) = Trim$(tRs.Fields("Nombre") & "") .SubItems(2) = Format$(tRs.Fields("FechaTrmino") & "", "dd/mm/yyyy") End With .MoveNext Loop End If End With tRs.Close cnn.Close ' tGT.StopTimer lblInfo.Caption = "Tiempo: " & tGT.ElapsedTime & " (" & n & ")" End Sub Private Sub Form_Load() ' Asignar el nombre de la base de datos y el proveedor '

' para bases de datos Access 97 (con Access 2000/XP no funciona) NombreBase = App.Path & "\PruebaDAO.mdb" Provider = "Microsoft.Jet.OLEDB.3.51" ' ' para bases de datos Access 2000 (tambin para Access 97, pero va ms lento) 'NombreBase = App.Path & "PruebaDAO.mdb" 'sProvider = "Microsoft.Jet.OLEDB.4.0" ' If Year(Now) > 2003 Then lblInfo.Caption = "Guillermo 'guille' Som, 2003-" & Year(Now) Else lblInfo.Caption = "Guillermo 'guille' Som, 2003" End If ' mCuantosDias = 10& txtDias.Text = mCuantosDias ' ' crear las columnas del ListView ' (aunque ya estn creadas en tiempo de diseo) With ListView1 .ColumnHeaders.Clear .ColumnHeaders.Add , , "ID", 800 .ColumnHeaders.Add , , "Nombre", 3200 .ColumnHeaders.Add , , "Fecha Trmino", 1400, lvwColumnRight .GridLines = True .FullRowSelect = True .LabelEdit = lvwManual End With End Sub

Cmo acceder a bases de datos ADO, sin el datacontrol.


Empecemos desde el principio... para que te vayas acostumbrando... aunque ya deberas saber crear tus propios formularios y aadir los controles que te indique... aunque prcticamente no te lo haya explicado en el curso, es algo que te ensean

en prcticamente cualquier libro e incluso en los "tutoriales" que incluye el Visual Basic. (Toc, toc, toc, Guille... esto no es lo mismo que lo que dijiste en la entrega anterior? S, pero como para esta tambin es vlido y ya lo tengo escrito, para que inventarme otra cosa? Pues s... la cosa es buscar alguna excusa para no trabajar! Buenooo, quitar algo para que no sea exactamente "copiado", que es lo que suelen hacer la mayora de la gente cuando escriben libros y otras cosas sobre las nuevas versiones...)

El formulario de prueba: Crea un nuevo proyecto, se crear un proyecto con un formulario. Aade los siguientes controles para que el formulario quede con el aspecto que te muestro a continuacin, (que es el mismo del ltimo ejemplo de la entrega anterior):

Aspecto del formulario en tiempo de diseo Los controles usados son: En la parte superior: cmdMover, un array de 0 a 3 Label1, un array de 0 a 2, Text1, un array de 0 a 2 cmdAdd, cmdActualizar, cmdBorrar El segundo grupo: Label2, Text2, cmdBuscar Un Listview1 para mostrar los resultados de la bsqueda Una etiqueta (LblData) para mostrar algunos mensajes y el botn de salir es: cmdSalir Las referencias necesarias: En el men Proyecto/Referencias... selecciona Microsoft ActiveX Data Objects

2.6 Library -aunque tambin puedes seleccionar cualquiera de las otras que te muestra, (si es que te muestra alguna ms); a mi me aparecen las versiones 2.0, 2.1, 2.5 y 2.6, la nica que no deberas seleccionar es la 2.0 que ya est obsoletaUna vez aadida la referencia a los objetos ADO, puedes usar los objetos expuestos por esta librera. En este ejemplo usaremos dos de esos objetos, que sern los que en la mayora de los casos usemos: El objeto Connection y el objeto Recordset. El primero es el que permite acceder a la base de datos y el segundo ser el que acceda a los datos propiamente dicho, cuando veas el cdigo seguramente lo entenders y si no lo entiendes... es que deberas leerte TODAS las entregas, empezando por la primera! (tendr que excusarse el Guille de alguna forma si no entiendes lo que explica) Los objetos ADO ms comunes: Normalmente, el objeto Connection suele declararse de forma que sea visible en todo el formulario, salvo en el caso de que aadieses algn mdulo BAS y necesitaras usarlo desde ese mdulo BAS, en cuyo caso, deberas declararlo Pblico o Global, pero como por ahora no es necesario... dejemos las cosas estar... El objeto Recordset de ADO produce eventos, por tanto, si necesitamos acceder a esos eventos, declararemos la variable conWithEvents, de esa forma podemos interceptar los eventos que produzca de la misma manera que lo hacemos con el resto de controles (de esto veremos ms en las entregas de las clases) En el procedimiento Buscar, veremos cmo usar otro recordset, pero de la forma tradicional: sin eventos. Escribe este cdigo en las declaraciones generales del formulario: Option Explicit ' En ADO, se usa el objeto Connection para abrir las bases de datos Private cnn As ADODB.Connection ' Necesitamos los eventos si queremos controlar algunas cosillas Private WithEvents rst As ADODB.Recordset Al cargar el formulario, creamos los objetos y asignamos la informacin correspondiente para abrir la base de datos y crear o llenar el Recordset. Como te dije, la base de datos se abre usando el objeto Connection, del cual usaremos el mtodo Open al cual hay que indicarle el "proveedor" y el nombre de la base de datos: Private Sub Form_Load() ' Text2 = "" ' ' Indicar el path correcto de la base de datos ' ACUERDATE DE PONER EL PATH CORRECTO!

Const sPathBase As String = "C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB" ' ' Crear los objetos Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset ' ' Crear la conexin manualmente ' Usar "Provider=Microsoft.Jet.OLEDB.3.51;" para bases de Access 97 ' Usar "Provider=Microsoft.Jet.OLEDB.4.0;" 2000 With cnn .ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.3.51;" & _ "Data Source=" & sPathBase & ";" .Open End With ' Indicarle de que tabla vamos a leer los datos rst.Open "SELECT * FROM Authors", cnn, adOpenDynamic, adLockOptimistic ' ' Asignar los nombres de los campos a las etiquetas Label1(0).Caption = "Au_ID:" Label1(1).Caption = "Author:" Label1(2).Caption = "Year Born:" ' With ListView1 ' El tipo de Listview que queremos es del tipo "reporte" .View = lvwReport ' Que muestre las lneas de separacin entre datos .GridLines = True ' Que no se puedan modificar los datos del listview .LabelEdit = lvwManual ' Aadimos las cabeceras .ColumnHeaders.Add , , "Au_ID", 900 .ColumnHeaders.Add , , "Autor", 2700 .ColumnHeaders.Add , , "Ao nacimiento", 1500, lvwColumnRight End With ' para bases de Access

' Si hay datos, posicionarlo en el primer registro: cmdMover_Click 0 End Sub En el ejemplo de la entrega anterior, tenamos un procedimiento al que llambamos cada vez que tenamos que actualizar la informacin del registro que estaba activo. Pero como el Recordset de ADO produce eventos, vamos a usar uno de esos eventos: MoveComplete, el cual se produce cada vez que se cambia el registro activo. Como te coment antes, las variables declaradas con WithEvents siguen la misma "nomenclatura" que los eventos de los controles, por tanto, ese evento estar en: rst_MoveComplete (selecciona el objeto rst de la lista desplegable derecha y el evento MoveComplete de la lista de la izquierda), ste es el cdigo para mostrar los datos cada vez que se cambia el registro activo, aunque realmente no sera necesario si hubisemos "ligado" los controles con el recordset... pero de esa forma no tendramos el control total sobre los datos, as que vamos a seguir con esto de usar los eventos: Private Sub rst_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _ ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, _ ByVal pRecordset As ADODB.Recordset) ' Cada vez que el registro actual cambie, ' se producir este evento (igual que con el DataControl) With rst '--------------------------------------------------------------------' Nota aclaratoria del 18/Dic/2003: ' Cuando en un Recordset no hay datos, tanto BOF como EOF devuelven True '--------------------------------------------------------------------If .EOF And .BOF Then lblData.Caption = "No hay ningn registro activo" .MoveFirst Else Text1(0) = .Fields("Au_ID") ' Por si el dato es nulo, aadirle una cadena vacia Text1(1) = .Fields("Author") & "" Text1(2) = .Fields("Year Born") & "" End If End With End Sub

En este evento podemos usar tanto el objeto rst como el que est en el parmetro: pRecordset, los dos se refieren al mismo objeto. Hacemos una pequea comprobacin de que no nos encontremos con un recordset vaco o que est fuera de los lmites permitidos, (cosa que ocurre cuando queremos pasar al siguiente registro cuando estamos al final (se produce EOF) o cuando pasamos al registro anterior y estamos al principio, (se produce BOF). Si todo va bien, asignamos a las cajas de textos el contenido de los campos correspondientes. Fjate que en algunos de los campos aado una cadena vaca al contenido del campo, esto es para los casos en que esos campos contengan un valor nulo. Si se lo quitas al Year Born, vers cmo se produce un error, ya que en la base de datos Biblio, que es la que usaremos para este ejemplo, ese campo no suele estar asignado. Ahora te muestro el resto del cdigo para los botones de Mover, Nuevo, Actualizar y Eliminar, que es prcticamente igual al de la versin para DAO, con la salvedad de Actualizar, ya que en ADO no es necesario poner un registro (o columna que es como se debera decir), en modo edicin para poder modificarlo, ya que al usar Update, se actualiza el registro. Private Sub cmdMover_Click(Index As Integer) ' Mover segn el botn pulsado 'On Error Resume Next ' With rst If Index = 0 Then .MoveFirst ElseIf Index = 1 Then .MovePrevious ElseIf Index = 2 Then .MoveNext ElseIf Index = 3 Then .MoveLast End If ' If .BOF Or .EOF Then .MoveFirst lblData.Caption = " No hay datos..." Else lblData.Caption = " Registro actual: " & rst("Au_ID") End If End With ' Err = 0 End Sub ' ltimo ' Siguiente ' Anterior ' Primero

Private Sub cmdAdd_Click() ' Aadir un nuevo registro rst.AddNew ' Aadimos algn texto, para que no se pierda este registro Text1(1) = "Nuevo" ' Actualizamos los datos rst.Update ' Movemos al ltimo registro para que los cambios se hagan permanentes ' y se muestre el nuevo registro rst.MoveLast End Sub Private Sub cmdActualizar_Click() ' Guardar el contenido de las cajas de texto With rst ' Este campo es auto numrico, as que no asignarlo '.Fields("Au_ID") = Text1(0) + 0 ' Aadimos una cadena vaca al final ' ya que si Text1(1) est vaco, se asignar un valor NULL y dar error .Fields("Author") = Text1(1) & "" ' Idem con el ao de nacimiento, pero como es numrico, se sumar 0 .Fields("Year Born") = Text1(2) + 0 ' Actualizar los datos en el recordset .Update End With End Sub Private Sub cmdBorrar_Click() ' Borrar el registro actual ' Se comprueba que haya algn registro activo, ' para ello se comprueba que no hayamos pasado del principio o el final del Recordset ' ' Comprobar que hay registros, porque si no hay, dar error If (rst.EOF Or rst.BOF) Then ' Avisar de que no hay registros lblData.Caption = "Ningn registro activo" Else

' Eliminar el registro actual rst.Delete ' ' Movemos al primer registro para que los cambios se hagan permanentes ' (tambin podramos haberlo movido al ltimo registro) rst.MoveFirst End If End Sub Creo que no necesita informacin adicional, en los comentarios est todo explicado. Para terminar, vamos a ver el cdigo para Buscar datos: Private Sub cmdBuscar_Click() ' Mostrar los datos en el listview Dim sBuscar As String Dim tRs As Recordset Dim tLi As ListItem ' ' Comprobar si tiene caracteres "no vlidos" para ADO: ' NOTA: Replace es una funcin de VB6 sBuscar = Text2 sBuscar = Replace(sBuscar, "*", "%") sBuscar = Replace(sBuscar, "?", "_") ' Text2 = sBuscar ' Formar la cadena de la consulta: ' Se busca por el nombre del autor y se muestran clasificados por el nombre sBuscar = "SELECT * FROM Authors WHERE Author LIKE '" & sBuscar & "' ORDER BY Author" ' Creamos un recordset del tipo "esttico", el cual no es modificable ' para poder modificarlo, tendra que ser del tipo dbOpenDynamic Set tRs = cnn.Execute(sBuscar) ' Comprobar que hay datos en el recordset With tRs ' Si no hay datos... '---------------------------------------------------------------------

' Nota aclaratoria del 18/Dic/2003: ' Cuando en un Recordset no hay datos, tanto BOF como EOF devuelven True '--------------------------------------------------------------------If (.BOF And .EOF) Then MsgBox "No se han encontrado los datos buscados" Else ' Mostrar los datos hallados ListView1.ListItems.Clear .MoveFirst Do While Not .EOF Set tLi = ListView1.ListItems.Add(, , .Fields("Au_ID") & "") tLi.SubItems(1) = .Fields("Author") & "" tLi.SubItems(2) = .Fields("Year Born") & "" .MoveNext Loop End If End With End Sub Caracteres comodines: Como podrs comprobar el procedimiento de buscar es muy parecido, por no decir casi idntico al usado en DAO, con la salvedad de que hacemos una comprobacin para cambiar los caracteres comodines que hubiese en el texto indicado para la bsqueda, ya que en ADO no son los mismos que en DAO. Segn la ayuda de ADO, se usar el carcter % (tanto por ciento) en lugar del * (asterisco), cuando queramos indicar cualquier cosa que haya en el sitio en que se encuentra dicho carcter, por ejemplo: %jan% encontrar todos los registros que contenga "jan", est en el sitio que est: Janet, Alejandro, etc. Si pusiramos jan%, slo mostrara los que empezaran con jan, etc. Por otro lado, el carcter _ (subrayado bajo) sustituye a la ? (interrogacin), en este caso este comodn significa "cualquier carcter que est en esa posicin", por ejemplo: %r_us% encontrar cualquier palabra que contenga: una r seguida de cualquier cosa, seguida de us. Tal es el caso de Rouse, Marcus, etc. La funcin Replace usada para cambiar esos caracteres es propia de la versin 6 de Visual Basic, en VB5 no existe, as que tendrs que crearte tu propia funcin Replace. Bueno, vale... aqu la tienes: Private Function Replace(ByVal Expresion As String, _ ByVal Encontrar As String, _

ByVal ReemplazarCon As String) As String '--------------------------------------------------------------' Funcin Replace para usar con VB5 o anteriores '--------------------------------------------------------------Dim i As Long, j As Long ' j = 1 Do ' Buscar la cadena indicada en la expresin i = InStr(j, Expresion, Encontrar) ' Si la hemos hallado, quitamos dicha cadena y ponemos la nueva If i Then Expresion = Left$(Expresion, i - 1) & ReemplazarCon & Mid$(Expresion, i + Len(Encontrar)) j = i + 1 End If Loop While i ' Devolver la cadena Replace = Expresion End Function Esto esto amigos! (y para las amigas nada?, es que cuando se habla de forma genrica, se usa el gnero masculino... como si fuese neutro... s, ya, es que algunos que dicen ser muy masculinos, realmente son neutros... a quin te refieres? no, a nadie en concreto... es por aclarar las cosas... Ah! crea...) Dejemos a los Guilles con su discusin y te espero en la prxima entrega, que an no s de que tratar... ser de clases? ser de acceso a datos? ser sobre algn tema nuevo? ya veremos...

Bases de datos ADO con VB 6


(ADO = ActiveX Data Objects)

Actualizado el 18/Sep/2004 Revisado el 26/May/2007 Sigue este link para ver cmo hacer las cosas con DAO

Contenido: (los ms recientes arriba)


1. Usar base de datos de SQL Server 2005 desde Visual Basic 6.0 (26/May/07) 2. Indicar el path de una base de datos usando el control data (18/Sep/04) Ejemplo paso a paso de cmo usar un control data y DataGrid 3. Conectar a una base de datos de SQL Server con VB6 (Abrir una tabla y mostrar los campos/columnas) (10/Sep/04) 4. Instrucciones SQL para seleccionar, actualizar, eliminar datos, etc. (02/May/04) 5. Acceder a una base de datos de Access desde una pgina ASPX usando ADO (02/Ene/04) 6. Comprobar si un Recordset est vaco (18/Dic/03) 7. Cmo manejar fechas en consultas, adems de otros ejemplos, tanto para ADO como para DAO (09/Jul/03) 8. Acceder a una base de datos ADO sin el data control (Curso Bsico entrega 41) (09/Jul/03) 9. Ms consejos para mejorar el acceso a datos, aportados por Norman A. Armas (25/Oct/01) 10. Compactar y cambiar el password de una base de datos (24/Oct/01) 11. Compactar una base de datos con password (24/Oct/01) 12. Consejos para mejorar el acceso a los datos (04/Oct/01) 13. Cdigo de ejemplo de compactar, crear base y crear tablas con ADO (29/Sep/01) 14. Compactar una base de datos usando ADO y VB (29/Sep/01) 15. Crear una tabla en una base de datos, usando ADO y VB (29/Sep/01) Leer nota del 04/Oct/01 y 27/Dic/02 16. Crear una base de datos con ADO, usando cdigo de VB (29/Sep/01) 17. Abrir una base de datos ADO con contrasea (05/Sep/01) 18. Manipular imgenes usando ADO (con datacontrol) (11/Jul/01) 19. Usar el ADO DataControl (Curso Bsico entrega 36) (14/Feb/01) 20. Acceder a bases de datos usando ADO (sin el data control) (31/Ago/99) 21. Acceder a bases de Access 2000 (usando el datacontrol de ADO) (31/Ago/99)

Comprobar si un Recordset est vaco (18/Dic/2003) Como sabrs, se puede usar .BOF o .EOF para comprobar si est en los lmites del recordset. BOF devolver True si el "puntero" est antes del primer registro, por otro lado EOF nos indicar si ese puntero est despus del ltimo registro, pero la recomendacin para comprobar si realmente est vaco es que se cumplan esas dos condiciones: que tanto BOF como EOF sean True, por tanto podremos hacer una comprobacin como esta: With rst If .EOF And .BOF Then lblData.Caption = "No hay ningn registro activo" .MoveFirst Else Text1(0) = .Fields("Au_ID") ' Por si el dato es nulo, aadirle una cadena vacia Text1(1) = .Fields("Author") & "" Text1(2) = .Fields("Year Born") & "" End If End With

Aunque tambin se podra comprobar que .BOF Or .EOF sean True, es decir, hacer algo como esto: If .EOF Or .BOF Then pero ya te digo que lo ms correcto es usar AND, al menos eso es lo que he ledo en la documentacin de ADO. Espero que esta pequea aclaracin te pueda ser de utilidad. Nos vemos. Guillermo

Ms consejos para mejorar el acceso a los datos, aportados por Norman A. Armas (25/Oct/2001) Algunos consejos para mejorar el acceso a datos: -Abrir el recordset o el Data slo en el momento necesario, NUNCA abrir los recordsets o datas en el momento de cargar la forma (salvo en casos en que no queda mas remedio) Por ejemplo si tienes un formulario con varios combos no es necesario llenarlos en el momento de cargar la forma, una buena costumbre es cargarlos en el momento en que el usuario haga click en el combo. -No cargar mas de 100 records como mximo en un grid o lista, si es necesario mostrar ms, jugar con el SELECT TOP y el WHERE para mostrar los datos en bloques de a 100 (o menos de 100)

Compactar una base de datos con password y cambiarlo. (24/Oct/2001)

Para compactar una base de datos con password (o contrasea), se hace prcticamente igual que en una base de datos sin password, lo nico que hay que hacer es aadirle la cadena correspondiente al cdigo mostrado anteriormente. Este sera el cdigo para compactar una base de datos con password:
je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";" & _ "Jet OLEDB:Database Password=PasswordAnterior", _ "Data Source=" & sDBTmp & ";"

Y este otro para cambiarle el password actual y ponerle otro:


je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";" & _ "Jet OLEDB:Database Password=PasswordAnterior", _ "Data Source=" & sDBTmp & ";" & _ "Jet OLEDB:Database Password=NuevoPassword"

Consejos para mejorar el acceso a los datos (04/Oct/2001) Esta seccin te mostrar algunos consejos con los cuales podrs mejorar el acceso a los datos, el primero de ellos, con el que inauguramos esta seccin es de Norman A. Armas, si crees que tienes alguno que se pueda aadir, me lo mandas. Gracias. 1. Consejo aportado por Norman A. Armas, publicado el 04/Oct/2001 Nunca usar SELECT * FROM TuTabla., especifica siempre que campos son los que se quieren seleccionar en ese momento y que record o records

Cdigo de ejemplo de compacta, crear base y crear tablas con ADO (29/Sep/2001)
Este es el link al cdigo completo de los tres casos indicados: Cmo crear una base de datos con ADO, Cmo crear tablas y Cmo compactar una base de datos. En la pgina se muestra el cdigo completo, el cual puedes bajar mediante un fichero comprimido.

Que lo disfrutes! Guillermo

Compactar una base de datos usando ADO y VB (29/Sep/2001)


Para compactar bases de datos usando ADO, tienes que crear una referencia a Microsoft Jet and Replication Objects 2.6 Library (JRO). Nota: JRO slo se puede usar con bases de datos Microsoft JET Aqu tienes el cdigo necesario para compactar una base de datos: Private Sub cmdCompactar_Click() ' Compactar una base de datos con ADO Dim sDBTmp As String Dim je As JRO.JetEngine ' On Error GoTo ErrCompactar ' Set je = New JRO.JetEngine ' ' Crear un nombre "medio" aleatorio sDBTmp = "DBT_" & Format$(Minute(Now), "00") & Format$(Second(Now), "00") & ".mdb" ' Asegurarnos de que no existe una base con el nombre temporal If Len(Dir$(sDBTmp)) Then Kill sDBTmp End If ' lblInfo.Caption = " Compactando la base de datos..." lblInfo.Refresh ' ' Compactar la base de datos je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";", _ "Data Source=" & sDBTmp & ";" ' ' Eliminar la base de datos original Kill txtNombreBase.Text ' ' Renombrar la base temporal con el original Name sDBTmp As txtNombreBase.Text

' lblInfo.Caption = " Base de datos compactada." lblInfo.Refresh ' Exit Sub ' ErrCompactar: ' Mostrar el mensaje de error MsgBox "Error al compactar la base de datos:" & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation, "Error al compactar la base de datos" Err.Clear lblInfo.Caption = " *** Error al compactar la base de datos ***" lblInfo.Refresh End Sub Para ms informacin: Compacting a Database (MDAC Technical Articles)

Crear una tabla en una base de datos usando ADO y VB (29/Sep/2001)


Hay que crear una referencia a ADOX (ver Cmo crear una base de datos con ADO). El cdigo, casi simplificado, sera algo como esto:

Dim cat As ADOX.Catalog Dim tbl As ADOX.Table ' Set cat = New ADOX.Catalog Set tbl = New ADOX.Table ' ' Abrir el catlogo cat.ActiveConnection = _ "Provider=" & cboProvider.Text & ";" & _ "Data Source=" & txtNombreBase.Text & ";" ' ' Crear la nueva tabla With tbl .Name = txtNombreTabla.Text

' Crear los campos y aadirlos a la tabla. ' Esto hay que hacerlo antes de aadir la tabla a la coleccin de tablas .Columns.Append "ID", adInteger ' Dependiendo del tipo de proveedor, los datos de cadena sern de un tipo u otro If cboProvider.Text = "Microsoft.Jet.OLEDB.3.51" Then ' Para Access 97 .Columns.Append "Nombre", adVarChar, 50 de 50 caracteres .Columns.Append "email", adVarChar, 100 .Columns.Append "Telefono", adVarChar .Columns.Append "Observaciones", adLongVarChar larga, (Memo) Else ' Para Access 2000 .Columns.Append "Nombre", adVarWChar, 50 de 50 caracteres .Columns.Append "email", adVarWChar, 100 .Columns.Append "Telefono", adVarWChar .Columns.Append "Observaciones", adLongVarWChar ' Una cadena larga, (Memo) End If .Columns("Nombre").Attributes = adColNullable contener nulos .Columns("email").Attributes = adColNullable .Columns("Telefono").Attributes = adColNullable .Columns("Observaciones").Attributes = adColNullable End With ' ' Aadir la nueva tabla a la base de datos cat.Tables.Append tbl ' Set tbl = Nothing Set cat = Nothing En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor), sNombreBase (el nombre y path de la base de datos) y sNombreTabla para el nombre de la tabla. Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" ' Permite ' Una cadena ' Una cadena ' Una cadena

Nota: Los tipos de datos de cadena adVarChar y adLongVarChar son los que aceptan las tablas para Access 97, las tablas de Access 2000 se deben usar los del tipo adVarWChar y adLongWChar. Nota 2: Los campos se aaden a la tabla por orden alfabtico, independientemente del orden en el que se han aadido. Nota del 27/Dic/02: Esto slo ocurre si se usa el JET 3.51, con JET 4.0 los crea en el orden indicado al crearlos. Gracias Jose Angel Calvo. Si alguien sabe cmo hacer que no se clasifiquen, (en JET 3.51), por favor que me lo diga, gracias Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Crear una base de datos con ADO, usando cdigo de VB (29/Sep/2001)


Para poder crear una base de datos, desde Visual Basic, usando ADO (ActiveX Data Objects), tenemos que crear en nuestro proyecto una referencia a: Microsoft ADO Ext. 2.6 for DDL and Security (msadox.dll), y crear un objeto del tipo Catalog. Nota: Esta referencia es para la versin 2.6 de ADO, por tanto puede ser que, si la versin que tienes instalada es otra, en lugar de 2.6 aparezca otra numeracin. ADOX slo est disponible a partir de la versin 2.1 de ADO.

Veamos, de forma simple, cmo crear una base de datos: Dim cat As ADOX.Catalog Set cat = New ADOX.Catalog ' ' Crear la base de datos cat.Create "Provider=" & sProvider & ";" & _ "Data Source=" & sNombreBase & ";" En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor) y sNombreBase (el nombre y path de la base de datos). Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Si la base de datos ya existe, dar un error.

Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Abrir una base de datos ADO con contrasea (05/Sep/2001)


Para abrir una base de datos ADO con contrasea, podemos hacerlo al crear la conexin. He probado varias de las formas que se indican en la ayuda, pero la nica que me ha funcionado es la que aqu te muestro... as que, si a ti te funciona de otra forma, pues... eso, que uses la que mejor te parezca... je, je. Este cdigo es para bases de datos del tipo Access 97, en caso de que quieras usar una de Access 2000, hay que cambiar el provider por: Provider=Microsoft.Jet.OLEDB.4.0; Set Cnn = New ADODB.Connection Cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51; " & _ "Data Source=" & sBase & ";" & _ "Jet OLEDB:Database Password=laclave" En este ejemplo, asumimos que tenemos una variable llamada Cnn del tipo ADODB.Connection y otra, sBase del tipo String, a la que se ha asignado el nombre de la base de datos a la que queremos acceder.

Como sabrs, se puede usar .BOF o .EOF para comprobar si est en los lmites del recordset. BOF devolver True si el "puntero" est antes del primer registro, por otro lado EOF nos indicar si ese puntero est despus del ltimo registro, pero la recomendacin para comprobar si realmente est vaco es que se cumplan esas dos condiciones: que tanto BOF como EOF sean True, por tanto podremos hacer una comprobacin como esta: With rst If .EOF And .BOF Then lblData.Caption = "No hay ningn registro activo" .MoveFirst Else Text1(0) = .Fields("Au_ID") ' Por si el dato es nulo, aadirle una cadena vacia Text1(1) = .Fields("Author") & "" Text1(2) = .Fields("Year Born") & "" End If End With

Aunque tambin se podra comprobar que .BOF Or .EOF sean True, es decir, hacer algo como esto: If .EOF Or .BOF Then pero ya te digo que lo ms correcto es usar AND, al menos eso es lo que he ledo

en la documentacin de ADO. Espero que esta pequea aclaracin te pueda ser de utilidad. Nos vemos. Guillermo

Ms consejos para mejorar el acceso a los datos, aportados por Norman A. Armas (25/Oct/2001) Algunos consejos para mejorar el acceso a datos: -Abrir el recordset o el Data slo en el momento necesario, NUNCA abrir los recordsets o datas en el momento de cargar la forma (salvo en casos en que no queda mas remedio) Por ejemplo si tienes un formulario con varios combos no es necesario llenarlos en el momento de cargar la forma, una buena costumbre es cargarlos en el momento en que el usuario haga click en el combo. -No cargar mas de 100 records como mximo en un grid o lista, si es necesario mostrar ms, jugar con el SELECT TOP y el WHERE para mostrar los datos en bloques de a 100 (o menos de 100)

Compactar una base de datos con password y cambiarlo. (24/Oct/2001) Para compactar una base de datos con password (o contrasea), se hace prcticamente igual que en una base de datos sin password, lo nico que hay que hacer es aadirle la cadena correspondiente al cdigo mostrado anteriormente. Este sera el cdigo para compactar una base de datos con password:
je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";" & _ "Jet OLEDB:Database Password=PasswordAnterior", _ "Data Source=" & sDBTmp & ";"

Y este otro para cambiarle el password actual y ponerle otro:


je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";" & _ "Jet OLEDB:Database Password=PasswordAnterior", _ "Data Source=" & sDBTmp & ";" & _ "Jet OLEDB:Database Password=NuevoPassword"

Consejos para mejorar el acceso a los datos (04/Oct/2001) Esta seccin te mostrar algunos consejos con los cuales podrs mejorar el acceso a los datos, el primero de ellos, con el que inauguramos esta seccin es de Norman A. Armas, si crees que tienes alguno que se pueda aadir, me lo mandas. Gracias. 1. Consejo aportado por Norman A. Armas, publicado el 04/Oct/2001 Nunca usar SELECT * FROM TuTabla., especifica siempre que campos son los que se quieren seleccionar en ese momento y que record o records

Cdigo de ejemplo de compacta, crear base y crear tablas con ADO (29/Sep/2001)
Este es el link al cdigo completo de los tres casos indicados: Cmo crear una base de datos con ADO, Cmo crear tablas y Cmo compactar una base de datos. En la pgina se muestra el cdigo completo, el cual puedes bajar mediante un fichero comprimido. Que lo disfrutes! Guillermo

Compactar una base de datos usando ADO y VB (29/Sep/2001)


Para compactar bases de datos usando ADO, tienes que crear una referencia a Microsoft Jet and Replication Objects 2.6 Library (JRO). Nota: JRO slo se puede usar con bases de datos Microsoft JET Aqu tienes el cdigo necesario para compactar una base de datos: Private Sub cmdCompactar_Click() ' Compactar una base de datos con ADO Dim sDBTmp As String Dim je As JRO.JetEngine ' On Error GoTo ErrCompactar '

Set je = New JRO.JetEngine ' ' Crear un nombre "medio" aleatorio sDBTmp = "DBT_" & Format$(Minute(Now), "00") & Format$(Second(Now), "00") & ".mdb" ' Asegurarnos de que no existe una base con el nombre temporal If Len(Dir$(sDBTmp)) Then Kill sDBTmp End If ' lblInfo.Caption = " Compactando la base de datos..." lblInfo.Refresh ' ' Compactar la base de datos je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";", _ "Data Source=" & sDBTmp & ";" ' ' Eliminar la base de datos original Kill txtNombreBase.Text ' ' Renombrar la base temporal con el original Name sDBTmp As txtNombreBase.Text ' lblInfo.Caption = " Base de datos compactada." lblInfo.Refresh ' Exit Sub ' ErrCompactar: ' Mostrar el mensaje de error MsgBox "Error al compactar la base de datos:" & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation, "Error al compactar la base de datos" Err.Clear lblInfo.Caption = " *** Error al compactar la base de datos ***" lblInfo.Refresh End Sub Para ms informacin: Compacting a Database (MDAC Technical Articles)

Crear una tabla en una base de datos usando ADO y VB (29/Sep/2001)


Hay que crear una referencia a ADOX (ver Cmo crear una base de datos con ADO). El cdigo, casi simplificado, sera algo como esto:

Dim cat As ADOX.Catalog Dim tbl As ADOX.Table ' Set cat = New ADOX.Catalog Set tbl = New ADOX.Table ' ' Abrir el catlogo cat.ActiveConnection = _ "Provider=" & cboProvider.Text & ";" & _ "Data Source=" & txtNombreBase.Text & ";" ' ' Crear la nueva tabla With tbl .Name = txtNombreTabla.Text ' Crear los campos y aadirlos a la tabla. ' Esto hay que hacerlo antes de aadir la tabla a la coleccin de tablas .Columns.Append "ID", adInteger ' Dependiendo del tipo de proveedor, los datos de cadena sern de un tipo u otro If cboProvider.Text = "Microsoft.Jet.OLEDB.3.51" Then ' Para Access 97 .Columns.Append "Nombre", adVarChar, 50 de 50 caracteres .Columns.Append "email", adVarChar, 100 .Columns.Append "Telefono", adVarChar .Columns.Append "Observaciones", adLongVarChar larga, (Memo) Else ' Para Access 2000 .Columns.Append "Nombre", adVarWChar, 50 de 50 caracteres .Columns.Append "email", adVarWChar, 100 ' Una cadena ' Una cadena ' Una cadena

.Columns.Append "Telefono", adVarWChar .Columns.Append "Observaciones", adLongVarWChar ' Una cadena larga, (Memo) End If .Columns("Nombre").Attributes = adColNullable contener nulos .Columns("email").Attributes = adColNullable .Columns("Telefono").Attributes = adColNullable .Columns("Observaciones").Attributes = adColNullable End With ' ' Aadir la nueva tabla a la base de datos cat.Tables.Append tbl ' Set tbl = Nothing Set cat = Nothing En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor), sNombreBase (el nombre y path de la base de datos) y sNombreTabla para el nombre de la tabla. Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Los tipos de datos de cadena adVarChar y adLongVarChar son los que aceptan las tablas para Access 97, las tablas de Access 2000 se deben usar los del tipo adVarWChar y adLongWChar. Nota 2: Los campos se aaden a la tabla por orden alfabtico, independientemente del orden en el que se han aadido. Nota del 27/Dic/02: Esto slo ocurre si se usa el JET 3.51, con JET 4.0 los crea en el orden indicado al crearlos. Gracias Jose Angel Calvo. Si alguien sabe cmo hacer que no se clasifiquen, (en JET 3.51), por favor que me lo diga, gracias Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles) ' Permite

Crear una base de datos con ADO, usando cdigo de VB (29/Sep/2001)

Para poder crear una base de datos, desde Visual Basic, usando ADO (ActiveX Data Objects), tenemos que crear en nuestro proyecto una referencia a: Microsoft ADO Ext. 2.6 for DDL and Security (msadox.dll), y crear un objeto del tipo Catalog. Nota: Esta referencia es para la versin 2.6 de ADO, por tanto puede ser que, si la versin que tienes instalada es otra, en lugar de 2.6 aparezca otra numeracin. ADOX slo est disponible a partir de la versin 2.1 de ADO.

Veamos, de forma simple, cmo crear una base de datos: Dim cat As ADOX.Catalog Set cat = New ADOX.Catalog ' ' Crear la base de datos cat.Create "Provider=" & sProvider & ";" & _ "Data Source=" & sNombreBase & ";" En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor) y sNombreBase (el nombre y path de la base de datos). Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Si la base de datos ya existe, dar un error. Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Abrir una base de datos ADO con contrasea (05/Sep/2001)


Para abrir una base de datos ADO con contrasea, podemos hacerlo al crear la conexin. He probado varias de las formas que se indican en la ayuda, pero la nica que me ha funcionado es la que aqu te muestro... as que, si a ti te funciona de otra forma, pues... eso, que uses la que mejor te parezca... je, je. Este cdigo es para bases de datos del tipo Access 97, en caso de que quieras usar una de Access 2000, hay que cambiar el provider por: Provider=Microsoft.Jet.OLEDB.4.0; Set Cnn = New ADODB.Connection Cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51; " & _ "Data Source=" & sBase & ";" & _

"Jet OLEDB:Database Password=laclave" En este ejemplo, asumimos que tenemos una variable llamada Cnn del tipo ADODB.Connection y otra, sBase del tipo String, a la que se ha asignado el nombre de la base de datos a la que queremos acceder.

Compactar una base de datos usando ADO y VB (29/Sep/2001)


Para compactar bases de datos usando ADO, tienes que crear una referencia a Microsoft Jet and Replication Objects 2.6 Library (JRO). Nota: JRO slo se puede usar con bases de datos Microsoft JET Aqu tienes el cdigo necesario para compactar una base de datos: Private Sub cmdCompactar_Click() ' Compactar una base de datos con ADO Dim sDBTmp As String Dim je As JRO.JetEngine ' On Error GoTo ErrCompactar ' Set je = New JRO.JetEngine ' ' Crear un nombre "medio" aleatorio sDBTmp = "DBT_" & Format$(Minute(Now), "00") & Format$(Second(Now), "00") & ".mdb" ' Asegurarnos de que no existe una base con el nombre temporal If Len(Dir$(sDBTmp)) Then Kill sDBTmp End If ' lblInfo.Caption = " Compactando la base de datos..." lblInfo.Refresh ' ' Compactar la base de datos je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";", _ "Data Source=" & sDBTmp & ";" ' ' Eliminar la base de datos original Kill txtNombreBase.Text '

' Renombrar la base temporal con el original Name sDBTmp As txtNombreBase.Text ' lblInfo.Caption = " Base de datos compactada." lblInfo.Refresh ' Exit Sub ' ErrCompactar: ' Mostrar el mensaje de error MsgBox "Error al compactar la base de datos:" & vbCrLf & _ Err.Number & " " & Err.Description, _ vbExclamation, "Error al compactar la base de datos" Err.Clear lblInfo.Caption = " *** Error al compactar la base de datos ***" lblInfo.Refresh End Sub Para ms informacin: Compacting a Database (MDAC Technical Articles)

Crear una tabla en una base de datos usando ADO y VB (29/Sep/2001)


Hay que crear una referencia a ADOX (ver Cmo crear una base de datos con ADO). El cdigo, casi simplificado, sera algo como esto:

Dim cat As ADOX.Catalog Dim tbl As ADOX.Table ' Set cat = New ADOX.Catalog Set tbl = New ADOX.Table ' ' Abrir el catlogo cat.ActiveConnection = _ "Provider=" & cboProvider.Text & ";" & _ "Data Source=" & txtNombreBase.Text & ";" ' ' Crear la nueva tabla

With tbl .Name = txtNombreTabla.Text ' Crear los campos y aadirlos a la tabla. ' Esto hay que hacerlo antes de aadir la tabla a la coleccin de tablas .Columns.Append "ID", adInteger ' Dependiendo del tipo de proveedor, los datos de cadena sern de un tipo u otro If cboProvider.Text = "Microsoft.Jet.OLEDB.3.51" Then ' Para Access 97 .Columns.Append "Nombre", adVarChar, 50 de 50 caracteres .Columns.Append "email", adVarChar, 100 .Columns.Append "Telefono", adVarChar .Columns.Append "Observaciones", adLongVarChar larga, (Memo) Else ' Para Access 2000 .Columns.Append "Nombre", adVarWChar, 50 de 50 caracteres .Columns.Append "email", adVarWChar, 100 .Columns.Append "Telefono", adVarWChar .Columns.Append "Observaciones", adLongVarWChar ' Una cadena larga, (Memo) End If .Columns("Nombre").Attributes = adColNullable contener nulos .Columns("email").Attributes = adColNullable .Columns("Telefono").Attributes = adColNullable .Columns("Observaciones").Attributes = adColNullable End With ' ' Aadir la nueva tabla a la base de datos cat.Tables.Append tbl ' Set tbl = Nothing Set cat = Nothing En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor), sNombreBase (el nombre y path de la base de datos) y sNombreTabla para el nombre de la tabla. Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51" ' Permite ' Una cadena ' Una cadena ' Una cadena

Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Los tipos de datos de cadena adVarChar y adLongVarChar son los que aceptan las tablas para Access 97, las tablas de Access 2000 se deben usar los del tipo adVarWChar y adLongWChar. Nota 2: Los campos se aaden a la tabla por orden alfabtico, independientemente del orden en el que se han aadido. Nota del 27/Dic/02: Esto slo ocurre si se usa el JET 3.51, con JET 4.0 los crea en el orden indicado al crearlos. Gracias Jose Angel Calvo. Si alguien sabe cmo hacer que no se clasifiquen, (en JET 3.51), por favor que me lo diga, gracias Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Crear una base de datos con ADO, usando cdigo de VB (29/Sep/2001)


Para poder crear una base de datos, desde Visual Basic, usando ADO (ActiveX Data Objects), tenemos que crear en nuestro proyecto una referencia a: Microsoft ADO Ext. 2.6 for DDL and Security (msadox.dll), y crear un objeto del tipo Catalog. Nota: Esta referencia es para la versin 2.6 de ADO, por tanto puede ser que, si la versin que tienes instalada es otra, en lugar de 2.6 aparezca otra numeracin. ADOX slo est disponible a partir de la versin 2.1 de ADO.

Veamos, de forma simple, cmo crear una base de datos: Dim cat As ADOX.Catalog Set cat = New ADOX.Catalog ' ' Crear la base de datos cat.Create "Provider=" & sProvider & ";" & _ "Data Source=" & sNombreBase & ";" En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor) y sNombreBase (el nombre y path de la base de datos). Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51"

Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0" Nota: Si la base de datos ya existe, dar un error. Para ms informacin: Defining and Retrieving a Databases Schema (MDAC Technical Articles)

Abrir una base de datos ADO con contrasea (05/Sep/2001)


Para abrir una base de datos ADO con contrasea, podemos hacerlo al crear la conexin. He probado varias de las formas que se indican en la ayuda, pero la nica que me ha funcionado es la que aqu te muestro... as que, si a ti te funciona de otra forma, pues... eso, que uses la que mejor te parezca... je, je. Este cdigo es para bases de datos del tipo Access 97, en caso de que quieras usar una de Access 2000, hay que cambiar el provider por: Provider=Microsoft.Jet.OLEDB.4.0; Set Cnn = New ADODB.Connection Cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51; " & _ "Data Source=" & sBase & ";" & _ "Jet OLEDB:Database Password=laclave" En este ejemplo, asumimos que tenemos una variable llamada Cnn del tipo ADODB.Connection y otra, sBase del tipo String, a la que se ha asignado el nombre de la base de datos a la que queremos acceder.

Acceso a base de datos de Access 2000 Usando el ADO data control


Publicado: 31/Ago/1999 Actualizado: 31/Ago/1999

Si has intentado usar una base de datos creada o convertida con el Access 2000, te habrs llevado una pequea sorpresa al ver que usando el Data control que se incluye en el Visual Basic no te permite hacerlo. Esto es porque el nuevo formato de Access usa el motor Jet versin 4.0 y los datacontrol DAO slo "entienden" hasta la versin 3.5... Pero si tienes la versin 6.0 de Visual Basic, o bien has conseguido las DLLs de ADO (ActiveX Data Object), puedes usarlas sin problemas... incluso con el ADO Datacontrol. En el siguiente cdigo veremos cmo abrir y movernos en una base de datos, en este caso, lo mismo dar que la base de datos haya sido creada con Access 97 o con el Access 2000. Nota: En el zip con el cdigo de ejemplo se acompaa una base de datos de prueba creada con Access 97 y otra con el Access 2000.

Para empezar: Crea un nuevo proyecto, en Proyecto/Componentes... selecciona Microsoft ADO Data Control (OLEDB), pulsa Aceptar y vers que se aade un nuevo control a la barra de herramientas: Ese ser el control que usaremos! Haz dobleclick en ese control para que se aada al formulario, cmbiale la altura a un valor pequeo: 315 est bien, sitalo donde ms coraje te de y aade un TextBox, cambia el tamao, yo le he dado estos valores: alto 315, ancho 2955. Crea un array del Text1 recin aadido: Selecciona el Text1, pulsa el botn derecho y copialo; pulsa en cualquier lado del Form y pulsa el ratn derecho del ratn, selecciona Pegar... te preguntar si quieres crear un array del control Text1, responde que SI. Vuelve a pegar de nuevo y se crear un tercer Text1. Ahora tendrs tres controles Text1 con los ndices desde 0 a 2 Si te parece demasiado "bsico" todos estos pasos... te aguantas... y espera un poco que ya mismo termino. Ahora vamos a configurar el ADO datacontrol: Selecciona el datacontrol, en la ventana de propiedades pulsa en Custom... Te mostrar un cuadro de dilogo, (puede que si tienes la versin en castellano del VB, no te muestre lo que yo te digo, ya que la versin que tengo est en ingls, pero espero que no te lies...) En la ficha General, estar seleccionada la opcin "Use Connection String", pulsa en el botn "Build..." Te mostrar otro cuadro de dilogo, en la ficha "Provider", selecciona Microsoft Jet 4.0 OLE DB Provider, pulsa en "Next>>" y selecciona la base de datos que quieres usar, (si tienes la que estn incluidas en el ZIP, se llamar db2000.mdb); el resto de opciones djalos como est; pulsa en "Aceptar" dos veces para que se cierren los cuadros de dilogo. Ahora tenemos que decirle que tabla usar y otras cosillas. Selecciona la propiedad CursorType y de la lista desplegable selecciona 2adOpenDynaset. Selecciona la propiedad RecordSource y pulsa en el botn, te mostrar un

cuadro de dilogo. De la lista desplegable (Command type), selecciona: 2-adCmdTable, la lista "Table or Stored Procedure Name" se habr habilitado, selecciona el nombre de la tabla que quieres usar, en este caso Table1 y pulsa en Aceptar. Esto mismo se puede hacer mediante cdigo, para ello asgnale estos valores al datacontrol: (por ejemplo en el evento Form_Load) ' Indicar la base de datos a usar Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2000.mdb" Adodc1.CursorType = adOpenDynamic ' Conectarlo a la tabla de prueba Adodc1.RecordSource = "Table1" ' Refresh es necesario para que se cargue la tabla Adodc1.Refresh

Nota: En el cdigo de ejemplo asignaremos en tiempo de ejecucin la base de datos y dems conexiones necesarias. Ahora ser necesario "ligar" los cuadros de texto con el Datacontrol y los campos correspondientes: Selecciona los tres Text1, en la ventana de propiedades selecciona DataSource y en la lista desplegable selecciona Adodc1

Para ligar cada Text1 con un campo de la base de datos: Pulsa en cualquier parte del formulario para quitar la seleccin actual. Selecciona el Text1 con ndice 0. En la ventana de propiedades, selecciona DataField y de la lista desplegable, selecciona "Nombre" Haz lo mismo con los otros dos Text1, pero para el de ndice 1, selecciona "e-mail" y para el otro: "Comentario" Este ltimo control sera conveniente que lo hicieras ms grande y MultiLine, ya que se supone que aceptar textos ms grandes porque el tipo de campo es "Memo" Ya puedes pulsar en F5 para probar que todo esto funciona. Realmente no es necesario aadir nada de cdigo, pero si quieres hacerlo manualmente, aade lo siguiente en el evento Form_Load:

Private Sub Form_Load() ' Indicar la base de datos a usar Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2000.mdb" Adodc1.CursorType = adOpenDynamic ' Conectarlo a la tabla de prueba Adodc1.RecordSource = "Table1" ' Refresh es necesario para que se cargue la tabla Adodc1.Refresh ' Conectar manualmente los Text1 al recordset Dim i As Long ' Asignar el control data For i = 0 To 2 Set Text1(i).DataSource = Adodc1 Next ' Asignar los nombres de los campos Text1(0).DataField = "Nombre" Text1(1).DataField = "e-mail" Text1(2).DataField = "Comentario" End Sub

Para que el Caption del data control nos muestre el nmero de registro, en este caso el campo ID de la tabla, aade este cdigo:

Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _ ByVal pError As ADODB.Error, _ adStatus As ADODB.EventStatusEnum, _ ByVal pRecordset As ADODB.Recordset) ' Mostrar el ID del registro actual ' si se pasa del primero o del ltimo, dar error On Local Error Resume Next

' Mostrar el ID del registro actual usando el recordset pasado como parmetro 'Adodc1.Caption = "ID del Registro: " & pRecordset!ID ' Tambin se puede usar: Adodc1.Caption = "ID del Registro: " & Adodc1.Recordset!ID Err = 0 End Sub

Aadir y borrar registros de la tabla. Para tener estas dos opciones, aade dos botones al formulario, al primero lo llamas cmdAdd y en el Caption escribe Aadir, al otro botn le cambias el nombre a cmdDel y en el Caption escribe: Eliminar. Aade el siguiente cdigo: ' Private Sub cmdAdd_Click() Adodc1.Recordset.AddNew End Sub Private Sub cmdDel_Click() Adodc1.Recordset.Delete End Sub

Bueno, creo que con esto tienes para empezar, en otra ocasin te mostrar cmo hacer esto mismo pero sin usar el data control. En el zip con los listados hay otro proyecto que te permite seleccionar entre una base de Access 97 o una creada con Access 2000 Pulsa este link para bajar el cdigo y las bases de ejemplo. (ADO_datacontrol.zip 19.8 KB)

Si quieres ver un ejemplo de cmo acceder a una base de datos usando ADO, pero sin el data control...

También podría gustarte