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 cómo hacer las cosas con DAO


Contenido: (los más 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 cómo 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 página ASPX usando ADO (02/Ene/04)
  6. Comprobar si un Recordset está vacío (18/Dic/03)
  7. Cómo manejar fechas en consultas, además 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 Básico entrega 41) (09/Jul/03)
  9. Más 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. Código 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 código de VB (29/Sep/01)
  17. Abrir una base de datos ADO con contraseña (05/Sep/01)
  18. Manipular imágenes usando ADO (con datacontrol) (11/Jul/01)
  19. Usar el ADO DataControl (Curso Básico 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á vacío (18/Dic/2003)

Como sabrás, se puede usar .BOF o .EOF para comprobar si está en los límites del recordset.
BOF devolverá True si el "puntero" está antes del primer registro, por otro lado EOF nos indicará si ese puntero está después del último registro, pero la recomendación para comprobar si realmente está vacío es que se cumplan esas dos condiciones: que tanto BOF como EOF sean True, por tanto podremos hacer una comprobación como esta:

    With rst
        If .EOF And .BOF Then
            lblData.Caption = "No hay ningún registro activo"
            .MoveFirst
        Else
            Text1(0) = .Fields("Au_ID")
            ' Por si el dato es nulo, añadirle una cadena vacia
            Text1(1) = .Fields("Author") & ""
            Text1(2) = .Fields("Year Born") & ""
        End If
    End With
 

Aunque también se podría comprobar que .BOF Or .EOF sean True, es decir, hacer algo como esto:
If .EOF Or .BOF Then
pero ya te digo que lo más correcto es usar AND, al menos eso es lo que he leído en la documentación de ADO.
Espero que esta pequeña aclaración te pueda ser de utilidad.

Nos vemos.
Guillermo


  Más 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 sólo 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 máximo en un grid o lista, si es necesario mostrar más, 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 contraseña), se hace prácticamente igual que en una base de datos sin password, lo único que hay que hacer es añadirle la cadena correspondiente al código mostrado anteriormente.

Este sería el código 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 sección te mostrará algunos consejos con los cuales podrás mejorar el acceso a los datos, el primero de ellos, con el que inauguramos esta sección es de Norman A. Armas, si crees que tienes alguno que se pueda añadir, 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

Código de ejemplo de compacta, crear base y crear tablas con ADO (29/Sep/2001)

Este es el link al código completo de los tres casos indicados:

Cómo crear una base de datos con ADO,
Cómo crear tablas y
Cómo compactar una base de datos.

En la página se muestra el código 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 sólo se puede usar con bases de datos Microsoft JET

Aquí tienes el código 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 más información: 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 Cómo crear una base de datos con ADO).
El código, casi simplificado, sería 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 catálogo
cat.ActiveConnection = _
        "Provider=" & cboProvider.Text & ";" & _
        "Data Source=" & txtNombreBase.Text & ";"
'
' Crear la nueva tabla
With tbl
    .Name = txtNombreTabla.Text
    ' Crear los campos y añadirlos a la tabla.
    ' Esto hay que hacerlo antes de añadir la tabla a la colección de tablas
    .Columns.Append "ID", adInteger
    ' Dependiendo del tipo de proveedor, los datos de cadena serán de un tipo u otro
    If cboProvider.Text = "Microsoft.Jet.OLEDB.3.51" Then
        ' Para Access 97
        .Columns.Append "Nombre", adVarChar, 50         ' Una cadena de 50 caracteres
        .Columns.Append "email", adVarChar, 100
        .Columns.Append "Telefono", adVarChar
        .Columns.Append "Observaciones", adLongVarChar  ' Una cadena larga, (Memo)
    Else
        ' Para Access 2000
        .Columns.Append "Nombre", adVarWChar, 50        ' Una cadena 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       ' Permite contener nulos
    .Columns("email").Attributes = adColNullable
    .Columns("Telefono").Attributes = adColNullable
    .Columns("Observaciones").Attributes = adColNullable
End With
'
' Añadir 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 añaden a la tabla por orden alfabético, independientemente del orden en el que se han añadido.
Nota del 27/Dic/02:
Esto sólo 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 cómo hacer que no se clasifiquen, (en JET 3.51), por favor que me lo diga, gracias

Para más información: Defining and Retrieving a Database’s Schema (MDAC Technical Articles)


Crear una base de datos con ADO, usando código 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 versión 2.6 de ADO, por tanto puede ser que, si la versión que tienes instalada es otra, en lugar de 2.6 aparezca otra numeración.
ADOX sólo está disponible a partir de la versión 2.1 de ADO.


Veamos, de forma simple, cómo 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 más información: Defining and Retrieving a Database’s Schema (MDAC Technical Articles)


Abrir una base de datos ADO con contraseña (05/Sep/2001)

Para abrir una base de datos ADO con contraseña, podemos hacerlo al crear la conexión.
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 código 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.
 


 

ir al índice