Make your own free website on Tripod.com

 

Acceso a Bases de Datos remotas mediante

el motor Jet ODBCDirect

 

Hasta ahora todos los accesos realizados a una base de datos los hemos realizado directamente a través del Motor de bases de Datos Microsoft JET. Este motor de bases de datos abre, lee y graba el fichero .MDB (o el dBase, FoxPro, Paradox, etc.) de la misma forma que un editor de textos puede abrir, leer o escribir un fichero creado por el mismo o por otros editores conocidos.

 

Las bases de datos (las buenas) tienen unas herramientas comunes para manejarlas. Estas herramientas son, por una parte el lenguaje SQL que puede dar instrucciones para leer o escribir una base abierta, mediante un lenguaje común para todas las bases, y por otra, la herramienta que abre esa base de datos y nos hace verla, desde el exterior, bajo una forma única para todas las bases: el ODBC.

 

El ODBC es una herramienta que nos permite ver a todas las bases de una forma única. No es un lenguaje común a todas las Bases de datos. Ese es el SQL. Es la interface que adapta a una base de datos para que nos podamos entender con ella en SQL.  Por lo tanto es fácil pensar que esa interface deberá fabricarla el mismo fabricante que ha realizado la base de datos. El lenguaje SQL es conocido por todo el mundo, pero la forma interna de trabajar una base de datos solamente la conoce su fabricante. Por eso, el Driver ODBC que es el que nos permite adaptar las particularidades de esa base de datos al lenguaje común, deberá suministrarlo el fabricante de la base.

 

Microsoft desarrolló varios drivers para otras tantas bases de datos y hojas de cálculo. Entre ellas para Access y Excel, dBase y FoxPro. También lo desarrolló para bases de datos tan populares como Oracle. Ese driver hay que instalarlo en el ordenador, aunque Windows instala algunos por defecto.

 

Veamos ahora otro elemento fundamental para el trabajo con ODBC: la conexión. La conexión ODBC es el conjunto de datos que hay que aportarle a Windows para que pueda enlazar nuestra aplicación con la base de datos. Estos datos son, al menos:

 

            El nombre de la conexión, por el cual la podremos nombrar para referirnos a ella.

            El driver que debe utilizar para entenderse con la base de datos

            El nombre (y Path) de la base de datos que queremos manejar con esa conexión.

 

La conexión ODBC no la realiza Visual Basic. La realizará Windows. Veamos como podemos establecerla.

 

Vaya a Inicio | Configuración | Panel de Control | ODBC de 32 Bits. Haga doble click y le aparecerá un cuadro como el de la figura 13-1. En este cuadro figuran todos los enlaces que están establecidos. Estos enlaces puede establecerlos para un usuario (DSN de usuario), de sistema o de archivo. La elección de uno u otro dependerá de los permisos de acceso que quiera establecer (y eso es, de momento, para nota). En cualquier caso, todas los enlaces ODBC que establezca funcionarán del mismo modo, exceptuando que puede otorgar unas prerrogativas distintas de uso, dependiendo de como lo haya abierto.

 

Observe uno que figura en la lista: Luki. En esa línea figura otro dato: Microsoft Access Driver.(*.mdb)  Esto significa que el enlace de nombre Luki está usando el driver ODBC de Access.  Y significa también que si queremos llamar a esa conexión deberemos llamarla por su nombre : Luki

 


Fig. 13-1 Creación de un enlace ODBC. Muestra las conexiones existentes (una vez creada la conexión Luki)

 

 


Sigamos con la creación del enlace ODBC. Para crear uno nuevo, haga click en el botón Agregar de la figura 13-1. Le aparecerá un cuadro donde le pide el driver que quiere utilizar.

 


 


Fig. 13 – 2  Elección del driver ODBC

 

Haciendo click en Finalizar, le pedirá el nombre del nuevo enlace, un comentario, (no es necesario introducirlo), y la base de datos con la que quiere enlazar

 

 


Fig. 13-3  Introducción del nombre del enlace, comentario (descripción) y base de datos asociada al enlace ODBC

 


Veamos los datos que hemos introducido en nuestra conexión “Luki”

 

