|
Curso básico
de programación en Visual Basic
Lección
36
Acceder
a bases de datos con ADO
|
Realizamos
programas para la gestión de empresas. Empresas medianas y
pequeñas. Programas de contabilidad, cartera de pedidos
clientes proveedores, facturación control de albaranes,
tesorería cartera de cobros y pagos y estadísticas.
Nuestro
agradecimiento a todos los que por unas causas o por otras
visitan nuestra web. Gestión de empresas PYMES. Curso de
programación de Visual Basic.
|
En esta entrega
veremos cómo usar el ADO Datacontrol para acceder a las bases de
datos del tipo MDB (Access).
El ejemplo usado será parecido al de la entrega anterior, aunque
con unos pequeños cambios, para usar el tipo de acceso a bases de
datos ADO, en lugar de DAO.
Me imagino que habrás leído por ahí las diferencias entre ADO y
DAO, cosa que aquí no voy a hacer... porque si lo hiciera,
seguramente acabaría aburriendo hasta... a mi mismo. Así que
pasaré a las explicaciones básicas de cómo usarlo, que es la
intención de este curso básico, aunque, cuando lo crea
conveniente, profundizaré en los temas que crea conveniente, así
que... vamos al tema y veamos...
Cómo
usar el ADO datacontrol.
Empecemos desde
cero.
Crea un nuevo proyecto, se creará un proyecto con un formulario.
En el menú Proyecto/Componentes... selecciona Microsoft ADO Data
Control -seguramente irá acompañado de la versión del
control, en mi caso me indica que es 6.0 (SP4) (OLEDB)-
Cuando pulses en aceptar, para cerrar el cuadro de diálogo de
añadir componentes, te mostrará un nuevo objeto en la barra de
herramientas. Asegúrate de que tienes abierto el formulario y haz
doble-click en dicho control, de esta forma se añadirá un ADO
datacontrol al formulario.
Lo primero que hay que hacer es configurarlo para acceder a una base
de datos, pero todo esto se puede hacer mediante código, así que
no voy a explicarte cómo hacerlo desde el IDE de Visual Basic.
Añade el siguiente código al evento LOAD del formulario:
' 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 la conexión manualmente
' Con "Provider=Microsoft.Jet.OLEDB.4.0;" se permite abrir bases de datos de Access 2000
With Adodc1
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sPathBase & ";"
' Indicarle de que tabla vamos a leer los datos
.RecordSource = "Authors"
End With
Nota:
He de aclarar que las pruebas
sobre acceso a bases de datos con el ADO datacontrol están
realizadas con el Visual Basic 6.0 y el Service Pack 4 (SP4). Si
el código anterior te produjera un error, primero comprueba que
está escrito correctamente (hay que empezar por lo más
simple), si sigue sin funcionar, prueba a cambiar el 4.0
que está entre comillas por 3.51, si aún así tampoco
funciona... prueba a instalar el ADO, creo que se instala
automáticamente con el Internet Explorer 5.5, si a pesar de
todo esto tampoco funciona... no se que aconsejarte, aparte de
que consigas el VB6 y el SP4... o también que pases de
esta entrega...
Te explico un poco
el código anterior.
La constante es para que sea fácil modificarla si prefieres usar
otra base de datos.
El With Adodc1 es para indicarle al VB que vamos a modificar
varias propiedades del ADO datacontrol, aquí supongo que no has
modificado el nombre de dicho control, si lo has hecho, cambia
Adodc1 por el nombre que hayas puesto.
El método .ConnectioString, según dice la ayuda del Visual
Basic: Contiene la información que se utiliza para establecer
una conexión a un origen de datos. Osea, es lo que le dice al
ADO datacontrol de que base de datos obtener los datos y también de
que tipo es, en este caso es una base de datos del tipo
Microsoft.Jet, o lo que es lo mismo, del tipo Access.
Por tanto Provider= indica de que tipo de base de datos se
trata y Data Source= el path de la base de datos en
cuestión, (fíjate que se usa la constante con el path y nombre de
la base de datos).
Por último a la propiedad .RecordSource le indicamos que es
lo que queremos que maneje el datacontrol, en este caso una tabla de
la base de datos; aunque también podríamos haberle indicado una
consulta, pero esto último lo veremos en otra ocasión.
Ahora vamos a
añadir unos cuantos controles al formulario, para poder trabajar
con los datos manejados por el ADO datacontrol.
Los controles que usaremos serán 3 etiquetas y 3 cajas de texto,
pero ambos serán un array de controles, (en el ejemplo de las
entregas 34 y 35 usamos controles independientes, pero creo que es
más cómodo usar array de controles).
Cómo
crear un array de controles.
A estas alturas ya
deberías saber cómo hacerlo, pero te voy a refrescar la memoria.
Añade una etiqueta al formulario (se creará Label1).
Selecciónala, (simplemente haz click en ella)
Del menú Edición, selecciona Copiar, (también puedes hacerlo con
el botón derecho del ratón).
Del menú Edición, selecciona Pegar, se mostrará un mensaje
preguntando si quieres crear un array de Label1, contesta que si.
Vuelve a pegar (Edición/Pegar)
Y ya tienes tres etiquetas con índices que van desde cero a dos.
Añade un TextBox y haz la misma operación que con la etiqueta:
Selecciónalo; cópialo; pégalo, contesta que SI al mensaje de que
quieres crear un array; vuelve a pegar. Al final tendrás tres cajas
de Texto llamados Text1 con índices de cero a dos.
Posiciona los controles de forma que las etiquetas estén alineadas
con las cajas de texto, no te preocupes por el Caption de las
etiquetas, ya que lo modificaremos desde código.
Añade unos cuantos
controles más, para que podamos hacer búsqueda, etc. tal y como se
hizo en las dos entregas anteriores.
Al final deberíamos tener los siguientes controles:
| Control |
Índices
del array (o ninguno si no es un array) |
| Label1 |
0
a 2 |
| Text1 |
0
a 2 |
| Label2 |
Ninguno
(no es un array) |
| Text2 |
Ninguno
(no es un array) |
| Option1 |
Ninguno
(no es un array) |
| Option2 |
Ninguno
(no es un array) |
| cmdBuscar |
Ninguno
(no es un array) |
| cmdBuscarSig |
Ninguno
(no es un array) |
| cmdSalir |
Ninguno
(no es un array) |
| cmdAdd |
Ninguno
(no es un array) |
| cmdBorrar |
Ninguno
(no es un array) |
| Adodc1 |
Ninguno
(no es un array) |
Y en esta imagen
tienes una idea de cómo están dispuestos:

