Bases de datosAPI'S PARA LAS BASES DE DATOS
(43 Rutinas disponibles)
Abrir una base de datos con seguridad en ADO
A través de este ejemplo mostraremos como abrir mediante ADO una base de datos 
de Access protegida con contraseña.
Dim Cn As New ADODB.Connection
Dim strCn As String
strCn = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Data Source=nwind.MDB;" & _
"Jet OLEDB:System database=c:\winnt\system32\System.MDW"
Cn.Open ConnectionString:=strCn, _
UserID:="Admin", Password:="ambsoftware"
Acceso con y sin claves a todas las bases de datos
A continuación se muestran varias rutinas todas ellas encaminadas a acceder a 
todas las bases de datos, estén o no protegidas con contraseña.
Abrir una Tabla de Fox o dBase o... desde código 
Menu Proyecto->Referencias Seleccionar DAO 3.51 

Dim dbs As DAO.Database 
Dim rs As DAO.Recordset 

Set dbs = OpenDatabase("C:\Via\", True, False, "FoxPro 2.5") 
Set rs = dbs.OpenRecordset("Libros") 

Abrir Base de Datos de Access 97 Sin PassWord para asociarla con un Control Data 

Insertar un Control DATA 

Desde Código 

Data1.DatabaseName = "c:\Via\ACCESS97.MDB" 
Data1.RecordSource = "Tabla" 
Data1.Refresh 

ó 

En la Ventana de Propiedades del Objeto 

DatabaseName = "c:\Via\ACCESS97.MDB" 
RecordSource = "Tabla" 

Abrir Base de Datos de Access 97 con PassWord para asociarla con un Control Data 

Insertar un Control DATA 

Desde Código 

Dim cPass as String 
Dim Clave as String 
Clave = "Password" 
cPass = ";PWD=" & Clave 

Data1.DatabaseName = "c:\Via\ACCESS97.MDB" 

Data1.RecordSource = "Tabla" 

Data1.Connect = cPass 

Data1.Refresh 

Abrir Base de Datos de Access 97 SIN PassWord desde Código y Sin Data Control 
Menu Proyecto->Referencias Seleccionar DAO 3.51 

Dim dbs As DAO.Database 
Dim rs As DAO.Recordset 

Set dbs = OpenDatabase("C:\Via\ACCESS97.MDB", True, False,) 
Set rs = dbs.OpenRecordset("Tabla") 

Abrir Base de Datos de Access 97 CON PassWord desde Código y Sin Data Control 
Menu Proyecto->Referencias Seleccionar DAO 3.51 

Dim dbs As DAO.Database 
Dim rs As DAO.Recordset 
Dim cPass as String 
Dim Clave as String 

Clave = "Password" 
cPass = ";PWD=" & Clave 

Set dbs = OpenDatabase("C:\Via\ACCESS97.MDB", True, False, cPass) 'no se deben 
omitir el segundo ni el tercer parámetro para que entre el password 
Set rs = dbs.OpenRecordset("Tabla") 

Abrir Base de Datos de Access 2000 Sin PassWord para asociarla con un Control 
Data 
Insertar un Control DATA y no especificarle nada en la ventana de propiedades 
si se desea ver los datos en una grilla, insertar un "bound dbgrid" y asociarlo 
al Control Data 

Desde Código 

Menu Proyecto->Referencias Seleccionar DAO 3.6 

en algun procedimiento... 

Dim dbsdao36 As DAO.Database 
Dim rs As DAO.Recordset 

Set dbsdao36 = OpenDatabase("Base de Datos.mdb", False, False) 
Set rs = dbsdao36.OpenRecordset("Tabla") 
Set Data1.Recordset = rs 

Abrir Base de Datos de Access 2000 CON PassWord para asociarla con un Control 
Data 
Insertar un Control DATA y no especificarle nada en la ventana de propiedades 
si se desea ver los datos en una grilla, insertar un "bound dbgrid" y asociarlo 
al Control Data 

Desde Código 

Menu Proyecto->Referencias Seleccionar DAO 3.6 

en algun procedimiento... 

Dim dbsdao36 As DAO.Database 
Dim rs As DAO.Recordset 
Dim cPas As String 

cPas = ";pwd=password" 

Set dbsdao36 = OpenDatabase("Base de Datos.mdb", False, False, cPas) 
Set rs = dbsdao36.OpenRecordset("Tabla") 
Set Data1.Recordset = rs 
Abrir Base de Datos de Access 2000 SIN PassWord desde Código y Sin Data Control 

Menu Proyecto->Referencias Seleccionar DAO 3.6 

Dim dbsdao36 As DAO.Database 
Dim rsdao36 As DAO.Recordset 

Set dbsdao36 = OpenDatabase("C:\Via\ACCESS2000.MDB", True, False,) 
Set rsdao36 = dbs.OpenRecordset("Tabla") 

Abrir Base de Datos de Access 97 CON PassWord desde Código y Sin Data Control 
Menu Proyecto->Referencias Seleccionar DAO 3.6 

Dim dbsDao36 As DAO.Database 
Dim rsDao36 As DAO.Recordset 
Dim cPass as String 
Dim Clave as String 

Clave = "Password" 
cPass = ";PWD=" & Clave 

Set dbsDao36 = OpenDatabase("C:\Via\ACCESS2000.MDB", True, False, cPass) 'no se 
deben omitir el segundo ni el tercer Parámetro para que entre el password 
Set rsDao36 = dbs.OpenRecordset("Tabla") 

Abrir Base de Datos de Access 97 Sin PassWord para asociarla con un Control ADO 
Insertar un Control ADO 

Desde Código 

Dim Clave as String 
Clave = "" 

Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" _ 
& "Data Source=" & "ACCESS97.MDB" & ";" _ 
& "Persist Security Info=False;" _ 
& "Jet OLEDB:Database Password=" & Clave 'jet 3.51 para access 97 

Adodc1.Mode = adModeRead ' elejir el modo 
Adodc1.RecordSource = "Tabla" 
Adodc1.Refresh 

Abrir Base de Datos de Access 97 con PassWord para asociarla con un Control ADO 
Insertar un Control ADO 

Desde Código 

Dim Clave as String 
Clave = "password" 

Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" _ 
& "Data Source=" & "ACCESS97.MDB" & ";" _ 
& "Persist Security Info=False;" _ 
& "Jet OLEDB:Database Password=" & Clave 'jet 3.51 para access 97 

Adodc1.Mode = adModeRead ' elejir el modo 
Adodc1.RecordSource = "Tabla" 
Adodc1.Refresh 

Abrir Base de Datos de Access 2000 Sin PassWord para asociarla con un Control 
ADO 
Insertar un Control ADO 

Desde Código 

Dim Clave as String 
Clave = "" 

Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ 
& "Data Source=" & "ACCESS97.MDB" & ";" _ 
& "Persist Security Info=False;" _ 
& "Jet OLEDB:Database Password=" & Clave 'jet 4.0 para access 2000 

Adodc1.Mode = adModeRead ' elejir el modo 
Adodc1.RecordSource = "Tabla" 
Adodc1.Refresh 

Abrir Base de Datos de Access 2000 Sin PassWord para asociarla con un Control 
ADO 
Insertar un Control ADO 

Desde Código 

Dim Clave as String 
Clave = "password" 

Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ 
& "Data Source=" & "ACCESS97.MDB" & ";" _ 
& "Persist Security Info=False;" _ 
& "Jet OLEDB:Database Password=" & Clave 'jet 4.0 para access 2000 

Adodc1.Mode = adModeRead ' elejir el modo 
Adodc1.RecordSource = "Tabla" 
Adodc1.Refresh 

Añadir un base de datos a un servidor SQL
Mediante este ejemplo, podremos añadir una base de datos a un servidor SQL.
 PURPOSE: Creates a Database for an SQL Server
 PARAMETERS: ServerName: Name of SQLServer
 DatabaseName: Name of Database to Delete
 UserID: LoginID for SQL Server. 
 User must have sysadmin or
 dbcreator privileges
 Password: Password for SQL Server
 DatabaseFileName: FileName for Database
 AddTables: List of Tables to attach to the db. 
 If you don't want
 to add tables, pass "" as this parameter
 RETURNS: True if successful, false otherwise
 REQUIRES: Reference to Microsoft SQLDMO object library

 EXAMPLE: AddSQLDatabase "MySQLServer", "NewDB", "sa", "myPassword", _ 
"C:\Program Files\Microsoft SQL Server\MSSQL\Data\NewDB.mdf", "Newtable1", 
"NewTable2"

NOTES: Tested with SQL 2000. Should work with SQL 7.0

Public Function AddSQLDatabase(ByVal ServerName As String, ByVal DatabaseName As 
String, ByVal UserID As String, ByVal Password As String, ByVal DatabaseFileName 
As String, ParamArray AddTables() As Variant) As Boolean 
    Dim oSQLServer As New SQLDMO.SQLServer
    Dim oDatabase As New SQLDMO.Database
    Dim oDBFile As New SQLDMO.DBFile
    Dim oApp As New SQLDMO.Application
    Dim oFileGroup As SQLDMO.FileGroup
    Dim oTable As SQLDMO.Table
    Dim lCtr As Long
    Dim oColumn As SQLDMO.Column
    On Error GoTo ErrorHandler
    With oSQLServer
        .Connect ServerName, UserID, Password
        .Database.Name = DatabaseName
        ' This uses default properties of the dbfile. If you want to change 
these, set optional properties, such as MaximumSize
        .oDBFile.Name = DatabaseName
        .oDBFile.PhysicalName = DatabaseFileName
        .Set oFileGroup = oDatabase.FileGroups.Item("PRIMARY")
        .oFileGroup.DBFiles.Add oDBFile
        .Databases.Add oDatabase
            For lCtr = 0 To UBound(AddTables)
                If CStr(AddTables(lCtr)) <> "" Then
                    Set oTable = New SQLDMO.Table
                    oTable.Name = AddTables(lCtr)
                    'You must add at least one colummn.
                    'I'm adding a default identity col named
                    'id. If you want to control this,
                    'add more parameters to the function
                    Set oColumn = New SQLDMO.Column
                    oColumn.Datatype = "int"
                    oColumn.Identity = True
                    oColumn.Name = "ID"
                    oTable.Columns.Add oColumn
                    oDatabase.Tables.Add oTable
                End If
            Next
    End With
    AddSQLDatabase = True
    ErrorHandler:
    Set oSQLServer = Nothing
    Set oDatabase = Nothing
    Set oDBFile = Nothing
    Set oFileGroup = Nothing
End Function
Añadir una nueva tabla a una base de datos
Desde este código podremos crear una nueva tabla en una base de datos existente.
Public Function CreateTable(DatabaseName As String, ByVal TableName As String) 
As Boolean
    'DataBaseName es el path de su base de datos
    'TableName es el nombre de la tabla que quiere crear
    'Returns True si se crea o Falso en otro caso
    On Error GoTo errorhandler
    Dim oDB As DAO.Database
    Dim td As DAO.TableDef
    Dim f As DAO.Field
    Set oDB = Workspaces(0).OpenDatabase(DatabaseName)
    On Error GoTo errorhandler
    If TableExists(oDB, TableName) Then GoTo errorhandler
    'Create table object
    Set td = oDB.CreateTableDef(TableName)
    'Debemos añadir un campo
    Set f = td.CreateField("ID", dbLong)
    f.Attributes = dbAutoIncrField
    td.Fields.Append f
    oDB.TableDefs.Append td
    oDB.Close
    CreateTable = True
    Exit Function
    errorhandler:
    If Not oDB Is Nothing Then oDB.Close
    Set td = Nothing
    Set f = Nothing
End Function

Private Function TableExists(oDB As Database, TableName As String) As Boolean
    Dim td As DAO.TableDef
    On Error Resume Next
    Set td = oDB.TableDefs(TableName)
    TableExists = Err.Number = 0
End Function
Añadir una nueva tabla a una base de datos(II)
Otra forma de añadir una nueva tabla en una base de datos de Microsoft Access.
Function Crea_Tabla(Conexion As ADODB.Connection, NombreDB As String, 
NombreTabla As String) As Boolean
    Dim cat As New ADOX.Catalog
    Dim tdfActual As New ADOX.Table
    On Error GoTo ErrorCrea_Tabla
    Crea_Tabla = False
    If Trim$(NombreTabla) <> "" Then
        ' Abre el catálogo.
        Set cat.ActiveConnection = Conexion
        'Vemos si existe la tabla, si existe en tdfActual tengo el enlace de la 
tabla si no lo tengo que cear
        If Not ExisteTabla(cat, NombreTabla, tdfActual) Then
            'Creo la tabla si no existe previamente
            tdfActual.Name = NombreTabla
            cat.Tables.Append tdfActual
        End If
    End If
    Crea_Tabla = True
    Exit Function
    ErrorCrea_Tabla:
    MuestraError, "Crea_Tabla", Err, Error
End Function
Apertura mediante un control Data de una Base de Datos con Password

Este ejemplo nos muestra como abrir una base de datos desde Visual Basic 
protegida con contraseña.
Vamos a suponer que la base de datos se llama Bd1.mdb.
Genere una contraseña para la nueva base de datos creada.
Para este ejemplo, he creado la contraseña "Amb".
Tenga cuidado con las mayúsculas y minúsculas, ya que Access hace distinción 
entre ellas.

Se ha dispuesto para este ejemplo las siguientes propiedades de tabla:

Nombre de la tabla: Tabla1

Nombre del Campo  Tipo de datos  Tamaño:
    Nombre                   Carácter         50
    Apellido1                 Carácter         50
    Apellido2                 Carácter         50
    Edad                       Numérico        Entero

Ejemplo:

Añada 4 cajas de texto y un control Data al formulario, el cual por defecto 
llevará el nombre de Data1.
Cambie la propiedad DataSource de todas las cajas de texto a Data1.
A continuación escriba el siguiente código.

Private Sub Form_Load()
    Data1.DatabaseName = "C:\Temp\Bd1.mdb"
    Data1.RecordSource = "Tabla1"
    Data1.Connect = ";pwd=Amb" 
    Text1.DataField = "Nombre"
    Text2.DataField = "Apellido1"
    Text3.DataField = "Apellido1"
    Text4.DataField = "Edad"
End Sub 
Cambiar la localización de una BD de un DataEnvironment en tiempo de ejecución 
El siguiente ejemplo nos muestra cómo podemos cambiar la localización de una 
base de datos de un DataEnvironment en tiempo de ejecución. 
1. Obtenga la cadena de conexión que dió en tiempo de diseño: 

Debug.Print DE.Connections(1).ConnectionString

(DE es el nombre del DataEnvironment en el ejemplo),

2. En el inicio de su programa escriba algo similar al siguiente corte de 
código, preservando su cadena de conexión (modifica solo la localización de la 
base de datos, en este caso yo use la variable ArchivoBaseDeDatos)

Private Sub Form_Initialize()
    Dim s As String
    s = "Provider=MSDataShape.1;" & "Persist Security Info=False;" & "Data 
Source=" & ArchivoBaseDeDatos & ";" & "Data Provider=MICROSOFT.JET.OLEDB.4.0"
    DE.Connections(1).ConnectionString = s
End Sub 
Cargar los datos de un Recordset en un control MSFlexGrid 
A través de este ejemplo podremos cargar los datos de un Recordset en un control 
MsFlexGrid. 
Public Sub CargarGRID(Grid As MSFlexGrid, RST As Recordset)
    Dim NroColumnas, ActColumna As Long
    NroColumnas = Grid.Cols - 1
    Grid.Rows = 1
    Do While Not RST.EOF
        Grid.Rows = Grid.Rows + 1
        Grid.Row = Grid.Rows - 1
        For ActColumna = 0 To NroColumnas
            Grid.Col = ActColumna
            Grid.Text = RST.Fields(ActColumna)
        Next ActColumna
        RST.MoveNext
    Loop
End Sub

'Declaramos la variable de base de datos y recordset
Dim MiBD as Database
Dim MiRecordset as Recordset
Dim PathBaseDeDatos,NombreRecordset as String

'Abrimos la base de datos y establecemos el valor del recordset
PathBaseDeDatos=App.Path & "\MIBD.MDB"
'NombreRecordset puede ser el nombre de una tabla de la base de datos
'o bien una consulta SQL, por ejemplo:
' NombreRecordset="SELECT * FROM Alumnos;" 
NombreRecordset="Alumnos" 
Set MiBD=OpenDatabase(PathDeLaBaseDeDatos) 
Set MiRecordset=MiBD.OpenRecordset(NombreRecordset)

'Y ahora cargamos los datos ...
CargarGrid MSFlexGrid1, MiRecordset 
Cómo cerrar conexiones implícitas 
El ejemplo siguiente nos muestra cómo podemos con una sencilla rutina cerrar 
conexiones implícitas resultantes de abrir objetos recordsets independientes. 
En Visual Basic 6.0 es posible abrir objetos recordsets independientes sin 
asociarlos a ninguna conexión. Esto es posible gracias al carácter no jerárquico 
del modelo de programación de ADO. No obstante, cada vez que se abre un 
recordset de este tipo, se crea una conexión implícita. Esto supone que si el 
objeto recordset se cierra y se abre varias veces en el código del proyecto, se 
crearán tantas nuevas conexiones como veces se haya abierto el objeto recordset. 
Estas conexiones permanecerán abiertas hasta cerrar el proyecto.

Para impedir esto, y conseguir cerrar la conexión implícita a cada recordset 
independiente, se puede utilizar la siguiente técnica, que asocia a una variable 
Connection la conexión implícita a un recordset independiente, cerrando dicha 
conexión antes de reabrir el recordset. 

Dim rst1 As New ADODB.Recordset
Dim cnn As New ADODB.Connection

Private Sub Command1_Click()
    rst1.Open "authors", "Provider = sqloledb;Data Source=myServer;" & "Initial 
Catalog=pubs;User Id=sa;Password=;", adOpenStatic, adLockReadOnly
End Sub

Private Sub Command2_Click()
    Set cnn = rst1.ActiveConnection
    rst1.Close
    cnn.Close
    rst1.Open "publishers","Provider = sqloledb;Data Source=myServer;" & 
"Initial Catalog=pubs;User Id=sa;Password=;", adOpenStatic, adLockOptimistic
End Sub 
Compacta una base de datos de Access 
Mediante este código lograremos compactar una base de datos de Microsoft Access. 

Public Function compactDB(ByVal SOUR_path As String, ByVal DEST_path As String) 
As Boolean
    On Error GoTo Err_compact
    Private JRO As New JRO.JetEngine
    Private DB_sour As String, DB_dest As String 
    DoEvents
    DB_sour = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SOUR_path
DB_dest = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DEST_path & " ;Jet 
OLEDB:Engine Type=5"
    JRO.CompactDatabase DB_sour, DB_dest
    compactDB = True
    Exit Function
    Err_compact:
    compactDB = False
    MsgBox Err.Description, vbExclamation
End Function 
Compacta una base de datos de Access(II) 
Este es otro ejemplo de cómo compactar una base de datos de Access desde Visual 
Basic. 
Function Compactar(Origen As String, Destino As String) As Boolean 
    'Hay que introducir la referencia Microsoft Jet and Replication 
    Dim Jet As New JRO.JetEngine
    Dim BDOrigen As String
    Dim BDDestino As String
    On Error GoTo ErrorCompactar
    Compactar = False
    'Para conectar con BD Access 2000 usar el proveedor Microsoft.Jet.OLEDB.4.0. 

    'Para conectar con Access 97 usar Microsoft.Jet.OLEDB.3.51
    BDOrigen = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Origen
    BDDestino = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Destino & " 
;Jet OLEDB:Engine Type=5"
    Jet.CompactDatabase BDOrigen, BDDestino
    Compactar = True
    Exit Function
    ErrorCompactar:
    MuestraError , "Compactar", Err, Error
End Function 
Comprobar la existencia de un campo en una BD 
El ejemplo siguiente nos muestra cómo podemos comprobar la existencia de un 
campo determinado dentro de una base de datos de Access. 
Function ExisteCampo(cat As ADOX.Catalog, tdfActual As ADOX.Table, NombreCampo 
As String) As Boolean 
    Dim fldBucle As New ADOX.Column 
    On Error GoTo ErrorExisteCampo 
    ExisteCampo = False 
    For Each fldBucle In tdfActual.Columns 
        If fldBucle.Name = NombreCampo Then 
            ExisteCampo = True 
            Exit For 
        End If 
    Next fldBucle 
    Exit Function 
    ErrorExisteCampo: 
    MuestraError "ExisteCampo", Err, Error 
End Function 
Conectarnos a una base de datos de Internet 
Mediante el ejemplo siguiente podremos conectarnos a una base de datos que esté 
en Internet. 
server = "200.121.121.2" 'Tu servidor
source = "c:\temp\data1.mdb" 'El path de la base de datos
Adodc1.ConnectionString = "Provider=MS Remote;" & "Remote Server=" & server & 
";" & "Remote Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & source & ";" 
& "admin"

Consulta basica a una base de datos 

Este ejemplo consiste en una búsqueda mediante DAO en una base de datos.

Para este ejemplo, hemos creado una base de datos "Ciudad.mdb" con una tabla 
"Distritos" con dos campos "Ciudad" y "CodPostal".

Ejemplo:

Inserta el siguiente código: 

Private Sub Form_Load()
    Dim MiBase As Database
    Dim MiConsulta As Recordset
    Dim SQL As String
    Set MiBase = OpenDataBase("C:\Ciudad.Mdb")
    SQL = "Select * From Distritos Where CodPostal=28000"
    Set MiConsulta = MiBase.OpenRecordset(SQL)
    MsgBox "Ciudad: " & MiConsulta.Fields(0) & vbCrLf & "Código Postal: " & 
MiConsulta.Fields(1)
End Sub
Copiar tablas entre bases de datos
Mediante la siguiente rutina podremos copiar todas las tablas de una base de 
datos origen en una destino. Si las tablas ya existían en la base de datos de 
destino se eliminan y se vuelven a crear con la misma estructura que tuvieran en 
origen.
Las tablas de la base destino que no se encuentren en origen no se modifican.
Si el parámetro boCopiarDatos es true (valor por defecto) además de la 
estructura se copian los datos de las tablas.

Sub CopiaTablas(strOrigen As String, strDestino As String, Optional 
boCopiarDatos As Boolean = True)
    Dim dbOrigen As Database, dbDestino As Database
    Dim tdOrigen As TableDef, tdDestino As TableDef
    Dim fdOrigen As Field, fdDestino As Field
    Dim idOrigen As Index, idDestino As Index
    Dim prOrigen As Property, prDestino As Properties
    Dim i As Long
    Screen.MousePointer = vbHourglass
    'abrir origen y destino
    Set dbOrigen = OpenDatabase(strOrigen, False)
    Set dbDestino = OpenDatabase(strDestino, True)
    'hay propiedades que no se pueden copiar como el value de los campos, etc
    On Error Resume Next
    'para cada tabla de origen
    For Each tdOrigen In dbOrigen.TableDefs
        If (tdOrigen.Attributes And (dbSystemObject Or dbHiddenObject)) = 0 Then
            'si la tabla no es del sistema
            'mirar si existe la tabla en destino
            For Each tdDestino In dbDestino.TableDefs
                If tdDestino.Name = tdOrigen.Name Then
                    'si existe la borro
                    dbDestino.TableDefs.Delete tdDestino.Name
                    Exit For
                End If
            Next
            'creo la tabla en el destino
            Set tdDestino = dbDestino.CreateTableDef(tdOrigen.Name, 
tdOrigen.Attributes,             tdOrigen.SourceTableName, tdOrigen.Connect)
            'le añado los campos
            For Each fdOrigen In tdOrigen.Fields
                Set fdDestino = tdDestino.CreateField(fdOrigen.Name, 
fdOrigen.Type, fdOrigen.Size)
                'copio las propiedades del campo
                For Each prOrigen In fdOrigen.Properties
                    fdDestino.Properties(prOrigen.Name) = 
fdOrigen.Properties(prOrigen.Name)
                Next
                tdDestino.Fields.Append fdDestino
            Next
            'le añado los indices
            For Each idOrigen In tdOrigen.Indexes
                Set idDestino = tdDestino.CreateIndex(idOrigen.Name)
                'añado los campos al índice
                For Each fdOrigen In idOrigen.Fields
                    Set fdDestino = idDestino.CreateField(fdOrigen.Name)
                    idDestino.Fields.Append fdDestino
                Next
                'copio las propiedades del índice
                For Each prOrigen In idDestino.Properties
                    idDestino.Properties(prOrigen.Name) = 
idOrigen.Properties(prOrigen.Name)
                Next
                tdDestino.Indexes.Append idDestino
            Next
            dbDestino.TableDefs.Append tdDestino
            'copio los datos de la tabla, si se solicitó
            If boCopiarDatos Then dbOrigen.Execute ("INSERT INTO " + 
tdDestino.Name + " IN '" + strDestino + "' SELECT * FROM " + tdDestino.Name)
            End If
        Next
    'cerrar origen y destino
    dbOrigen.Close
    dbDestino.Close
    Set dbOrigen = Nothing: Set dbDestino = Nothing
    Set tdOrigen = Nothing: Set tdDestino = Nothing
    Set fdOrigen = Nothing: Set fdDestino = Nothing
    Set idOrigen = Nothing: Set idDestino = Nothing
    Set prOrigen = Nothing: Set prDestino = Nothing
    Screen.MousePointer = vbDefault
End Sub
Crear un índice en una propiedad personalizada
El siguiente artículo nos muestra cómo utilizar ActiveX Data Objects (ADO) para 
crear una propiedad personalizada que está indizada.
La información de este artículo se refiere a:
Microsoft Exchange 2000 Server
Collaboration Data Objects 6.0 para Exchange 2000
Microsoft Visual Basic Enterprise Edition para Windows 6.0
ActiveX Data Objects (ADO) 2.5, 2.6
ActiveX Data Objects (ADO) 2.5, 2.6

En este ejemplo de Visual Basic se muestran las siguientes tareas: 
Establece la definición de la propiedad 
urn:schemas-microsoft-com:exch-data:isindexed como TRUE. (Tenga en cuenta que 
esta configuración por sí sola no crea el índice.) El código que sigue al 
comentario "Create the property definition in the schema folder for title" 
indica cómo hacerlo. 
Define una clase de contenido que incluye la propiedad personalizada. El código 
que aparece bajo el comentario "Create the content class recipe" indica cómo 
hacerlo. 
Incluye dicha clase de contenido en la clase de contenido esperada de una 
carpeta. Esta carpeta suele ser la carpeta de aplicación que contiene los 
elementos en los que se encuentran los datos. El código que sigue al comentario 
"Setting the expected content class for the application folder (myapp)" indica 
cómo hacerlo. 
Utiliza CREATE INDEX para crear índices en todas las propiedades definidas en la 
clase de contenido esperada de la carpeta. (Esta función indiza todos los 
elementos de una carpeta, en lugar de indizarlos individualmente.) El código que 
sigue al comentario "Create indexes on all properties that are defined in the 
folder's expected content class" indica cómo hacerlo. 
Para ejecutar este ejemplo de código, siga estos pasos: 
Cree una carpeta llamada Myapp en el subárbol de carpetas públicas 
predeterminado y una subcarpeta de Myapp llamada Schema. 
Establezca una referencia a la biblioteca de tipos Active DS y a la biblioteca 
Microsoft ActiveX Data Objects 2.5. 
Copie el siguiente código a un módulo de Visual Basic: 
Const adModeReadWrite = 3
Const adFailIfNotExists = -1
Const adCreateNonCollection = 0

Private Sub Main()
    Dim Conn
    Dim Info
    Dim InfoNT
    Dim sFolderURL
    Dim sSchemaFolderURL
    Set Info = CreateObject("ADSystemInfo")
    Set InfoNT = CreateObject("WinNTSystemInfo")
    ' Path of Virtual Root.
    sVrootURL = "http://" & InfoNT.ComputerName & "." & Info.DomainDNSName & 
"/public"
    ' Path to the application folder.
    sFolderURL = sVrootURL & "/myapp"
    ' Path to the schema folder.
    sSchemaFolderURL = sVrootURL & "/myapp/schema"
    'This example creates an index on custom properties.
    ' The following property definitions are created:
    ' urn:schemas-domain-tld:title
    ' urn:schemas-domain-tld:ingredients
    ' These properties are used in the ' 
urn:schemas-domain-tld:content-classes:recipe content class.
    ' A URN scheme is used for the namespace: "urn:schemas-domain-tld:"
    ' where "tld" refers to "top-level domain".
    Set Conn = CreateObject("ADODB.Connection")
    Conn.Provider = "ExOLEDB.DataSource"
    Conn.Open sSchemaFolderURL
    Dim Rec
    Set Rec = CreateObject("ADODB.Record")
    ' Create the property definition in the schema folder for title.
    ' This property will be the indexed property; note that  
urn:schemas-microsoft-com:exch-data:isindexed is set to True.
    Rec.Open sSchemaFolderURL & "/title", Conn, adModeReadWrite, 
adCreateNonCollection
    Set Flds = Rec.Fields
    With Flds
        .Item("DAV:contentclass") = "urn:content-classes:propertydef"
        .Item("urn:schemas-microsoft-com:xml-data#name") = 
"urn:schemas-domain-tld:title"
        .Item("urn:schemas-microsoft-com:datatypes#type") = "string"
        .Item("urn:schemas-microsoft-com:exch-data:ismultivalued") = False
        .Item("urn:schemas-microsoft-com:exch-data:isindexed") = True
        .Item("urn:schemas-microsoft-com:exch-data:isreadonly") = False
        .Update
    End With
    Rec.Close
    ' Create the property definition in the schema folder for ingredients.
    Rec.Open sSchemaFolderURL & "/ingredients", Conn, adModeReadWrite, 
adCreateNonCollection
    Set Flds = Rec.Fields
    With Flds
        .Item("DAV:contentclass") = "urn:content-classes:propertydef"
        .Item("urn:schemas-microsoft-com:xml-data#name") = 
"urn:schemas-domain-tld:ingredients"
        .Item("urn:schemas-microsoft-com:datatypes#type") = "string"
        .Item("urn:schemas-microsoft-com:exch-data:ismultivalued") = True
        .Item("urn:schemas-microsoft-com:exch-data:isindexed") = False
        .Item("urn:schemas-microsoft-com:exch-data:isreadonly") = False
        .Update
    End With
    Rec.Close
    ' Create the content class recipe.
    Rec.Open sSchemaFolderURL & "/ccdef-recipe", Conn, adModeReadWrite, 
adCreateNonCollection
    Set Flds = Rec.Fields
    With Flds
        ' Name the content class.
        .Item("urn:schemas-microsoft-com:xml-data#name").Value = 
"urn:schemas-domain-tld:content-classes:recipe"
        ' The content class of the definition item.
        .Item("DAV:contentclass") = "urn:content-classes:contentclassdef"
        ' The content classes it extends (inherits from).
        .Item("urn:schemas-microsoft-com:xml-data#extends").Value = 
Array("urn:content-classes:item")
        ' The additional properties that belong to this content class.
        .Item("urn:schemas-microsoft-com:xml-data#element").Value = 
Array("urn:schemas-domain-tld:title",     "urn:schemas-domain-tld:ingredients")
        .Update
    End With
    Rec.Close
    Conn.Close
    ' Set properties on the application folder.
    Conn.Open sFolderURL
    Rec.Open sFolderURL, Conn, adModeReadWrite
    Set Flds = Rec.Fields
    With Flds
        .Item("urn:schemas-microsoft-com:exch-data:schema-collection-ref") = 
sSchemaFolderURL
        'Setting the expected content class for the application folder (myapp)
        .Item("urn:schemas-microsoft-com:exch-data:expected-content-class") = _
Array("urn:schemas-domain-tld:content-classes:recipe")
        .Update
    End With
    Rec.Close
    ' Set baseschema property on the schema folder.
    Rec.Open sSchemaFolderURL, Conn, adModeReadWrite
    Set Flds = Rec.Fields
    With Flds
        .Item("urn:schemas-microsoft-com:exch-data:baseschema") = 
Array(CStr("/public/non_ipm_subtree/Schema"))
        .Update
    End With
    Rec.Close
    ' Create indexes on all properties that are defined in the folder's expected 
content class.
    Conn.Execute "CREATE INDEX * ON """ & sFolderURL & """ (*)"
    ' Create an item in the application folder using these custom properties.
    Rec.Open sFolderURL & "/test1.txt", Conn, adModeReadWrite, 
adCreateNonCollection Or adCreateOverwrite
    Set Flds = Rec.Fields
    With Flds
        .Item("urn:schemas-domain-tld:title").Value = "Title of Recipe"
        .Item("urn:schemas-domain-tld:ingredients").Value = Array("ingredient1", 
"ingredient2", "ingredient3")
        .Item("DAV:contentclass") = 
"urn:schemas-domain-tld:content-classes:recipe"
        .Update
    End With
    Rec.Close
    Conn.Close
End Sub
Crear un nuevo campo en una bd de Access
Mediante la siguiente función podremos crear un nuevo campo en una base de datos 
de Access.
Function Crea_Campo(cat As ADOX.Catalog, tdfActual As ADOX.Table, NombreCampo As 
String, Tamaño As String, Nulo As String, TipoDato As String) As Boolean
    Dim Col As New ADOX.Column
    Dim Punto As Long
    Dim Entero As Long
    Dim Real As Long
    On Error GoTo ErrorCrea_Campo
    Crea_Campo = False
    'PARENTCATALOG para tener acceso a una propiedad específica de un proveedor
    Set Col.ParentCatalog = cat
    'Nombre de la columna
    Col.Name = NombreCampo
    'Segun el tipo de dato creamos el campo
    Select Case TipoDato
        Case "Entero":
        Select Case Acceso
            Case "ACCESS"
                If Col.Type <> adSmallInt Then Col.Type = adSmallInt
                Col.DefinedSize = Val(Tamaño)
            Case "SQL"
                If Col.Type <> adSmallInt Then Col.Type = adSmallInt
                Col.DefinedSize = Val(Tamaño)
        End Select
        Case "EnteroLargo":
            Select Case Acceso
                Case "ACCESS"
                    If Col.Type <> adInteger Then Col.Type = adInteger
                    Col.DefinedSize = Val(Tamaño)
                Case "SQL"
                    If Col.Type <> adInteger Then Col.Type = adInteger
                    Col.DefinedSize = Val(Tamaño)
            End Select
        Case "Texto":
            If Col.Type <> adWChar Then Col.Type = adWChar
            Col.DefinedSize = Val(Tamaño)
        Case "Memo":
            Col.Type = adLongVarWChar
        Case "Date":
            Select Case Acceso
                Case "ACCESS"
                    If Col.Type <> adDate Then Col.Type = adDate
                Case "SQL"
                    If Col.Type <> adDBTimeStamp Then Col.Type = adDBTimeStamp
            End Select
        Case "Flotante":
            Select Case Acceso
                Case "ACCESS"
                    If Col.Type <> adDouble Then Col.Type = adDouble
                Case "SQL"
                    Punto = InStr(1, Tamaño, ".")
                    Entero = Mid(Tamaño, 1, Punto - 1)
                    Real = Mid(Tamaño, Punto + 1, Len(Tamaño))
                    Col.Type = adNumeric
                    Col.NumericScale = CLng(Real)
                    Col.Precision = CLng(Entero)
                    Col.Properties("Default") = "0"
            End Select
        End Select
    If Nulo = "NULL" Then
        If Acceso = "ACCESS" Then
            Col.Properties("Jet OLEDB:Allow Zero Length") = True
        Else
            Col.Properties("Nullable") = True
        End If
    Else
        If Acceso = "ACCESS" Then
            Col.Properties("Jet OLEDB:Allow Zero Length") = False
        Else
            Col.Properties("Nullable") = False
        End If
    End If
    tdfActual.Columns.Append Col
    Crea_Campo = True
    Exit Function
    ErrorCrea_Campo:
    MuestraError, "Crea_Campo", Err, Error
End Function
Crear un usuario para una base de datos de Access
Mediante este código podremos crear un usuario para una base de datos de 
Microsoft Access.
Const ADMIN_USERNAME = "Admin"
Const ADMIN_PASSWORD = "adminpass (or whatever)"
Const SHOWICON_STOP = 16
Const ADMIN_USERNAME = "Admin"
Const ADMIN_PASSWORD = "adminpass (or whatever)"
Const SHOWICON_STOP = 16

Function CreateNewUser% (ByVal username$, ByVal password$, ByVal PID$)
    ' Crea un nuevo usuario
    ' Username$ - nombre
    ' Password$ - password del usuario
    ' PID$ - PID del usuario
    Dim NewUser As User
    Dim admin_ws As WorkSpace
    ' Chequea el PID
    If (Len(PID$) < 4 Or Len(PID$) > 20) Then
        MsgBox "PID Inválido", SHOWICON_STOP
        CreateNewUser% = True
        Exit Function
    End If
    ' Verifica que el usuario no existe
    If (UserExist%(username$)) Then
        CreateNewUser% = True
        Exit Function
    End If
    ' Abre un nuevo workspace y base de datos como Admin
    dbEngine.Workspaces.Refresh
    Set admin_ws = dbEngine.CreateWorkspace("TempWorkSpace", ADMIN_USER, 
ADMIN_PASSWORD)
    If (Err) Then
        ' Error al abrir el workspace
        MsgBox "Password de Aministrador Inválida", SHOWICON_STOP
        MsgBox "Error: " & Error$, SHOWICON_STOP, SystemName
        CreateNewUser% = True
        Exit Function
    End If
    On Error Resume Next
    ' Crea el nuevo usuario
    Set NewUser = admin_ws.CreateUser(username$, PID$, password$)
    If (Err) Then
        MsgBox "Imposible crear el nuevo usuario", SHOWICON_STOP
        MsgBox Error$, SHOWICON_STOP
        Goto CreateNewUser_end
    End If
    ' Añade el usuario a la lista de usuarios
    admin_ws.Users.Append NewUser
    ' Añade al usuario al grupo "Users" 
    Set NewUser = admin_ws.CreateUser(username$)
    admin_ws.Groups("Users").Users.Append NewUser
    admin_ws.Users(username$).Groups.Refresh
    admin_ws.Close
    CreateNewUser% = False
    CreateNewUser_end:
    On Error Goto 0
End Function
Crear una base de datos de Access
A través del siguiente ejemplo, veremos cómo crear una base de datos de 
Microsoft Access desde Visual Basic.
Public Function CreateDatabase(DBFullPath As String, InitialTable As String) As 
Boolean
    'Crea una base de datos con una tabla
    Dim db As Database
    Dim td As TableDef
    Dim f As Field
    On Error GoTo ErrorHandler
    Set db = DBEngine.CreateDatabase(DBFullPath, dbLangGeneral)
    Set td = db.CreateTableDef(IntialTable)
    Set f = td.CreateField("ID", dbLong)
    td.Fields.Append f
    db.TableDefs.Append td
    CreateDatabase = True
    ErrorHandler:
    If Not db Is Nothing Then db.Close
End Function
Crear una base de datos de Access(II)
Este es otro ejemplo más que nos enseña cómo crear una base de datos de Access 
desde Visual Basic.
Function CreaBD_ACCESS(NombreBD as String) As Boolean
    Dim cat As New ADOX.Catalog
    On Error GoTo ErrorCreaBD_ACCESS
    CreaBD_ACCESS = False
    If Trim$(NombreBD)<>"" then
        'Para conectar con BD Access 2000 usar el proveedor 
Microsoft.Jet.OLEDB.4.0. 
        'Para conectar con Access 97 usar Microsoft.Jet.OLEDB.3.51
        cat.Create ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & NombreDB & 
".MDB") 
    End if
    CreaBD_ACCESS = True
    Exit Function
    ErrorCreaBD_ACCESS:
    MuestraError "CreaBD_ACCESS", Err, Error
End Function
Determina si un campo existe dentro de una tabla de una base de datos de Access
Mediante el siguiente ejemplo comprobaremos la existencia de un campo 
determinado dentro de una tabla de una base de datos de Microsoft Access.
Public Function FieldExists(DatabaseName As String, TableName As String, 
FieldName As String) As Boolean
    Dim oDB As Database
    Dim td As TableDef
    Dim f As Field
    On Error GoTo errorhandler
    Set oDB = Workspaces(0).OpenDatabase(DatabaseName)
    Set td = oDB.TableDefs(TableName)
    On Error Resume Next
    Set f = td.Fields(FieldName)
    FieldExists = Err.Number = 0
    oDB.Close
    Exit Function
    errorhandler:
    If Not oDB Is Nothing Then oDB.Close
    Err.Raise Err.Number
    Exit Function
End Function
Determina si una tabla existe en una base de datos de Access
Mediante este ejemplo comprobaremos la existencia de una tabla determinada en 
una base de datos de Microsoft Access.
Public Function TableExists(DatabaseName As String, TableName As String) As 
Boolean
    'DataBaseName = Nombre de la base de datos
    'TableName = Nombre de la tabla a buscar
    Dim oDB As Database, td As TableDef
    On Error GoTo errorhandler
    Set oDB = Workspaces(0).OpenDatabase(DatabaseName)
    On Error Resume Next
    Set td = oDB.TableDefs(TableName)
    TableExists = Err.Number = 0
    oDB.Close
    exit function
    errorhandler:
    Err.Raise Err.Number
    Exit Function
End function
Determinar si existen relaciones en una BD de Access
Mediante el ejemplo siguiente podremos averiguar si existen relaciones en una 
base de datos de Access.
Function ExisteRelacion(cat As ADOX.Catalog, NombreTabla As String, NombreCampo 
As String) As Boolean 
    'Esta funcion una relacion en la DB si la encuentra retorna TRUE 
    Dim RelacionBucle As New ADOX.Key 
    On Error GoTo ErrorExisteRelacion 
    ExisteRelacion = False 
    For Each RelacionBucle In cat.Tables.Item(NombreTabla).Keys 
        If RelacionBucle.Name = NombreCampo Then 
            ExisteRelacion = True 
            Exit For 
        End If 
    Next RelacionBucle 
    Exit Function 
    ErrorExisteRelacion: 
    MuestraError "ExisteRelacion", Err, Error 
End Function 
Determinar si un RecordSet está o no vacio

A través de este ejemplo comprobaremos si un Recordset de nuestra BD está vacío. 

Ejemplo:

Inserta el siguiente código:

If Objeto_Recordset.BOF And Objeto_Recordset.EOF Then
    MsgBox "NO hay datos en la consulta"
Else
    MsgBox "Hay datos en la consulta."
End If 
Encriptar campos en las tablas de Access 
A través de este fenomenal ejemplo podremos encriptar los campos de una base de 
datos de Microsoft Access. 
Public encripta1 As String 
Public desencri1 As String 

Function ENCRIPTAR(valor As String) 
    Dim R As Integer 
    encripta1 = valor 
    R = Len(Trim(valor)) 
    For I = 1 To R 
        Mid(encripta1, I, 1) = Chr(Asc(Mid(valor, I, 1)) - 1) 
    Next I 
End Function 
Function DESENCRIPTAR(valor As String) 
    Dim R As Integer 
    desencri1 = valor 
    R = Len(Trim(valor)) 
    For I = 1 To R 
        Mid(desencri1, I, 1) = Chr(Asc(Mid(valor, I, 1)) + 1) 
    Next I 
End Function

'Para encriptar 

Call ENCRIPTAR(Text6.Text) 
TABLA10.Fields!REMITENTE = encripta1 

'Para desencriptar 

Call DESENCRIPTAR(TABLA10.Fields!CARGO) 
Text7.Text = desencri1 
Establece una contraseña para una base de datos de Access 
Mediante el siguiente ejemplo tendremos la oportunidad de establecer desde 
Visual Basic una contraseña a una base de datos de Microsoft Access. 
Public Function SetDatabasePassword(DBPath As String, newPassword As String) As 
Boolean
    'La base de datos debe estar inicialmente sin contraseña
    If Dir(DBPath) = "" Then Exit Function
    Dim db As DAO.Database
    On Error Resume Next
    Set db = OpenDatabase(DBPath, True)
    If Err.Number <> 0 Then Exit Function
    db.newPassword "", newPassword
    SetDatabasePassword = Err.Number = 0
    db.Close
End Function 
Exportar datos Sql a un fichero Csv 
El siguiente ejemplo nos enseña el método para poder exportar datos de un 
fichero Sql a uno con extensión Csv. 
Public Function CSVExport(db As DAO.Database, sSQL As String, sDest As String) 
As Boolean
    Dim record As Recordset
    Dim nI As Long
    Dim nJ As Long
    Dim nFile As Integer
    Dim sTmp As String
    On Error GoTo Err_Handler
    Set record = db.OpenRecordset(sSQL, DAO.dbOpenDynaset, DAO.dbReadOnly)
    ' Abre el fichero
    nFile = FreeFile
    Open sDest For Output As #nFile
    ' Exporta los campos
    For nI = 0 To record.Fields.Count - 1
        sTmp = "" & (record.Fields(nI).Name)
        Write #nFile, sTmp;
    Next
    Write #nFile,
    If record.RecordCount > 0 Then
        record.MoveLast
        record.MoveFirst
        For nI = 1 To record.RecordCount
            For nJ = 0 To record.Fields.Count - 1
                sTmp = "" & (record.Fields(nJ))
                Write #nFile, sTmp;
            Next
            Write #nFile,
            record.MoveNext
        Next
    End If
    Close #nFile
    CSVExport = True
    Exit Function
    Err_Handler:
    MsgBox ("Error: " & Err.Description)
    CSVExport = False
End Function 
Exporta la estructura de una tabla Oracle y su contenido a una base de datos de 
Access 
Este fenomenal ejemplo nos muestra un método para exportar la estructura y los 
datos de una base de datos de Oracle a una base de datos de Microsoft Access. 
Este ejemplo solo permite pasar datos numéricos y el tipo de datos "Varchar", 
además de tener que estar ya la base de datos creada o no funcionará.

Para comenzar el ejemplo añada un botón a su formulario:

Private Sub Command1_Click()
    Dim adoAccess As ADODB.Connection
    Dim rstAccess As ADODB.Recordset
    Dim adoOracle As ADODB.Connection
    Dim rstOracle As ADODB.Recordset
    Dim fldArray As Variant
    Dim tblName(2) As String
    Dim strSQL As String
    Dim strAlter As String
    Dim fld As ADODB.Field
    Dim rowNumber As Integer
    Dim fldNumber As Integer
    Set adoAccess = New ADODB.Connection
    Set rstAccess = New ADODB.Recordset
    rstAccess.CursorLocation = adUseClient
    Set adoOracle = New ADODB.Connection
    Set rstOracle = New ADODB.Recordset
    rstOracle.CursorLocation = adUseClient
    tblName(0) = "TEST_TABLE1"
    tblName(1) = "TEST_TABLE2"
    'La base de datos debe estar creada sin tablas
    adoAccess.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data 
Source=C:\Program Files\Microsoft " & "Visual Studio\VB98\testmdb.mdb"
adoAccess.Open
    'La base de datos de Oracle debe existir con el nombre de las tablas
    adoOracle.ConnectionString = "Provider=MSDAORA.1;Data Source=your_source;" & 
_
"User ID=my_id;Password=mypass"
    adoOracle.Open
    For a = 0 To UBound(tblName) - 1
        'Crea la tabla Access sin columnas
        adoAccess.Execute "create table " & tblName(a)
        'Lee la información de una columna de una tabla Oracle
        rstOracle.Open tblName(a), adoOracle, , , adCmdTableDirect
        MsgBox tblName(a)
        For Each fld In rstOracle.Fields
            Select Case fld.Type
            'Solo permite numérico y Varchar, en caso de necesitar más las 
añadiríamos a     continuación
                Case adNumeric
                    'Modifica la tabla para añadir una columna numérica
                    strAlter = "alter table " & tblName(a) & " add column " & 
fld.Name & " NUMBER"
                    adoAccess.Execute strAlter
                Case adVarChar
                    'Modifica la tabla para añadir una columna de texto
                    strAlter = "alter table " & tblName(a) & " add column " & 
fld.Name & " TEXT(" & fld.DefinedSize & ")"
                    adoAccess.Execute strAlter
            End Select
        Next fld
        rstOracle.Close
        'Selecciona todos los registros y los pone en un array
        strSQL = "select * from " & tblName(a)
        rstOracle.Open strSQL, adoOracle
        fldArray = rstOracle.GetRows
        'Abre la tabla Access
        rstAccess.Open tblName(a), adoAccess, adOpenKeyset, adLockOptimistic, 
adCmdTable
        For rowNumber = 0 To UBound(fldArray, 2)
            rstAccess.AddNew
            For fldNumber = 0 To rstAccess.Fields.Count - 1
                rstAccess(fldNumber) = fldArray(fldNumber, rowNumber)
            Next fldNumber
            rstAccess.Update
        Next rowNumber
        rstAccess.Close
        rstOracle.Close
    Next a
End Sub 
Exportar una base de datos de Access a Html 
A través del siguiente ejemplo, veremos como exportar los datos de la tabla de 
una base de datos de Microsoft Access a un fichero Html. 
Para ello añadiremos un botón y dos cajas de texto a un formulario.

Private Sub Command1_Click()
    Dim fnum As Integer
    Dim db As Database
    Dim rs As Recordset
    Dim num_fields As Integer
    Dim i As Integer
    Dim num_processed As Integer
    On Error GoTo MiscError
    ' Abre el fichero de salida
    fnum = FreeFile
    Open Text2.Text For Output As fnum
    ' Escribe la cabecera HTML
    Print #fnum, ""
    Print #fnum, ""
    Print #fnum, ""
    Print #fnum, ""
    Print #fnum, ""
    Print #fnum, ""
    Print #fnum, "My Title"
    ' Comienza la tabla HTML
    Print #fnum, ""
    ' Abre la base de datos
    Set db = OpenDatabase(Text1.Text)
    ' Ojo al SQL, haz los cambios necesarios
    Set rs = db.OpenRecordset("SELECT * FROM Table1 ORDER BY ID")
    Print #fnum, " " ' Comienza una columna
    num_fields = rs.Fields.Count
    For i = 0 To num_fields - 1
        Print #fnum, " ";
        Print #fnum, rs.Fields(i).Name;
        Print #fnum, " "
    Next i
    Print #fnum, " "
    Do While Not rs.EOF
        num_processed = num_processed + 1
        Print #fnum, " ";
        For i = 0 To num_fields - 1
            Print #fnum, " ";
            Print #fnum, rs.Fields(i).Value;
            Print #fnum, " "
        Next i
        Print #fnum, " ";
        rs.MoveNext
    Loop
    ' Cierra la tabla
    Print #fnum, " "
    Print #fnum, " "
    Print #fnum, " " & Format$(num_processed) & " records displayed."
    Print #fnum, ""
    Print #fnum, ""
    ' Cierra el fichero y la base de datos
    rs.Close
    db.Close
    Close fnum
    MsgBox "Procesado " & Format$(num_processed) & " registros."
    Exit Sub
    MiscError:
    MsgBox "Error " & Err.Number & vbCrLf & Err.Description
End Sub

Private Sub Form_Load()
    'Cambia a los nombres de tus ficheros
    Text1.Text = "C:\TuBasedeDatos.mdb"
    Text2.Text = "C:\TuFicheroHtml.htm"
End Sub

Exportar una o varias tablas a otro tipo de base de datos

Para  exportar una o varias tablas a otro tipo de base de datos, escribir lo 
siguiente.

Ejemplo:

Inicie un nuevo proyecto, añada un botón (nombre: Exportar).

Escriba el siguiente código para el formulario:

Private Sub Exportar_Click()
    Dim db As Database
    Set db = Workspaces(0).OpenDatabase(App.Path & "\Musica.mdb")
    'db.execute "SELECT tabla.campos INTO [tipo base de 
datos;DATABASE=path].[nombre del fichero a exportar]         FROM [tabla o 
tablas]
    db.execute "SELECT * INTO [dBase III;DATABASE=D:\Mis Documentos].[Musica] 
FROM [Disco]"
End Sub

Se exportará la tabla "Disco" en una base de datos con formato dBase III, y con 
nombre Musica.dbf. 
Exportar una tabla de Access a un fichero de Excel 
El siguiente ejemplo nos enseña cómo exportar los datos de una base de datos de 
Microsoft Access a una hoja de cálculo de Microsoft Excel. 
Private Sub ExportOneTable()
    'Deberemos referenciar DAO
    Dim strExcelFile As String
    Dim strWorksheet As String
    Dim strDB As String
    Dim strTable As String
    Dim objDB As Database
    'Cambiaremos estos datos de acuerdo a nuestras necesidades
    strExcelFile = "C:\My Documents\MySpreadSheet.xls"
    strWorksheet = "WorkSheet1"
    strDB = "C:\My Documents\MyDatabase.mdb"
    strTable = "MyTable"
    Set objDB = OpenDatabase(strDB)
    'Si el fichero excel existe, puedes borrarlo aqui
    If Dir(strExcelFile) <> "" Then Kill strExcelFile
    objDB.Execute "SELECT * INTO [Excel 8.0;DATABASE=" & strExcelFile & "].[" & 
strWorksheet & "] FROM " & "[" & strTable & "]"
    objDB.Close
    Set objDB = Nothing
End Sub 
Extrae los nombres de todos los campos de la tabla de una Base de datos de 
Access 
A través de la siguiente rutina, podremos extraer los nombres de todos los 
campos de cualquier tabla en una base de datos de Microsoft Access. 
'dbPath = Nombre de la base de datos con su trayectoria
'TableName = Nombre de la Tabla

Public Function FieldNames(dbPath As String, TableName As String) As Collection
    Dim oCol As Collection
    Dim db As DAO.Database
    Dim oTD As DAO.TableDef
    Dim lCount As Long, lCtr As Long
    Dim f As DAO.Field
    On Error GoTo errorhandler
    Set db = workspaces(0).opendatabase(dbPath)
    Set oTD = db.TableDefs(TableName)
    Set oCol = New Collection
    With oTD
        lCount = .Fields.Count
        For lCtr = 0 To lCount - 1
            oCol.Add .Fields(lCtr).Name
        Next
    End With
    db.Close
    Set FieldNames = oCol
    Exit Function
    errorhandler:
    On Error Resume Next
    If Not db Is Nothing Then db.Close
    Set FieldNames = Nothing
    Exit Function
End Function 
Grabar una imagen en una BD de Access 
Mediante el ejemplo siguiente podremos grabar una imagen determinada en una base 
de datos de Access.

Sub GrabaImagenEnBD(f As adodb.Field, NombreImagen As String)
    Dim Fichero As Integer
    Dim LongitudFichero As Long
    Const TamañoBuffer = 1024
    Dim TamañoMinimo As Long
    Dim Bloques As Long
    Dim x() As Byte
    Dim i As Long
    On Error GoTo ErrorGrabaImagenEnBD
    Fichero = FreeFile
    Open NombreImagen For Binary Access Read As Fichero
    LongitudFichero = LOF(Fichero)
    Bloques = Int(LongitudFichero / TamañoBuffer)
    TamañoMinimo = LongitudFichero Mod TamañoBuffer
    ReDim x(TamañoMinimo)
    Get Fichero, , x()
    f.AppendChunk x()
    ReDim x(TamañoBuffer)
    For i = 1 To Bloques
        Get Fichero, , x()
        f.AppendChunk x()
    Next
    Close Fichero
    Exit Sub
    ErrorGrabaImagenEnBD:
    MuestraError "GrabaImagenEnBD", Err, Error
End Sub 
Introducir fotos en una BD sin DataControl 
Para introducir fotografías en una base de datos sin usar el control Data, 
bastará con ejecutar las siguientes líneas de código. 
Tenemos un recordset llamado MiRecordSet con un campo tipo OLE llamado MiCampo y 
un picture box llamado Picture1.

Para leer la imagen y mostrarla en el picture:

LeerBinary MiRecordSet!MiCampo, Picture1

Para guardar la imagen del picture en el campo:

GuardarBinary MiRecordSet!MiCampo, Picture1

Las funciones son:

Option Explicit
Dim DataFile As Integer
Dim Chunk() As Byte
Const conChunkSize As Integer = 16384

Public Sub LeerBinary(campoBinary As Field, unPicture As PictureBox)
    'Leer la imagen del campo de la base y asignarlo al Picture
    Dim lngCompensación As Long 
    Dim lngTamañoTotal As Long 
    'Se usa un fichero temporal para guardar la imagen 
    DataFile = FreeFile
    Open "pictemp" For Binary Access Write As DataFile 
    lngTamañoTotal = campoBinary.FieldSize
    Do While lngCompensación < lngTamañoTotal
        Chunk() = campoBinary.GetChunk(lngCompensación, conChunkSize)
        Put DataFile, , Chunk()
        lngCompensación = lngCompensación + conChunkSize 
    Loop 
    Close DataFile 
    'Ahora se carga esa imagen en el control
    unPicture.Picture = LoadPicture("pictemp") 
    'Ya no necesitamos el fichero, así que borrarlo
    On Local Error Resume Next 
    If Len(Dir$("pictemp")) Then
        Kill "pictemp" 
    End If 
    Err = 0
End Sub

Public Sub GuardarBinary(campoBinary As Field, unPicture As PictureBox)
    'Guardar el contenido del Picture en el campo de la base 
    Dim i As Integer
    Dim Fragment As Integer, Fl As Long, Chunks As Integer 
    'NOTA:
    ' El recordset debe estar preparado para Editar o Añadir
    'Guardar el contenido del picture en un fichero temporal
    SavePicture unPicture.Picture, "pictemp" 
    'Leer el fichero y guardarlo en el campo 
    DataFile = FreeFile
    Open "pictemp" For Binary Access Read As DataFile
    Fl = LOF(DataFile) ' Longitud de los datos en el archivo
    If Fl = 0 Then Close DataFile: Exit Sub 
    Chunks = Fl \ conChunkSize
    Fragment = Fl Mod conChunkSize 
    ReDim Chunk(Fragment) 
    Get DataFile, , Chunk() 
    campoBinary.AppendChunk Chunk()
    ReDim Chunk(conChunkSize) 
    For i = 1 To Chunks
        Get DataFile, , Chunk() 
        campoBinary.AppendChunk Chunk() 
    Next i
    Close DataFile 
    'Ya no necesitamos el fichero, así que borrarlo
    On Local Error Resume Next 
    If Len(Dir$("pictemp")) Then
        Kill "pictemp" 
    End If 
    Err = 0
End Sub 
Llamar a un programa del AS/400 para recuperar un registro Enviado por Rodolfo 
del Peru 
Mediante esta rutina podremos llamar a un programa del AS/400 para recuperar un 
registro. 
Sub Recupera_Cliente()
    Dim Rcds As Variant
    Dim Parms As Variant
    Dim cm As New ADODB.Command
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Set cm.ActiveConnection = cnAS400
    'LibreriaProg es el nombre de la libreria en AS/400 donde reside el programa
    cm.CommandText = "{call LibreriaProg.PROGAS400(?)}"
    cm.Prepared = True
    cm.Parameters(0).Direction = adParamInput
    Parms = Array(Trim(txtCliente))
    Set rs = cm.Execute(Rcds, Parms, adCmdText) 
    With rs
        If .EOF Then
            MsgBox "Cliente no existe", vbExclamation, Me.Caption
            txtCliente.SetFocus
            txtNombre = ""
            txtDireccion1 = ""
        Else
            txtNombre = .Fields(2).Value
            txtDireccion1 = .Fields(3).Value
        End If
    End With
    rs.Close
End Sub

En el AS/400 el programa de tipo SQLRPG seria asi:
    C *ENTRY PLIST
    C PARM PCLI 7
    C/EXEC SQL INCLUDE SQLCA
    C/END-EXEC
    C/EXEC SQL DECLARE C1 CURSOR FOR
    c+ SELECT * FROM library/Archivo WHERE
    C+ CODCLI =: PCLI
    C/END-EXEC
    C/EXEC SQL OPEN C1
    C/END-EXEC
    C/EXEC SQL SET RESULT SETS CURSOR C1
    C/END-EXEC
    C SETON LR

Finalmente, el enlace entre el SQL del AS/400 y la PC esta dado por un 
Procedimiento almacenado, asi:

'LibreriaProg es el nombre de la libreria en AS/400 donde reside el programa 
create procedure LibreriaProg/PROGAS400(in CODIGO CHAR(7)) result set 1 external 
name LibreriaProg/PROGAS400 language RPG general variant 

Este procedimiento se crea entrando al AS/400 y dando el comando STRSQL. 
Modificar la contraseña de una base de datos 
A través del ejemplo siguiente, tendremos la oportunidad de modificar la 
contraseña de una base de datos existente. 
Public Function ChangeDatabasePassword(DBPath As String, newPassword As String, 
oldPassWord As String) As Boolean
    'Ejemplo ChangeDatabasePassword("C:\Ejemplo.mdb", "PassNueva", 
"PassAntigua")
    If Dir(DBPath) = "" Then Exit Function
    Dim db As DAO.Database
    On Error Resume Next
    Set db = OpenDatabase(DBPath, True, False, ";pwd=" & oldPassWord)
    If Err.Number <> 0 Then Exit Function
    db.newPassword oldPassWord, newPassword
    ChangeDatabasePassword = Err.Number = 0
    db.Close
End Function 
Modulo de consulta dinamica con agrupamientos

Con este módulo obtendremos la consulta de agrupamiento observando una serie de 
criterios que rellenaremos por el formulario. En este caso buscaremos atendiendo 
a la fecha (desde-hasta) y al departamento. Si la fecha o el departamento 
estuviesen vacíos, se cogerán todos los valores. Los agrupamientos (en este caso 
según meses, días o años) se colocarán fijos en un cuadro de lista y agrupamos 
atendiendo a la elección del agrupamiento.

El código del ejemplo:

Private Sub Command1_Click ()
    Dim Consref As QueryDef, Base1 As Database, Consulta2 As QueryDef
    Set Base1 = DbEngine.Workspaces(0).Databases(0)
    Base1.QueryDefs.Delete "Agrupacion"
    Base1.QueryDefs.Delete "Agrupacion del dia"
    Set Consref = Base1.CreateQueryDef()
    contador = 0
    Misql = "TRANSFORM SUM([" & [Campo4] & "]) As Total 
    SELECT Consulta1.Referencia,SUM([" & [Campo4] & "]) As 
    [Resumen de la fila] "
    Misql = Misql & "FROM Consulta1 "
    'Aqui filtramos los registros por fechas. 
    'Si Ambos filtros estan vacios, cogemos todos los valores. 
    'Si uno esta relleno, actuamos en consecuencia
    If Not (IsNull([Campo18])) Then
        If Not (IsNull([Campo20])) Then
            Condicion = " WHERE (movimientos.Fecha Between #" & 
            Format([Campo18], "mm/dd/yy") & "# AND #" & 
            Format([Campo20], "mm/dd/yy") & "#)"
        Else
            Condicion = " WHERE (movimientos.Fecha > #" & 
            Format([Campo18], "mm/dd/yy") & "#)"
        End If
    Else
        If Not (IsNull([Campo20])) Then
            Condicion = " WHERE (movimientos.Fecha < #" & 
            Format([Campo20], "mm/dd/yy") & "#)"
        Else
            contador = 1
        End If
    End If
    'Aqui colocamos la segunda opcion de filtrado, 
    que en este caso es por departamento. Si esta en blanco cogemos todos 
    los valores posibles
    If Not (IsNull([Campo15])) Then
        If contador = 1 Then
            Condicion = " WHERE Nombre LIKE " & Chr$(34) & [Campo15] & 
            Chr$(34) & " "
        Else
            Condicion = Condicion & " AND (Nombre LIKE " & Chr$(34) & 
            [Campo15] & Chr$(34) & ") "
        End If
    End If
    Misql = Misql & Condicion & "GROUP BY Consulta1.Referencia "
    'Aqui agrupamos por fechas pero basandonos 
    en un cuadro de lista con periodos especificos
    If [Campo2] = "Por mes" Then
        Misql = Misql & " PIVOT Format([Fecha]," & Chr$(34) & 
        "mm/yy" & Chr$(34) & ");"
    End If
    If [Campo2] = "Por año" Then
        Misql = Misql & " PIVOT Year([Fecha]);"
    End If
    If [Campo2] = "Por dia" Then
        Misql = Misql & " PIVOT Fecha;"
    End If
    Consref.Name = "Agrupacion"
    Consref.SQL = Misql
    Base1.QueryDefs.Append Consref
    Misql = "SELECT Agrupación.* From [Agrupacion] 
    ORDER BY [Resumen de la fila] DESC"
    Set Consulta2 = Base1.CreateQueryDef()
    Consulta2.SQL = Misql
    Consulta2.Name = "Agrupacion del dia"
    Base1.QueryDefs.Append Consulta2
    A = MsgBox("Consulta terminada", 64)
    Base1.Close
End Sub

Diccionario de datos
[Campo18]= Casilla de Texto. Seleccionamos la fecha desde.
[Campo20]= Casilla de Texto. Seleccionamos la fecha hasta.
[Campo15]= Cuadro de lista. Seleccionamos el departamento. El origen viene 
determinado por una consulta en la cual seleccionamos los departamentos.
[Campo2]= Cuadro de lista. Seleccionamos el tipo de agrupamiento. En este 
caso es por mes, día, año. Estos valores son fijos.


Modulo standard de busquedas dinamicas

Con el módulo de búsquedas dinámicas generaremos una consulta a partir de una 
serie de datos a través de los cuales deseamos realizar dicha consulta. Este 
módulo se apoya en un formulario independiente (no se apoya en ninguna tabla), 
en el cual se han colocado una serie de controles, normalmente cuadros de texto 
y cuadros de lista combinados, en los cuales colocaremos las opciones o 
parámetros sobre los cuales se realizará la búsqueda. Las razones para la 
utilización de este módulo son:

No se necesita conocer sobre qué tablas hay que hacer la consulta.
No se necesita conocer cómo crear consultas.
No hace falta tener una consulta creada para cada caso concreto.
Búsquedas más rápidas y flexibles: Se pueden rellenar todos, alguno o ninguno de 
los campos del formulario de la búsqueda.
Permite una impresión de la misma, realizar un gráfico o cambiar el origen de un 
formulario/informe a dicha consulta.

El código del ejemplo:

Option Compare Database 'Usar orden de base de datos en comparaciones de cadenas

Private Sub Command_Click ()
    Dim Mientrada As String, Misalida As String, Micriterio As String, 
    Origen As String, Contador1 As Integer
    Dim Tabla As Recordset, Basedatos As Database, Tabla2 As Recordset
    Set Basedatos = DbEngine.Workspaces(0).Databases(0)
    Set Tabla = Basedatos.OpenRecordset("Movimientos", DB_OPEN_DYNASET)
    Set Tabla2 = Basedatos.OpenRecordset("embalajes", DB_OPEN_DYNASET)
    Contador1 = 0
    Mientrada = "SELECT Movimientos.Cantidad, embalajes.articulo, 
    Movimientos.Fecha "
    Mientrada = Mientrada & "FROM embalajes INNER JOIN Movimientos 
    ON embalajes.articulo = Movimientos.Articulo"
    Misalida = Mientrada
    Mientrada = Mientrada & " WHERE ((Movimientos.Cantidad > 0)"
    Misalida = Misalida & " WHERE ((Movimientos.Cantidad < 0)"
    If IsNull([Campo0]) Then
        Micriterio = ""
    Else
        Micriterio = " AND (embalajes.articulo = [Campo0])"
    End If
    If [Campo2] <> "" Then
        If [Campo4] <> "" Then
            Micriterio = Micriterio & " AND 
            (Movimientos.Fecha Between [Campo2] AND [Campo4])"
        Else
            Micriterio = Micriterio & " AND 
            (Movimientos.Fecha >= [Campo2] )"
        End If
    Else
        If [Campo4] <> "" Then
            Micriterio = Micriterio & " AND 
            (Movimientos.Fecha <= [Campo4] )"
        End If
    End If
    If [Campo0] = "" And [Campo2] = "" And [Campo4] = "" Then
        Micriterio = ")"
    Else
        Micriterio = Micriterio & ") ORDER BY Movimientos.Fecha"
    End If
    MiOrigen = Mientrada & Micriterio
    Me![Incrustado10].Form.RecordSource = MiOrigen
    Me![Incrustado12].Form.RecordSource = Misalida & Micriterio 
End Sub

Es interesante observar como varian las instrucciones y 
parámetros de la consulta dependiendo del valor de los controles 
y como se usa el contenido de los mismos para utilizarlos en la 
instrucción SQL. Al final vemos como dicha instrucción SQL 
se utiliza para la propiedad OrigenDelRegistro (RecordSource) de dos 
subformularios que tiene el formulario de búsqueda.

Si quisiéramos añadir dicha consulta a las consultas de 
la base de datos entonces haríamos lo siguiente:

Dim Consref As QueryDef, Base1 As Database, Consulta2 As QueryDef
Set Base1 = Dbengine.Workspaces(0).Databases(0)
…….
Set Consulta2 = Base1.CreateQueryDef()
Consulta2.SQL = "SELECT Temporal1.* From [Temporal1]"
If [Campo15] = -1 Then
    Consulta2.SQL = Consulta2.SQL & " ORDER BY [Resumen de la fila] DESC"
End If
Consulta2.Name = "Temporal"
Base1.Querydefs.Append Consulta2 
Obtener los nombres de las tablas de una bd de Access 
Mediante el siguiente ejemplo podremos obtener los nombres de las tablas de una 
bd de Access, tanto si trabajamos con ADO como con DAO. 
Si trabajas en DAO: 

Dim db as Database 
'Abres la base de datos 
Dim tdf as TableDef 

For each tdf in db.TableDefs 
'Agrega el nombre al Listbox o a otro control usando la propiedad tdf.Name 
Next tdf 

Si trabajas en ADO:
Debes utilizar el ADOX. Para esto agrega la referencia a Microsoft ADO Ext. 2.5 
for Dll and Security.

Dim cn as new ADODB.Connection 
Dim ct as new ADOX.Catalog 
Dim tb as new ADOX.Table 

'Abres la conexión y el Catalog 
cn.open 'Connectiontring' 
Set ct.ActiveConnection = cn 

For each tb in ct.Tables 
'Agrega el nombre al Listbox o a otro control usando la propiedad tb.Name 
Next tb

Procedimiento para cargar las tablas de una Base de Datos en un ListBox

Estos dos ejemplos nos permiten cargar el contenido de las tablas de una base de 
datos en un ListBox.

Inserte un ListBox en un proyecto. Copie una de las siguientes rutinas de código 
en un módulo y llámelo desde el formulario. 
Suponemos que el fichero de la base de datos se llama Agentel.mdb :

Los dos procedimientos son formas de hacerlo diferentes. El segundo 
procedimiento es una forma más depurada aún de hacerlo.

Ejemplo:

1 Procedimiento

Public Sub CargarTablas()
    Dim I As Integer
    ' Declarada en el apartado Declaraciones : BD as Database 
    Set BD = Workspaces(0).OpenDatabase("Agentel.Mdb")
    ' Limpiamos el control ListBox donde cargamos las tablas 
    List1.Clear
    With BD
        For I = 0 To .TableDefs.Count - 1
            If Not Left(.TableDefs(I).Name, 4) = "MSys" Then
                List1.AddItem .TableDefs(I).Name
            End If
        Next I
    End With
End Sub

2 Procedimiento

Public Sub CargarTablas()
    Dim I As Integer
    ' Declarada en el apartado Declaraciones : BD as Database 
    Set BD = Workspaces(0).OpenDatabase("Agentel.Mdb")
    ' Limpiamos el control ListBox donde cargamos las tablas 
    List1.Clear
    With BD
        For I = 0 To .TableDefs.Count - 1
        ' Cargar sólo las tablas que no son del sistema 
            If .Tabledef.Attributes = 0 Then
                List1.AddItem .TableDefs(I).Name
            End If
        Next I
    End With
End Sub 
Realizar una consulta por Passthrough en RDO 
La técnica del "passthrough" permite enviar una consulta SQL a una base de datos 
sin necesidad de pasar por el administrador de ODBC. La ventaja principal de 
utilizar "passthrough" es obtener un mejor rendimiento ya que la consulta es 
procesada por menos componentes. Además, en ciertas ocasiones es necesario 
utilizar esta técnica cuando se utilizan sentencias SQL que no son estándar y 
son propietarias de una base de datos concreta.

El último parámetro de la instrucción "OpenResulset" permite pasar una consulta 
por "passthrough" especificando la constante "rdExecDirect".

El siguiente ejemplo muestra cómo ejecutar una consulta por "passthrough":


Dim cn as New rdoConnection
Dim rst as rdoResultset

cn.Connect="uid=sa;pwd=;server=SERVIDOR;_ 
driver=" & "{SQLServer};database=pubs;DSN=' ';"

cn.EstablishConnection rdDriverNoPrompt
Set rst=cn.OpenResultset("SELECT * FROM_
authors", rdOpenKeyset,rdConcurReadOnly, rdExecDirect) 
Recuperar una imagen grabada en una BD de Access 
Este ejemplo nos muestra cómo recuperar una imagen previamente grabada en una 
base de datos de Access. 
Sub CogeImagenDeBD(f As adodb.Field, NombreImagen As String)
    Dim Fichero As Integer
    Const TamañoBuffer = 1024
    Dim TamañoMinimo As Long
    Dim Bloques As Long
    Dim x() As Byte
    Dim i As Long
    On Error GoTo ErrorCogeImagenDeBD
    Fichero = FreeFile
    Open NombreImagen For Binary Access Write As Fichero
    Bloques = Int(f.ActualSize / TamañoBuffer)
    TamañoMinimo = f.ActualSize Mod TamañoBuffer
    x() = f.GetChunk(TamañoMinimo)
    Put Fichero, , x()
    For i = 1 To Bloques
        x() = f.GetChunk(TamañoBuffer)
        Put Fichero, , x()
    Next
    Close Fichero
    Exit Sub
    ErrorCogeImagenDeBD:
    MuestraError "CogeImagenDeBD", Err, Error
End Function 
Renombra una tabla de una base de datos de Access 
Mediante la siguiente rutina, podremos renombrar una tabla cualquiera de una 
base de datos de Microsoft Access. 
Public Function RenameTable(DatabaseName As String, ByVal OldTableName As 
String, _
ByVal NewTableName As String) As Boolean
    On Error GoTo errorhandler
    Dim oDB As DAO.Database
    Dim td As DAO.TableDef
    Set oDB = Workspaces(0).OpenDatabase(DatabaseName)
    On Error GoTo errorhandler
    If Not TableExists(oDB, OldTableName) Then GoTo errorhandler
    If TableExists(oDB, NewTableName) Then GoTo errorhandler
    'Crea el objeto tabla
    Set td = oDB.TableDefs(OldTableName)
    td.Name = NewTableName
    oDB.TableDefs.Refresh
    oDB.Close
    RenameTable = True
    Exit Function
    errorhandler:
    If Not oDB Is Nothing Then oDB.Close
    Set td = Nothing
End Function 
Traspasar la información de una base de datos a un Combobox

Si quisiéramos pasar el contenido de un fichero de Base de Datos a un control 
ComboBox, podríamos hacerlo de la siguiente manera:

Ejemplo:

Inicie un nuevo proyecto en Visual Basic, añada un botón y escriba este código:

Private Sub Command1_Click()
    Dim DB As Database
    Dim SS As Snapshot
    Set DB = OpenDatabase("C:\BASE.MDB")
    Set SS = DB.CreateSnapshot("Infor")
    Do Until SS.EOF
    If Len(SS(0)) = 1 Then
        Combo1.AddItem SS(0) & " " & SS(1)
    Else
        Combo1.AddItem SS(0) & " " & SS(1)
    End If
    SS.MoveNext
    Loop
End Sub
Uso del control MSFlexGrid con ADO

El siguiente ejemplo, demuestra como conectar una base de datos con ADO a un 
control MSFlexGrid.

Ejemplo:

Inserte dos botones que nos servirán para conectar y desconectar la base de 
datos y acceder a los datos mediante ADO.

El programa abre una tabla denominada "Citas".

Modifique los datos que considere oportunos.

La información se mostrará en 25 campos o columnas dentro del control 
MSFlexGrid.

Escriba la siguiente función:

Dim Cn As New ADODB.Connection
Dim rs As ADODB.Recordset

Dim sSQL As String
Dim sOut As String

Private Sub Command1_Click()
    Dim ii As Long
    Dim oo As Integer
    If Cn.State = adStateOpen Then
        MsgBox "ADO Connection Successful!"
    End If
    sSQL = "Select * from Citas"
    rs.Open sSQL, Cn, adOpenDynamic
    sOut = ""
    ii = 0
    While rs.EOF <> True
    DBGrid1.Rows = ii + 1
    iii = 1
    For oo = 0 To 24
        DBGrid1.TextMatrix(ii, oo) = rs.Fields(oo)
    Next oo
    ii = ii + 1
    rs.MoveNext
    Wend
End Sub

Private Sub Command2_Click()
    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
    Unload Me
End Sub

Private Sub Form_Load()
    Set Cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    Cn.ConnectionString = "DSN=TESTRCH01;UID=ADOTRY;PWD=ADOTRY;"
    Cn.ConnectionTimeout = 100
    Cn.Open
End Sub
Principal

    Source: geocities.com/es/ensolva/Descargas/Documentos

               ( geocities.com/es/ensolva/Descargas)                   ( geocities.com/es/ensolva)                   ( geocities.com/es)