Nombre del Origen de datos. Luki

Descripción (Opcional)  Conexión ODBC Cap. 21

 

Haciendo click en Base de Datos | Seleccionar nos muestra un cuadro de diálogo donde `podemos buscar la base de datos. Se elige la base de datos deseada. Hacemos click en ACEPTAR y ya está creada la nueva conexión.

 

La base de datos del sistema deberá elegirla para poder introducir usuarios con distintas atribuciones de acceso a la base de datos. Si no introduce esta base de datos de sistema, deberá trabajar sin restricción de acceso.

 

Una vez creada la conexión podemos utilizarla para conectar nuestra aplicación con la base de datos. El proceso para ello consiste en algo parecido a lo que hacíamos trabajando con el motor Jet en el espacio de trabajo Microsoft Jet, pero de distinta forma. En ese entorno se manejaba la base de datos creando un objeto Database, que manipulaba el fichero de la base de datos directamente. En este caso, la base de datos se maneja mediante un objeto Connection.

 

El trabajar sobre una conexión nos aporta mayor versatilidad a las aplicaciones. Piense por ejemplo un caso en el que se emplea una base de datos Access. Si quisiésemos ampliar las prestaciones de la base de datos de esa aplicación posiblemente pensaríamos en migrar la BD a Oracle o SQLServer.  Si atacamos a la base de datos a través de ODBC solamente deberíamos cambiar la conexión, tal como vimos más atrás. Nuestro programa seguiría llamando a la misma conexión ODBC, pero esta conexión, ahora, abriría una base Oracle o SQLServer en vez de la Access que abría originalmente. No necesitaríamos realizar ninguna modificación en nuestro programa.

 

Este razonamiento es válido para cualquier sistema de acceso a bases de datos a través de ODBC. (RDO ó ADO)  Sin embargo el ODBCDirect tiene una ventaja `para los que trabajamos normalmente con DAO: usa los mismos nombres para casi todos los métodos y funciones, por lo que el cambio de código es mínimo. El cambio se limita prácticamente a crear el objeto Connection en vez del objeto Database.  Comencemos a ver esto con u ejemplo. Es un ejemplo uy simple, en el que abrimos una base de datos Access llamada Alumnos.Mdb que tiene una tabla llamada Personas.  Creamos la conexión Luki tal como se describió mas atrás. La tabla personas tiene solamente tres campos: ID_Alumno, Nombre y Apellidos.  Creamos una interface gráfica sencilla 


 


            Fig. 13-4 Nuestra primera aplicación con ODBCDirect

 

Mediante esta sencilla aplicación queremos visualizar los datos existentes, añadir nuevos registros y borrar el registro actual. Veamos el código con los comentarios oportunos.

 

General/Declaraciones

Option Explicit                                       'Declaramos las variables tipo objeto

Dim MiSesion As Workspace

Dim MiConexion As Connection

Dim RsODBC As Recordset

 

Private Sub BCrearConexion_Click()

'Se le dice al DBEngine que debe trabajar en el espacio de trabajo ODBCDirect

DBEngine.DefaultType = dbUseODBC

Set MiSesion = Workspaces(0)

'Se crea el objeto conexión

Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")

´Se crea el objeto Recordset

Set RsODBC = MiConexion.OpenRecordset("Personal", dbOpenDynamic, dbRunAsync, dbPessimistic)

'Es necesario recorrer el recordset para conocer cuantos registros tiene (Es Dynaset)

RsODBC.MoveLast

RsODBC.MoveFirst

If RsODBC.AbsolutePosition <> -1 Then

LNumRegs = RsODBC.RecordCount

LNumReg = RsODBC.AbsolutePosition + 1

PresentaDatos

Else

MsgBox "La base de datos no tiene ningún registro"

End If

End Sub

 

Public Sub PresentaDatos()

TB_ID = "": TB_Nombre = "" : TB_Apellido = ""

TB_ID = RsODBC!ID_Alumno

TB_Nombre = RsODBC!Nombre

TB_Apellido = RsODBC!Apellidos

LNumReg = RsODBC.AbsolutePosition + 1