El formulario de prueba de la entrega 36
Aquí te muestro el código usado para que funcione este invento,
como comprobarás, es prácticamente el mismo que el usado en las
entregas anteriores, con unas cuantas añadiduras para
que funcione correctamente con el ADO datacontrol. Por tanto creo
que no necesita más explicaciones que las que se incluyen en el
propio código.
El código del procedimiento Buscar es el que tiene más cambios,
entre otras cosas porque la forma de buscar en ADO es diferente al
de DAO, en este último (DAO), se usan FindFirst, FindNext, etc. y
en ADO sólo existe Find.
También he usado un marcador en la rutina de buscar;
por si no se hallan datos, que el registro activo sea el mismo que
estaba antes de buscar. Échale un vistazo a los comentarios que hay
en el código.
'
'---------------------------------------------------------------------------
' Prueba de ADO Datacontrol para la entrega 36
'
' ©Guillermo 'guille' Som, 2001
'---------------------------------------------------------------------------
Option Explicit
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 Error Resume Next
' Mostrar el ID del registro actual usando el recordset pasado como parámetro
Adodc1.Caption = "Registro actual: " & pRecordset.AbsolutePosition
' Si da error, indicarlo (20/Sep/99)
If Err Or pRecordset.BOF Or pRecordset.EOF Then
Adodc1.Caption = "Ningún registro activo"
' Habría que moverlo a un registro con información
' *** Dejarlo comentado ***
' para que el procedimiento de búsqueda avise si no hay datos activos
'Adodc1.Recordset.MoveFirst
End If
Err = 0
End Sub
Private Sub cmdAdd_Click()
' Añadir un nuevo registro
Adodc1.Recordset.AddNew
' Añadimos algún texto, para que no se pierda este registro
Text1(1) = "Nuevo"
' Actualizamos los datos
Adodc1.Recordset.Update
' Hacemos que se "recargue" los datos del recordset
Adodc1.Refresh
' Movemos al último registro para que los cambios se hagan permanentes
' y se muestre el nuevo registro
Adodc1.Recordset.MoveLast
End Sub
Private Sub cmdBorrar_Click()
' Borrar el registro actual
' Se comprueba que haya algún 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 (Adodc1.Recordset.EOF Or Adodc1.Recordset.BOF) Then
' Avisar de que no hay registros
Adodc1.Caption = "Ningún registro activo"
Else
' Eliminar el registro actual
Adodc1.Recordset.Delete
'
' Movemos al primer registro para que los cambios se hagan permanentes
' (también podriamos haberlo movido al último registro)
Adodc1.Recordset.MoveFirst
End If
End Sub
Private Sub cmdBuscar_Click()
' Buscar el primer registro que coincida con el dato buscado
Buscar
End Sub
Private Sub cmdBuscarSig_Click()
' Buscar el siguiente
Buscar True
End Sub
Private Sub cmdSalir_Click()
Unload Me
End Sub
Private Sub Form_Load()
'
Text2 = ""
Option2.Value = True
'
' 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 la conexión manualmente
' Con "Provider=Microsoft.Jet.OLEDB.4.0;" se permite abrir bases de datos de Access 2000
With Me.Adodc1
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sPathBase & ";"
' Indicarle de que tabla vamos a leer los datos
.RecordSource = "Authors"
End With
' Indicar el DataSource de los Textboxes
' ya que con ADO se puede asignar en tiempo de ejecución
Dim i As Long
For i = 0 To 2
Set Text1(i).DataSource = Adodc1
Next
' Asignar los campos
Text1(0).DataField = "Au_ID"
Text1(1).DataField = "Author"
Text1(2).DataField = "Year Born"
' Mostrar en las etiquetas el campo a usar
For i = 0 To 2
Label1(i).Caption = Text1(i).DataField & ":"
Next
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
' Se buscará sólo cuando pulsemos INTRO
'
' Comprobar si la tecla pulsada es Intro: vbKeyReturn o 13 que es lo mismo
If KeyAscii = vbKeyReturn Then
On Error Resume Next
' Esta asignación evita que suene un BEEP
KeyAscii = 0
'
Buscar
End If
End Sub
Private Sub Buscar(Optional ByVal Siguiente As Boolean = False)
' Procedimiento para buscar el dato indicado
' Si Siguiente = True, se busca a partir del registro activo
Dim nReg As Long
Dim vBookmark As Variant ' En ADO debe ser Variant, no vale un String
Dim sADOBuscar As String
'
' Iniciamos la detección de errores
On Error Resume Next
'
' Buscar la primera coincidencia en el recordset del Data1
If Option1.Value Then
' Convertir el contenido de TextBox en un número
nReg = Val(Text2)
' en el campo Au_ID
sADOBuscar = "Au_ID = " & nReg
End If
If Option2.Value Then
' en el campo Author
sADOBuscar = "Author Like '" & Text2.Text & "'"
End If
' Guardar la posición anterior, por si no se halla lo buscado...
vBookmark = Adodc1.Recordset.Bookmark
'
If Siguiente = False Then
' Buscar desde el principio
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Find sADOBuscar
Else
' Busca a partir del registro actual
Adodc1.Recordset.Find sADOBuscar, 1
End If
' Devolverá un error si no se halla lo buscado
' aunque no siempre es así...
If Err.Number Or Adodc1.Recordset.BOF Or Adodc1.Recordset.EOF Then
Err.Clear
MsgBox "No existe el dato buscado o ya no hay más datos que mostrar."
' Posicionar el recordset en la posición guardada
Adodc1.Recordset.Bookmark = vBookmark
End If
End Sub
Y con esto acabamos la introducción a las bases de datos.
En futuras entregas veremos otras cosillas sobre el acceso a datos,
aunque antes de seguir con el acceso a base de datos, empezaremos a
ver un nuevo tipo de módulo de código: las clases. Así que...
prepárate para lo que viene.
Nos vemos
P.S.
Si quieres bajarte los ejemplos
usados, pulsa este link. (basico36_cod.zip 4.21 KB)

|
|