Acceder a bases de datos usando ADO

Sin usar el data control

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


Seguramente ya habrás visto cómo usar el ADO data control para acceder a bases de datos, ahora vamos a ver cómo hacerlo sin necesidad de usar el data control. es decir, con código puro y duro.

Para ello, vamos a usar una referencia a la librería ActiveX Data Object 2.0, ya que con esa versión podemos usar eventos en los recordsets, con idea de que sea más fácil moverse por los registros y demás cosillas que nos permiten los eventos.
También vamos a ver cómo podemos "ligar" los controles a ese recordset.

 

El código de ejemplo.

Para usar el código de este ejemplo, crea un nuevo proyecto.
En Proyecto/Referencias, selecciona: Microsoft ActiveX Data Objects 2.0 Library

Añade los controles necesarios para que tenga un aspecto como el siguiente:


Los nombres de los controles son:
Los botones para desplazarse por los registros de la base de datos: cmdMove, un array de cuatro controles, de cero a tres.
El botón de Actualizar se llama: cmdUpdate
El de Añadir: cmdAdd
El de Eliminar: cmdDel
Las cajas de texto igual que el texto mostrado, los Text1 son un array de cero a dos.

Espero que no tengas problemas para crear el form de prueba, pero de todas formas, en el zip con el código está el formulario, si es que no quieres "entretenerte" en crearlo.

Ahora añade el siguiente código al formulario.

Nota:
Como comprobarás, hay una constante de compilación condicional para poder usar los Text1 ligados al Recordset o no hacerlo.
Simplemente cambia el valor de dicha constante a -1, para usar los controles ligados o asígnale un valor 0, para que no se usen los controles ligados, en ese caso, tendrás que pulsar en el botón "Actualizar" para que los cambios realizados se actualicen en la base de datos.
Cuando los controles están ligados, al cambiar de registro, el contenido de las cajas de texto se actualizan en los campos correspondientes.

Nota2:
Básicamente para usar ADO en tus proyectos tendrás que usar un objeto del tipo Connection, que será el que se usará para abrir la base de datos y un objeto del tipo Recordset pra abrir la tabla que quieres manipular. Al abrir este último se le indica lo que quieres que te muestre, es decir, puedes indicarle los registros a los que quieres acceder y el campo por el que esté clasificado, etc. También a la hora de abrir el recordset le indicarás de que tipo lo quieres, etc.


'------------------------------------------------------------------------------
' Prueba de acceso a base de datos usando código ADO                (30/Ago/99)
'
' ©Guillermo 'guille' Som, 1999
'------------------------------------------------------------------------------
Option Explicit

' Para probar usando controles ligados al recordset
' Si se ligan los Text1 al recordset, asignar -1 a esta constante
' Si no se ligan los Text1, asignar 0 (o simplemente comentar la línea)
#Const TextLigados = -1


Private sBase As String             ' Nombre de la base de datos

' Objetos para acceder directamente a la base usando código
Private cnn As ADODB.Connection
' Si se declara con WithEvents, tenemos acceso a los mismos eventos que
' con el ADO DataControl
Private WithEvents rst As ADODB.Recordset

' Constantes para el movimiento dentro del recordset
Const cPrimero = 0
Const cAnterior = 1
Const cSiguiente = 2
Const cUltimo = 3


Private Sub cmdAdd_Click()
    ' Añadir un nuevo registro al recordset
    rst.AddNew

' Si no están ligados los controles al recordset
#If TextLigados = 0 Then
    Text1(0) = ""
    Text1(1) = ""
    Text1(2) = ""
    cmdUpdate_Click
#End If
    
    Text1(0).SetFocus
End Sub


Private Sub cmdDel_Click()
    ' Eliminar el registro actual
    rst.Delete
    
    On Local Error Resume Next
    
    ' Mover al siguiente registro
    rst.Move 1
    ' Si no puede moverse al siguiente, moverlo al anterior
    If Err Then
        rst.MovePrevious
    End If
    
    Err = 0
End Sub


Private Sub cmdMove_Click(Index As Integer)
    ' Moverse por el recordset
    
    On Local Error Resume Next
    
    Err = 0
    
    Select Case Index
    Case cPrimero   ' Primero
        rst.MoveFirst
    Case cAnterior  ' Anterior
        rst.MovePrevious
    Case cSiguiente ' Siguiente
        rst.MoveNext
    Case cUltimo    ' Último
        rst.MoveLast
    End Select
    
    If Err Then
        Debug.Print Err.Description
    End If
    
    Err = 0
End Sub


Private Sub cmdUpdate_Click()
    ' Esto no es necesario si los Text1 están ligados al recordset,
    ' cuando se cambie de registro, se actualizarán los datos
    ' De todas formas, se puede dejar para actualizar los datos cuando se quiera.
    '
    ' Cuando no se liguen los controles, después de introducir los datos,
    ' es necesario pulsar en este botón
    rst!Nombre = Text1(0)
    ' Como el nombre de este campo tiene signos especiales,
    ' hay que ponerlo entre corchetes
    rst![e-mail] = Text1(1)
    rst!Comentario = Text1(2)
End Sub


Private Sub Form_Load()
    ' Asignar el nombre de la base de datos
    ' (si la aplicación se ejecuta en el directorio raiz, quitar el \)
    sBase = App.Path & "\db2000.mdb"
    
    ' Crear los objetos
    Set cnn = New ADODB.Connection
    Set rst = New ADODB.Recordset
    
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & sBase
    rst.Open "SELECT * FROM Table1", cnn, adOpenDynamic, adLockOptimistic
    
' Si se quiere usar los Text1 ligados al Recordset
#If TextLigados Then
    ' Conectar manualmente los Text1 al recordset
    Dim i As Long
    ' Asignar el recordset al que estarán los datos conectados
    ' Esto funciona igual que si se conectaran a un DataControl,
    ' Por tanto no hay que preocuparse de actualizar el contenido, etc.
    For i = 0 To 2
        Set Text1(i).DataSource = rst
    Next
    ' Asiganr los nombres de los campos
    Text1(0).DataField = "Nombre"
    Text1(1).DataField = "e-mail"
    Text1(2).DataField = "Comentario"
    '
    ' Deshabilitar el botón de Actualizar
    cmdUpdate.Enabled = False
#End If

End Sub


Private Sub Form_Unload(Cancel As Integer)
    On Local Error Resume Next
    
    rst.Close
    cnn.Close
    
    Set rst = Nothing
    Set cnn = Nothing
    
    Err = 0
    
    Set fADO = Nothing
End Sub


Private Sub rst_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 parámetro
    'Text2.Text = "ID: " & pRecordset!ID
    ' También se puede usar:
    Text2.Text = "ID: " & rst!ID
    
' Si no están ligados los Text1
#If TextLigados = 0 Then
    ' Si no produce error actualizar los Text1
    ' (no es necesario si los Text1 están ligados al Recordset)
    If Err = 0 Then
        Text1(0) = rst!Nombre
        Text1(1) = rst![e-mail]
        Text1(2) = rst!Comentario
    End If
#End If

    Err = 0
End Sub

Pulsa este link para bajarte el código y una base de ejemplo. (ADO_sindatacontrol.zip 12.0 KB)


ir al índice