End Sub

Private Sub BEliminar_Click()

RsODBC.Delete

LNumRegs = RsODBC.RecordCount

LNumReg = RsODBC.AbsolutePosition + 1

If RsODBC.AbsolutePosition <> -1 Then

RsODBC.MoveFirst

PresentaDatos

End If

End Sub

 

Private Sub BGuardarDatos_Click()

RsODBC.AddNew

RsODBC!ID_Alumno = TB_ID

RsODBC!Nombre = TB_Nombre

RsODBC!Apellidos = TB_Apellido

RsODBC.Update

LNumRegs = RsODBC.RecordCount

LNumReg = RsODBC.AbsolutePosition + 1

End Sub

 

Private Sub BMas_Click()

If RsODBC.AbsolutePosition <> -1 Then

RsODBC.MoveNext

    If RsODBC.AbsolutePosition <> -1 Then

        PresentaDatos

    Else

        RsODBC.MoveLast

        PresentaDatos

    End If

End If

End Sub

 

Private Sub BMenos_Click()

If RsODBC.AbsolutePosition <> -1 Then

RsODBC.MovePrevious

    If RsODBC.AbsolutePosition <> -1 Then

        PresentaDatos

    Else

        RsODBC.MoveFirst

        PresentaDatos

    End If

End If

End Sub

 

Private Sub BMMas_Click()

If RsODBC.AbsolutePosition <> -1 Then

    RsODBC.MoveLast

    PresentaDatos

End If

End Sub

 

Private Sub BMMenos_Click()

If RsODBC.AbsolutePosition <> -1 Then

RsODBC.MoveFirst

PresentaDatos

End If

End Sub

 

Private Sub BNuevoReg_Click()

Limpia

End Sub

Public Sub Limpia()

TB_ID = ""

TB_Nombre = ""

TB_Apellido = ""

End Sub

 

Observe que casi todo el código es igual que el que escribiríamos si hubiésemos utilizado el espacio de trabajo Microsoft Jet.  Solamente hemos utilizado código distinto el procedimiento BCrearConexion_Click.  Vamos a analizar las instrucciones de ese procedimiento que son distintas a las que estamos acostumbrados a manejar

 

DBEngine.DefaultType = dbUseODBC

Vea la propiedad DefaultType en el Capítulo 20.  Tenga en cuenta que el ODBCDirect lo ejecuta el motor Jet (que como recordará es el objeto DBEngiine). La propiedad DefaulType debemos igualarla a dbUseODBC  para que trabaje en el espacio de trabajo ODBCDirect. Si no le diésemos ningún valor a esa propiedad, tomaría el otro valor posible (dbUseJet) que es su valor por defecto. Por eso, cuando utilizábamos los métodos CreateDataBase u OpenDatabase no necesitábamos darle ningún valor a esa propiedad.

 

Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")

 

Vea mas abajo la información de OpenConnection para ver los parámetros que hay que pasarle a este método.

 

Set RsODBC = MiConexion.OpenRecordset("Personal", dbOpenDynamic, dbRunAsync, dbPessimistic)

 

Vea mas abajo una ampliación del método OpenRecordset

 

Método OpenConnection

 

Es un método del Workspace que solamente es aplicable cuando el DBEngine está trabajando en el espacio de trabajo ODBCDirect.  Abre un objeto Connection usando un origen de datos ODBC ya creado.

 

El objeto Connection sería el equivalente en DAO al objeto Database. Debemos declararlo antes de usarlo

 

Dim MiConexion as Connection

 

Si MiSesion es el Workspace que queremos usar, la sintaxis de OpenConnection es la siguiente:

 

Set MiConexion = MiSesion.OpenConnection (Nombre, Opciones, Sólolectura y Conectar)

 

En el ejemplo:

Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")

 

Veamos que son los parámetros Nombre, Opciones, Sólolectura y Conectar

 

Nombre es el nombre de la conexión (no se debe confundir con el nombre del objeto Connection que es MiConexion, y que es el nombre por el que nos tendremos que referir a esa conexión en toda la aplicación. Nombre no lo usará normalmente)

 

El parámetros Nombre puede ser una cadena cualquiera, o el nombre del enlace ODBC establecido en Windows (que en nuestro ejemplo sería Luki). Si opta por poner una cadena cualquiera (como hicimos en el ejemplo, Conexión1) deberá poner el nombre del enlace ODBC en el parámetro Conectar.  Si opta por poner el nombre del enlace ODBC, Visual Basic interpreta que debe conectar a través de ese enlace y ya no necesita poner ningún valor al parámetro Conectar.

 

Opciones Este parámetro es para definir que tipo de respuesta va a dar el administrador del controlador de ODBC para solicitar al usuario información sobre la conexión (Nombre del origen de datos (DSN), nombre del usuario y contraseña).  Puede tomar uno de los siguientes valores:

 

DbDriverNoPrompt El administrador del controlador de ODBC toma los datos de los parámetros Nombre y Conectar para saber cual es el enlace ODBC que debe usar. Si no proporciona suficiente información, se producirá un error de tiempo de ejecución.

 

DbDriverPrompt El administrador del controlador de ODBC muestra el cuadro de diálogo de ODBC, que muestra todos los enlaces ODBC existentes. La conexión se hace con el DSN que selecciona el usuario en ese cuadro de diálogo.


 


                        Fig. 13.5 Cuadro de diálogo de ODBC

 

Una vez seleccionada la conexión, aparecerá otro cuadro solicitando el nombre de inicio de sesión y la contraseña. En resumen, con este parámetro DbDriverPrompt forzamos al programa a que utilice los recursos Windows para seleccionar el enlace ODBC

 

DbDriverComplete (Este es el valor predeterminado). Se comporta (aparentemente) como si se pone DbDriverNoPrompt

 

DbDriverCompleteRequired Al igual que la anterior, esta opción se comporta (aparentemente) como si se pone DbDriverNoPrompt

 

Sólolectura (Opcional). True si la conexión se va a abrir con acceso de sólo lectura y False si la conexión se va a abrir para acceso de lectura/escritura (predeterminado)

 

Conectar (Opcional si se ha puesto el nombre del enlace en el parámetro Nombre). Este parámetro está formado por varias partes. Una, obligatoria, que contiene la expresión "ODBC;" Otra parte obligatoria, si no ha puesto en el parámetro Nombre el nombre del enlace ODBC es "DSN = NombredelaConexión;" Si desea especificar el usuario propietario de esa conexión debe añadir "UID = usuario;" y como ese usuario tendrá una contraseña, deberá añadirla también "PWD = contraseña;" También puede indicar cuanto tiempo debe esperar el administrador del controlador de ODBC para generar un error en caso de que no conteste el sistema a la petición ODBC. Este tiempo deberá introducirlo con la expresión "LOGINTIMEOUT = segundos;"    Observe que cada una de estas partes lleva un identificador  y un dato, ambos separados por un signo =, y siempre terminan con el signo punto y coma (;)

 

Si omite los parámetros UID y/o el PWD, estos datos se obtendrán de las propiedades UserName y Password del objeto Workspace.

 

 

Método OpenRecordset

 

Este método ya se estudió en el capítulo anterior, pero se van a ver ciertas peculiaridades que tiene cuando se abre un recordset en el espacio de trabajo ODBCDirect

 

En este caso es el objeto Connection quien abre el recordset.:

 

Set MiRecordset =

= MiConexion.OpenRecordset (Origen, Tipo, Opciones, Bloquearmodificaciones)

 

Origen  Puede ser un nombre de tabla, de una consulta o una instrucción SQL que devuelva registros.

Tipo  Indica el tipo de recordset que queremos crear. El espacio de trabajo ODBCDirect no permite recordsets tipo Tabla.  Los tipos que se pueden elegir son:

 

DbOpenDynamic Abre un objeto Recordset de tipo Dynamic, que es parecido a un cursor dinámico ODBC

DbOpenDynaset Abre un objeto Recordset de tipo Dynaset, similar al estudiado en el capítulo 20  para el espacio de trabajo Microsoft Jet

DbOpenSnapshot Abre un objeto Recordset de tipo Snapshot,

dbOpenForwardOnly  Abre un objeto Recordset de tipo Forward-only, que tiene la particularidad de que no permite movernos en el recordset de adelante hacia atrás.  Este es el tipo que creará por defecto si no se especifica nada en el parámetro Tipo.

 

 

Opciones Debe indicar uno de estos dos valores (si no pone alguno de ellos da error):

 

DbRunAsync     Ejecuta una consulta asíncrona, que es la forma normal de trabajar del ODBC. Esto permite a su aplicación seguir procesando otras instrucciones mientras se ejecuta la consulta en segundo plano (Vea mas adelante la propiedad StillExecuting

dbExecDirect   Ejecuta una consulta saltando el método SQLPrepare y llamando directamente al método SQLExecDirect.  Utilice esta opción sólo cuando no se abra un objeto Recordset basándose en una consulta de parámetros. Para obtener más información, consulte la "Referencia del programador de Microsoft ODBC 3.0."

 

Bloquearmodificaciones  Este parámetro es fundamental si quiere escribir en la base de datos, pues si lo omite le pone por defecto que la base es de solo lectura. Mediante este parámetro va a determinar el tipo de bloqueo de la base de datos para entornos de trabajo multiusuario. Puede poner uno de estos valores:

 

DbReadOnly (Predeterminado) No permite que los usuarios hagan cambios en los registros del Recordset

DbPessimistic Permite cambiar datos y añadir registros en el recordset, utilizando el criterio de bloqueo pesimista. Esto significa que bloquea la página donde se encuentra el registros desde que se ejecuta el método Edit hasta que se ejecuta el Update. Es el criterio mas seguro de bloqueo de datos, pero debe tener en cuenta que tiene la base bloqueada desde el Edit hasta el Update. Si hace bloqueo pesimista, procure que las instrucciones entre uno y otro no tengan ningún tiempo de espera, por ejemplo a que el usuario introduzca un dato. (El tamaño de una página depende de la base de datos que esté usando.  En Access es de 2048 Bytes. Esto significa que solamente tendrá bloqueada una parte relativamente pequeña de la base de datos, pudiendo modificar otros registros que estén fuera de ese segmento de 2 Kbytes.  Lógicamente este bloqueo solamente tendrá efecto cuando esté trabajando en un entorno multiusuario.

 

DbOptimistic  Permite cambiar datos y añadir registros en el recordset, utilizando el criterio de bloqueo optimista. El bloqueo optimista significa que solamente estará bloqueada la página que contiene el registro mientras se ejecuta el método Update. Esto puede ocasionarle que, si están dos usuario trabajando sobre el mismo registro, se introduzca un dato erróneo. Parece así en principio que no se debe usar, pero todo va a depender de la aplicación, de sus datos, y de la probabilidad de que ocurra esa colisión. La ventaja que tiene es que tiene menos tiempo bloqueada la página de la base de datos.

 

dbOptimisticValue  Utiliza la concurrencia optimista basándose en valores de fila. Funciona de forma similar al dbOptimistic.

 

dbOptimisticBatch  Activa la actualización optimista por lotes.

 

Actualización por lotes. Modelo de cursor para clientes que trabajan con cursores, pero no mantienen bloqueos en el servidor o ejecutan actualizaciones por fila. En su lugar, el cliente actualiza muchas filas que están almacenadas en el búfer local y después ejecuta una actualización por lotes. Este modelo de cursor también permite al cliente cancelar la conexión con el servidor y volverla a establecerla con el mismo servidor o con otro diferente.

 

Para utilizar la actualización por lotes en DAO 3.5, debe utilizar un espacio de trabajo de ODBCDirect, la propiedad DefaultCursorDriver se debe establecer a dbUseClientBatchCursor en el momento de abrir la conexión y se debe abrir el Recordset con el argumento de tipo de bloqueo del método OpenRecordset establecido a dbOptimisticBatch.

 

 

Propiedad StillExecuting

 

Cuando abrimos una conexión mediante OpenConnection, un QueryDef o creamos un recordset y le ponemos en Opciones DbRunAsync, la operación se realiza de forma asíncrona, por lo tanto no sabemos cuando tendremos disponible el objeto a crear o los datos de la consulta. Para poder controlar si la operación se está realizando todavía leeremos la propiedad StillExecuting, que devolverá True si todavía se está ejecutando, y False si ha terminado.  Basta con hacer un bucle del tipo

 

Do While MiConexion.StillExecuting = True

DoEvents

Loop

 

Mientras la propiedad StillExecuting sea True, no se puede tener acceso a ningún objeto devuelto. Por ejemplo, no pretenda crear un recordset con MiConexion Mientras que StillExecuting sea True, pues MiConexión no existe aún.

 

Esta propiedad puede ser muy útil cuando tiene consultas encadenadas y necesita esperar a que termine una para comenzar con la siguiente.

 

StillExecuting se utiliza con los objetos y para las operaciones siguientes:

 

 

Objeto Connection,  para controlar que aún se está ejecutando uno de los métodos Execute u OpenConnection

Objeto QueryDef, para comprobar su método Execute

Recordset, donde podrá comprobar si aún se están realizando los métodos Move, NextRecordset u OpenRecordset

 

Para ver el valor que tiene la propiedad StillExecuting deberá poner el nombre del objeto que quiere comprobar (Connection, QueryDef o Recordset) después de haber iniciado uno de los métodos citados anteriormente. Por ejemplo, para esperar a que se haya creado el objeto Connection MiConexion, haremos un bucle de la siguiente forma

 

Set MiConexion = MiSesion.OpenConnection("Luki1", dbDriverNoPrompt)

Do While MiConexion.StillExecuting = True

Aquí las instrucciones que quiera

Loop

 

Método Cancel

 

Cancela la ejecución de un método asícrono de llamada. Sólo funciona espacios de trabajo ODBCDirect.

 

Sintaxis            objeto.Cancel

 

La sintaxis del método Cancel consta de las siguientes partes:

 

Objeto puede ser:

Connection para cancelar el método Execute u OpenConnection

QueryDef, para cancelar el método Execute

Recordset para cancelar el método OpenRecordset

 

El método Cancel solamente sirve para cancelar la ejecución de una llamada asíncrona de los métodos Execute, OpenConnection u OpenRecordset que se hayan invocado con la opción dbRunAsync. Cancel devolverá un error de tiempo de ejecución si en el método que está intentando finalizar no se utilizó dbRunAsync.

 

Objetos Database y QueryDef en el espacio de trabajo ODBCDirect

 

Repasemos la estructura jerárquica de los objetos de acceso a datos en el espacio de trabajo ODBCDirect. Podemos ver que siguen existiendo, aparte de los ya estudiados en este capítulo, dos objetos que ya nos son conocidos: el QueryDef y el Database. Veamos cada uno de ellos.


Fig. 13-6  Estructura jerárquica de los objetos de acceso a datos en el espacio  ODBCDirect

 


Objetos QueryDef en el espacio de trabajo ODBCDirect

 

Habíamos visto en el capítulo 20 que un QueryDef era una consulta cuando todavía no estaba guardada en el disco. Es decir, un QueryDef es una consulta en memoria RAM. Ese QueryDef se transforma en una consulta de la base de datos una vez que se cierra el objeto Database.

 

En el espacio de trabajo ODBCDirect no se pueden crear bases de datos. Se pueden crear objetos QueryDef, que en este caso serán objetos efímeros, que solamente existirán en la memoria RAM, desapareciendo en el momento que cerremos ese QueryDef o cerremos la aplicación.

Puede crear un QueryDef para crear posteriormente a partir de él un Recordset con el que puede presentar o escribir el contenido de los registros. En el siguiente ejemplo hemos abierto la conexión, y como paso previo a la creación del recordset hemos creado un QueryDef  con todos aquellos registros cuyo campo Apellidos sea igual a Alvarez Pérez.  Una vez creado ese QueryDef, hemos creado un recordset a partir de él.  No tiene mucho sentido hacer esto ya que podríamos crear directamente el recordset imponiendo esa condición en el campo Apellidos. Se expone aquí con fines didácticos, no prácticos.

 

DBEngine.DefaultType = dbUseODBC

Set MiSesion = Workspaces(0)

Set MiConexion = MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")

Set MiConsulta = MiConexion.CreateQueryDef ("Pepito", "Select * From Personal Where Apellidos = "Alvarez Pérez")

Set RsODBC = MiConsulta.OpenRecordset(dbOpenDynaset, dbRunAsync, dbOptimistic)

If RsODBC.AbsolutePosition <> -1 Then

RsODBC.MoveLast

RsODBC.MoveFirst

LNumRegs = RsODBC.RecordCount

LNumReg = RsODBC.AbsolutePosition + 1

PresentaDatos

Else

MsgBox "El recordset no tienen ningún registro"

End If

Puede apreciar en la fig. 13-6 otro objeto que está jerárquicamente debajo del QueryDef. El Objeto Parameter. Este objeto sirve para cambiar los parámetros que se le pasan al QueryDef para crearlo. Le remito a la ayuda de VB para mayor explicación de este objeto.

 

El objeto Database en el espacio de trabajo ODBCDirect

 

En el espacio ODBCDirect puede también abrir un objeto Database en vez de un objeto Connection. La diferencia a la hora de crear un objeto Database (abrir una base d e datos) entre el espacio de trabajo Microsoft Jet y ODBCDirect es que en el primero abrimos directamente el fichero de la base de datos, y en el segundo, abrimos el fichero que indique el enlace ODBC. Deberemos suministrarle información del enlace ODBC que debe usar. La sintaxis sigue siendo igual que en el espacio de trabajo Microsoft Jet:

 

Set MiBaseDatos = MiSesion.OpenDatabase (Nombre, Opciones, Sólolectura, Conexión)

 

Para indicarle el enlace ODBC que debe usar puede hacerlo de las dos formas que venimos viendo para los parámetros Nombre y Conexión. Si indica el nombre del enlace en el parámetro Nombre lo aceptará y será necesario poner el parámetro Conexión. Si `pone un nombre cualquiera en el parámetro Nombre deberá indicar el nombre del enlace en el parámetro Conexión.

 

Esta posibilidad de crear un objeto Database nos aproxima aún más al código empleado en el espacio de trabajo Microsoft Jet. Por lo tanto puede ser muy útil usar este objeto en aquellos casos en los que ya se había escrito el código, y pasamos posteriormente a usar ODBC.

 

DBEngine.DefaultType = dbUseODBC

Set MiSesion = Workspaces(0)

'En la siguiente línea le pasamos el nombre del enlace ODBC en el parámetro Nombre

Set MiBaseDatos = MiSesion.OpenDatabase("Luki", dbDriverNoPrompt)

'Pero podríamos haberselo pasado en el parámetro Conexión y ponerle como parámetro 'nombre cualquier cadena de caracteres

Set MiBaseDatos =

  MiSesion.OpenDatabase("BaseDatos1", dbDriverNoPrompt, False, "ODBC;DSN=Luki")

'Ahora creamos el recordset, como en los otros casos

Set RsODBC = MiBaseDatos.OpenRecordset("Personal", dbOpenDynaset, dbRunAsync, dbOptimistic)

If RsODBC.AbsolutePosition <> -1 Then

RsODBC.MoveLast

RsODBC.MoveFirst

LNumRegs = RsODBC.RecordCount

LNumReg = RsODBC.AbsolutePosition + 1

PresentaDatos

Else

MsgBox "La base de datos no tiene ningún registro"

End If

 

Mediante los ejemplos expuestos en este capítulo espero que el alumno comprenda como trabaja DAO a través de ODBC, mediante el ODBCDirect. 

No olvide que sigue tratándose de DAO, y que por lo tanto deberá poner la misma referencia (En Proyecto | referencia) que en el caso del DAO trabajando en el espacio de trabajo Microsoft Jet.  En la siguiente parte de este capítulo se estudiarán los objetos RDO, objetos que trabajan exclusivamente a través de ODBC. Con las ideas captadas hasta aquí verá que es sencillo abordar estos nuevos objetos.

Home | VB |