5753287 Capitulo 13 Visual Basic

Embed Size (px)

Citation preview

Visual Basic - Gua del Estudiante Cap. 13Acceso a Bases de Datos remotas mediante el motor Jet ODBCDirect Acceso a Bases de Datos remotas mediante objetos RDO Acceso a Bases de Datos remotas mediante el motor Jet ODBCDirectHasta ahora todos los accesos realizados a una base de datos los hemos realizado directamente a travs 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 comn 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 comn 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 fcil 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 comn, deber suministrarlo el fabricante de la base. Microsoft desarroll varios drivers para otras tantas bases de datos y hojas de clculo. Entre ellas para Access y Excel, dBase y FoxPro. Tambin 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 conexin. La conexin ODBC es el conjunto de datos que hay que aportarle a Windows para que pueda enlazar nuestra aplicacin con la base de datos. Estos datos son, al menos: El nombre de la conexin, 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 conexin. La conexin ODBC no la realiza Visual Basic. La realizar Windows. Veamos como podemos establecerla. Vaya a Inicio | Configuracin | 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 estn establecidos. Estos enlaces puede establecerlos para un usuario (DSN de usuario), de sistema o de archivo. La eleccin 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 funcionarn 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 lnea figura otro dato: Microsoft Access Driver.(*.mdb) Esto significa que el enlace de nombre Luki est usando el driver ODBC de Access. Y significa tambin que si queremos llamar a esa conexin deberemos llamarla por su nombre : Luki

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 1

Fig. 13-1 Creacin de un enlace ODBC. Muestra las conexiones existentes (una vez creada la conexin Luki) Sigamos con la creacin del enlace ODBC. Para crear uno nuevo, haga click en el botn Agregar de la figura 13-1. Le aparecer un cuadro donde le pide el driver que quiere utilizar.

Fig. 13 2 Eleccin 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

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 2

Fig. 13-3 Introduccin del nombre del enlace, comentario (descripcin) y base de datos asociada al enlace ODBC Veamos los datos que hemos introducido en nuestra conexin Luki Nombre del Origen de datos. Luki Descripcin (Opcional) Conexin ODBC Cap. 21 Haciendo click en Base de Datos | Seleccionar nos muestra un cuadro de dilogo donde `podemos buscar la base de datos. Se elige la base de datos deseada. Hacemos click en ACEPTAR y ya est creada la nueva conexin. 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 restriccin de acceso. Una vez creada la conexin podemos utilizarla para conectar nuestra aplicacin con la base de datos. El proceso para ello consiste en algo parecido a lo que hacamos 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 conexin nos aporta mayor versatilidad a las aplicaciones. Piense por ejemplo un caso en el que se emplea una base de datos Access. Si quisisemos ampliar las prestaciones de la base de datos de esa aplicacin posiblemente pensaramos en migrar la BD a Oracle o SQLServer. Si atacamos a la base de datos a travs de ODBC solamente deberamos cambiar la conexin, tal como vimos ms atrs. Nuestro programa seguira llamando a la misma conexin ODBC, pero esta conexin, ahora, abrira una base Oracle o SQLServer en vez de la Access que abra originalmente. No necesitaramos realizar ninguna modificacin en nuestro programa. Este razonamiento es vlido para cualquier sistema de acceso a bases de datos a travs 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 mtodos y funciones, por lo que el cambio de cdigo es mnimo. El cambio se limita prcticamente 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 conexin Luki tal como se describi mas atrs. La tabla personas tiene solamente tres campos: ID_Alumno, Nombre y Apellidos. Creamos una interface grfica sencilla

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 3

Fig. 13-4 Nuestra primera aplicacin con ODBCDirect Mediante esta sencilla aplicacin queremos visualizar los datos existentes, aadir nuevos registros y borrar el registro actual. Veamos el cdigo con los comentarios oportunos. General/Declaraciones Option Explicit Dim MiSesion As Workspace Dim MiConexion As Connection Dim RsODBC As Recordset 'Declaramos las variables tipo objeto

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 conexin 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 ningn 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

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 4

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

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 5

End Sub Public Sub Limpia() TB_ID = "" TB_Nombre = "" TB_Apellido = "" End Sub Observe que casi todo el cdigo es igual que el que escribiramos si hubisemos utilizado el espacio de trabajo Microsoft Jet. Solamente hemos utilizado cdigo 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 Captulo 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 disemos ningn valor a esa propiedad, tomara el otro valor posible (dbUseJet) que es su valor por defecto. Por eso, cuando utilizbamos los mtodos CreateDataBase u OpenDatabase no necesitbamos darle ningn valor a esa propiedad. Set MiConexion = "ODBC;DSN=Luki") MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False,

Vea mas abajo la informacin de OpenConnection para ver los parmetros que hay que pasarle a este mtodo. Set RsODBC = MiConexion.OpenRecordset("Personal", dbOpenDynamic, dbRunAsync, dbPessimistic) Vea mas abajo una ampliacin del mtodo OpenRecordset

Mtodo OpenConnectionEs un mtodo 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 sera 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, Slolectura y Conectar) En el ejemplo: Set MiConexion = "ODBC;DSN=Luki") MiSesion.OpenConnection("Conexion1", dbDriverNoPrompt, False,

Veamos que son los parmetros Nombre, Opciones, Slolectura y Conectar Nombre es el nombre de la conexin (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 conexin en toda la aplicacin. Nombre no lo usar normalmente) El parmetros Nombre puede ser una cadena cualquiera, o el nombre del enlace ODBC establecido en Windows (que en nuestro ejemplo sera Luki). Si opta por poner una cadena cualquiera (como hicimos en el ejemplo, Conexin1) deber poner el nombre del enlace ODBC en el parmetro Conectar. Si opta por poner el nombre del enlace ODBC, Visual Basic

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 6

interpreta que debe conectar a travs de ese enlace y ya no necesita poner ningn valor al parmetro Conectar. Opciones Este parmetro es para definir que tipo de respuesta va a dar el administrador del controlador de ODBC para solicitar al usuario informacin sobre la conexin (Nombre del origen de datos (DSN), nombre del usuario y contrasea). Puede tomar uno de los siguientes valores: DbDriverNoPrompt El administrador del controlador de ODBC toma los datos de los parmetros Nombre y Conectar para saber cual es el enlace ODBC que debe usar. Si no proporciona suficiente informacin, se producir un error de tiempo de ejecucin. DbDriverPrompt El administrador del controlador de ODBC muestra el cuadro de dilogo de ODBC, que muestra todos los enlaces ODBC existentes. La conexin se hace con el DSN que selecciona el usuario en ese cuadro de dilogo.

Fig. 13.5 Cuadro de dilogo de ODBC Una vez seleccionada la conexin, aparecer otro cuadro solicitando el nombre de inicio de sesin y la contrasea. En resumen, con este parmetro 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 opcin se comporta (aparentemente) como si se pone DbDriverNoPrompt Slolectura (Opcional). True si la conexin se va a abrir con acceso de slo lectura y False si la conexin se va a abrir para acceso de lectura/escritura (predeterminado) Conectar (Opcional si se ha puesto el nombre del enlace en el parmetro Nombre). Este parmetro est formado por varias partes. Una, obligatoria, que contiene la expresin "ODBC;" Otra parte obligatoria, si no ha puesto en el parmetro Nombre el nombre del enlace ODBC es

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 7

"DSN = NombredelaConexin;" Si desea especificar el usuario propietario de esa conexin debe aadir "UID = usuario;" y como ese usuario tendr una contrasea, deber aadirla tambin "PWD = contrasea;" Tambin 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 peticin ODBC. Este tiempo deber introducirlo con la expresin "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 parmetros UID y/o el PWD, estos datos se obtendrn de las propiedades UserName y Password del objeto Workspace.

Mtodo OpenRecordsetEste mtodo ya se estudi en el captulo 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 instruccin 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 dinmico ODBC DbOpenDynaset Abre un objeto Recordset de tipo Dynaset, similar al estudiado en el captulo 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 atrs. Este es el tipo que crear por defecto si no se especifica nada en el parmetro Tipo. Opciones Debe indicar uno de estos dos valores (si no pone alguno de ellos da error): DbRunAsync Ejecuta una consulta asncrona, que es la forma normal de trabajar del ODBC. Esto permite a su aplicacin seguir procesando otras instrucciones mientras se ejecuta la consulta en segundo plano (Vea mas adelante la propiedad StillExecuting dbExecDirect Ejecuta una consulta saltando el mtodo SQLPrepare y llamando directamente al mtodo SQLExecDirect. Utilice esta opcin slo cuando no se abra un objeto Recordset basndose en una consulta de parmetros. Para obtener ms informacin, consulte la "Referencia del programador de Microsoft ODBC 3.0." Bloquearmodificaciones Este parmetro 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 parmetro 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 aadir registros en el recordset, utilizando el criterio de bloqueo pesimista. Esto significa que bloquea la pgina donde se encuentra el registros desde que se ejecuta el mtodo 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 ningn tiempo de espera, por ejemplo a que el

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 8

usuario introduzca un dato. (El tamao de una pgina depende de la base de datos que est usando. En Access es de 2048 Bytes. Esto significa que solamente tendr bloqueada una parte relativamente pequea de la base de datos, pudiendo modificar otros registros que estn fuera de ese segmento de 2 Kbytes. Lgicamente este bloqueo solamente tendr efecto cuando est trabajando en un entorno multiusuario. DbOptimistic Permite cambiar datos y aadir registros en el recordset, utilizando el criterio de bloqueo optimista. El bloqueo optimista significa que solamente estar bloqueada la pgina que contiene el registro mientras se ejecuta el mtodo Update. Esto puede ocasionarle que, si estn dos usuario trabajando sobre el mismo registro, se introduzca un dato errneo. Parece as en principio que no se debe usar, pero todo va a depender de la aplicacin, de sus datos, y de la probabilidad de que ocurra esa colisin. La ventaja que tiene es que tiene menos tiempo bloqueada la pgina de la base de datos. dbOptimisticValue Utiliza la concurrencia optimista basndose en valores de fila. Funciona de forma similar al dbOptimistic. dbOptimisticBatch Activa la actualizacin optimista por lotes. Actualizacin 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 estn almacenadas en el bfer local y despus ejecuta una actualizacin por lotes. Este modelo de cursor tambin permite al cliente cancelar la conexin con el servidor y volverla a establecerla con el mismo servidor o con otro diferente. Para utilizar la actualizacin 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 conexin y se debe abrir el Recordset con el argumento de tipo de bloqueo del mtodo OpenRecordset establecido a dbOptimisticBatch.

Propiedad StillExecutingCuando abrimos una conexin mediante OpenConnection, un QueryDef o creamos un recordset y le ponemos en Opciones DbRunAsync, la operacin se realiza de forma asncrona, por lo tanto no sabemos cuando tendremos disponible el objeto a crear o los datos de la consulta. Para poder controlar si la operacin se est realizando todava leeremos la propiedad StillExecuting, que devolver True si todava 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 ningn objeto devuelto. Por ejemplo, no pretenda crear un recordset con MiConexion Mientras que StillExecuting sea True, pues MiConexin no existe an. 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 an se est ejecutando uno de los mtodos Execute u OpenConnection Objeto QueryDef, para comprobar su mtodo Execute Recordset, donde podr comprobar si an se estn realizando los mtodos Move, NextRecordset u OpenRecordset

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 9

Para ver el valor que tiene la propiedad StillExecuting deber poner el nombre del objeto que quiere comprobar (Connection, QueryDef o Recordset) despus de haber iniciado uno de los mtodos 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

Mtodo CancelCancela la ejecucin de un mtodo ascrono de llamada. Slo funciona espacios de trabajo ODBCDirect. Sintaxis objeto.Cancel

La sintaxis del mtodo Cancel consta de las siguientes partes: Objeto puede ser: Connection para cancelar el mtodo Execute u OpenConnection QueryDef, para cancelar el mtodo Execute Recordset para cancelar el mtodo OpenRecordset El mtodo Cancel solamente sirve para cancelar la ejecucin de una llamada asncrona de los mtodos Execute, OpenConnection u OpenRecordset que se hayan invocado con la opcin dbRunAsync. Cancel devolver un error de tiempo de ejecucin si en el mtodo que est intentando finalizar no se utiliz dbRunAsync.

Objetos Database y QueryDef en el espacio de trabajo ODBCDirectRepasemos la estructura jerrquica 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 captulo, dos objetos que ya nos son conocidos: el QueryDef y el Database. Veamos cada uno de ellos.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 10

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

Objetos QueryDef en el espacio de trabajo ODBCDirectHabamos visto en el captulo 20 que un QueryDef era una consulta cuando todava 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 sern objetos efmeros, que solamente existirn en la memoria RAM, desapareciendo en el momento que cerremos ese QueryDef o cerremos la aplicacin. 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 conexin, y como paso previo a la creacin del recordset hemos creado un QueryDef con todos aquellos registros cuyo campo Apellidos sea igual a Alvarez Prez. Una vez creado ese QueryDef, hemos creado un recordset a partir de l. No tiene mucho sentido hacer esto ya que podramos crear directamente el recordset imponiendo esa condicin en el campo Apellidos. Se expone aqu con fines didcticos, no prcticos. 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 Prez") 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 ningn registro" End If

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 11

Puede apreciar en la fig. 13-6 otro objeto que est jerrquicamente debajo del QueryDef. El Objeto Parameter. Este objeto sirve para cambiar los parmetros que se le pasan al QueryDef para crearlo. Le remito a la ayuda de VB para mayor explicacin de este objeto.

El objeto Database en el espacio de trabajo ODBCDirectEn el espacio ODBCDirect puede tambin 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 informacin 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, Slolectura, Conexin) Para indicarle el enlace ODBC que debe usar puede hacerlo de las dos formas que venimos viendo para los parmetros Nombre y Conexin. Si indica el nombre del enlace en el parmetro Nombre lo aceptar y ser necesario poner el parmetro Conexin. Si `pone un nombre cualquiera en el parmetro Nombre deber indicar el nombre del enlace en el parmetro Conexin. Esta posibilidad de crear un objeto Database nos aproxima an ms al cdigo 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 haba escrito el cdigo, y pasamos posteriormente a usar ODBC. DBEngine.DefaultType = dbUseODBC Set MiSesion = Workspaces(0) 'En la siguiente lnea le pasamos el nombre del enlace ODBC en el parmetro Nombre Set MiBaseDatos = MiSesion.OpenDatabase("Luki", dbDriverNoPrompt) 'Pero podramos haberselo pasado en el parmetro Conexin y ponerle como parmetro '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 ningn registro" End If Mediante los ejemplos expuestos en este captulo espero que el alumno comprenda como trabaja DAO a travs de ODBC, mediante el ODBCDirect. No olvide que sigue tratndose 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 captulo se estudiarn los objetos RDO, objetos que trabajan exclusivamente a travs de ODBC. Con las ideas captadas hasta aqu ver que es sencillo abordar estos nuevos objetos.

Visual Basic - Gua del Estudiante Cap. 13 ContinuacinAcceso a Bases de Datos remotas mediante objetos RDO

En la primera parte de esta captulo hemos visto como acceder a bases de datos a travs de ODBC usando el motor JET. El acceso se realizaba mediante ODBCDirect, modo de operacin del motor JET, y podamos usar la misma sintaxis y objetos que habamos visto con los objetos DAO. Tambin vimos como crear un enlace ODBC, enlace que vamos a utilizar en LSB Visual Basic - Gua del estudiante. Captulo 13 Pgina 12

este captulo. Como ya se explic en el captulo anterior, damos por supuesto que el alumno conoce como crear ese enlace. Los objetos RDO se crearon para cubrir el hueco que tena VB para conectar con bases de datos distintas a las que trabaja el motor JET. (Access, dBase, FoxPro, etc.). Esta forma de trabajar nos permite enlazar con bases de datos tipo Oracle o SQLServer, pero tambin nos permite trabajar con Access, dBase o FoxPro, que tambin tienen su propio driver ODBC. Lo primero que nos encontramos al trabajar con RDO es que es ms lento que DAO. Si creamos dos aplicaciones que trabajen sobre una base Access, una directamente a travs de DAO y otra a travs de RDO, observaremos que la primera accede a la BD con una rapidez mayor que la segunda. Normal, no es lo mismo abrir un fichero y leerlo (que es lo que hace DAO) que pasar unos parmetros a otro programa (Driver ODBC de Access) para que este abra el fichero, obtenga los datos y nos los pase. Lo mismo podemos decir cuando tenemos que contar registros, movernos de un registro a otro, editar o aadir nuevos registros. Esa falta de rapidez es el coste de la tecnologa de bases abiertas. Lo segundo que nos va a llamar la atencin es el nombre de los objetos de acceso a datos. Una vez que nos habamos familiarizado con palabras como Recordset, DataBase o Dynaset, nos las cambian por rdoResultset, rdoConnection o Keyset respectivamente. Y lo peor no es solamente tener que aprender sus nombres, sino que en una aplicacin hecha en DAO que sea necesaria cambiarla a RDO, nos vemos obligados a retocar la mayor parte de las lneas de cdigo (Cosa que no ocurra con ODBCDirect) Y lo tercero, RDO no tiene la posibilidad de crear bases de datos como hacamos en DAO. Normal, ya que en este caso no trabajamos directamente sobre la BD sino sobre la conexin ODBC que Windows realiz a una base de datos. Podemos aadir mas desventajas de RDO: no puede contar los registros que tiene, tiene un comportamiento muy irregular con la propiedad AbsolutePosition, y varios detalles que procuraremos explicar en este captulo para ahorrar al alumno el trabajo de tener que experimentarlos por s mismo. (Aunque, consejo de viejo profesor, es la forma ms segura de aprenderlos). Tras estos inconvenientes parece lgico encontrar alguna contrapartida positiva. Por ejemplo poder conectar con cualquier tipo de base de datos, pudiendo incluso realizar la aplicacin atacando una base Access, para luego trabajar con una base SQLServer u Oracle sin variar ni una lnea de cdigo. Esa debera ser la gran ventaja de RDO. Pero lamentablemente, y en contra de toda teora de ODBC, no es cierto. Si preparamos una aplicacin en RDO trabajando con una base Access y pretendemos cambiar la base por otra SQLServer, observaremos que lo que funciona perfectamente en la primera no funciona en la segunda. (Y esto no es teora. Es simplemente experiencia del autor). Y Access y SQLServer son del mismo fabricante!. La razn est en que los drivers de una base y otra no trabajan exactamente igual. Tampoco son iguales las protecciones y los permisos de acceso. Consejo de viejo profesor: Si va a trabajar con una determinada base de datos a travs de RDO comience el proyecto usando esa base de datos. Y puestos a dar consejos, si piensa usar SQLServer u Oracle y si la aplicacin va a escribir datos en la base no use RDO. Si solamente los va a leer no tendr problemas. Y si tiene problemas nadie se los va a resolver, argumentando que deje RDO y use ADO. De hecho RDO ya se ha quedado obsoleto al nacer ADO. Pero eso ser objeto de otro captulo de esta Gua del Estudiante y hoy nos toca aprender RDO. Comencemos.

RDO y DAO. Comparacin de sus objetos. El control RemoteDataAl igual que DAO, RDO tiene objetos de acceso a datos, que deberemos declarar y crear. Mediante estos objetos podemos leer y escribir datos en una BD mediante cdigo. Tambin, al igual que en DAO exista el Control Data, con el que podamos acceder a la base de datos sin escribir ni una lnea de cdigo, en RDO existe un control similar: el Control RemoteData. El funcionamiento es similar, pero las propiedades son distintas y tienen distintos nombres. Mediante el control RemoteData podemos enlazar una base de datos a los tpicos controles enlazados a datos (Label, TextBox, DBGrid), pero en este caso se enlazan a travs de una conexin ODBC, por lo que es fcil pensar que las propiedades de este control y los valores que deben tomar son distintas a los del control Data. Como es mucho ms sencillo (sencillo no

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 13

quiere decir mejor) usar el control RemoteData que trabajarse con cdigo los objetos de acceso a datos, vamos a comenzar estudiando este control. Pero antes vamos adelantar la equivalencia entre los objetos DAO y los objetos RDO. La lista siguiente est copiada literalmente de la informacin de Microsoft MSDN Library Visual Studio, informacin que merece la pena instalarla en su ordenador pese a lo que ocupa. Objetos de datos remotos y los objetos de DAO/Jet equivalentes Objeto de RDO Objeto de DAO/Jet equivalente rdoEngine DBEngine rdoError Error rdoEnvironment Workspace rdoConnection Database rdoTable TableDef No est implementado Index rdoResultset Recordset No implementado Tipo Table Tipo Keyset Tipo Dynaset Tipo static Tipo Snapshot Tipo dynamic (ninguno) Tipo forward-only Tipo forward-only No implementado (*) User RdoColumn Field rdoQuery QueryDef rdoParameter Parameter No implementado (**) Relation No implementado (*) Group Control RemoteData Control Data (*) En RDO, los usuarios y grupos de usuarios son precisamente los que lleve implcitos la conexin ODBC. (**) Al no trabajar directamente sobre la base de datos, no se pueden crear relaciones en ella.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 14

El control RemoteDataEste control nos permite crear una aplicacin de acceso a datos completa sin utilizar cdigo. Eso s, ser necesario tener una conexin ODBC hecha, ya que el control RemoteData no abre un fichero de BD sino una conexin ya establecida. No est normalmente en la caja de herramientas, por lo que habr que aadirlo en Proyecto | Componentes introduciendo el Microsoft Remote Data Control 6.0 El control Remote Data tiene un aspecto similar al control Data, tanto en la caja de herramientas como en el formulario:

El control RemoteData toma por defecto el nombre MSRDCx. Algunas Propiedades del Control RemoteData DatasourceName Devuelve o establece el nombre del origen de datos (DSN). El DSN No es ms que el nombre de la conexin ODBC. Esta propiedad se puede dejar en blanco si la propiedad Connect del control identifica un nombre de origen de datos (DSN) registrado en el Registro de Windows. Sintaxis NombredelControlRDO.DatasourceName = MiConexin

Puede cambiarse en tiempo de ejecucin. En este caso, inmediatamente debe utilizar el mtodo Refresh para abrir la nueva conexin con la base de datos. Puede leer el valor de esta propiedad. Le devolver precisamente el DNS que est utilizando. Esta propiedad slo le devolver un valor si ha introducido previamente algn valor en la propiedad DatasourceName. No le devolver valor alguno si ha introducido la conexin a travs de la propiedad Connect. Propiedad Connect Esta propiedad cumple la misma funcin que la anterior, pero por otro camino. Mediante la propiedad Connect le introducimos al control RemoteData la informacin necesaria para abrir la conexin, incluyendo en esta informacin, no solamente el nombre de la conexin, como hacamos con la propiedad DatasourceName, sino ampliarla con otros datos de la conexin, tal como el nombre del usuario, su contrasea, nombre del controlador ODBC a usar, el nombre de la base de datos, el servidor donde se ubica esta base de datos, nombre de la estacin de trabajo desde la que vamos a trabajar e incluso el nombre de la aplicacin en la que vamos a usar los datos de esa base. Esta propiedad es mucho ms completa que la anterior, pero un poco ms complicada de usar. Para introducir los datos de la propiedad Connect deber usar una palabra para definir el dato, seguido del signo = y del dato a introducir. Como final del dato debe introducir necesariamente el signo punto y coma ; DSN Origen de datos ODBC registrado. UID Nombre de un usuario reconocido PWD Contrasea asociada al usuario DRIVER Descripcin del controlador DATABASE Base de datos predeterminada para usarla una vez conectado SERVER Nombre del servidor donde se aloja la base de datos DSN=MiConexinODBC; UID=Luis; PWD=MiContrasea; DRIVER=SQL Server; DATABASE=MiBase; SERVER=MiServidor;

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 15

WSID APP

Nombre de la estacin de trabajo (Nombre del PC que se va a comunicar con el servidor Nombre de la Aplicacin que va a Usar la Base de Datos

WSID=NombredemiPC; APP=MiAplicacin

NOTA - Si conoce SQLServer, DATABASE es el nombre de la base de datos que quiere utilizar una vez realizada la conexin. Para los que no conocen SQLServer, dentro de un fichero de esta base de datos pueden existir varias bases de datos. Y cada una de ellas puede tener varias tablas. Es decir, la configuracin de esta BD no es tan simple como la de Access. Cada una de estas bases de datos tiene un propietario y varios usuarios. Cada usuario tiene habilitadas unas funciones (p.e. un usuario puede leer y escribir y otro solamente leer) Este parmetro le indica cual de esas bases de datos que contiene el fichero de SQLServer (para hablar con mas propiedad, el sistema de ficheros de SQLServer)

SQLServer mostrando su carpeta de Bases de Datos (BDGepa, master, model, ) Observe que tras cada parmetro existe un separador ; No es necesario introducir todos los datos. Depender del driver, de cmo haya creado la base de datos, los atributos que le dio a cada uno de los usuarios. Y como no, depender del tipo de base de datos que est usando (SQLServer, Oracle, etc.). Recuerde lo mencionado ms atrs. No se fe nunca de que su aplicacin trabaja perfectamente sobre una base de datos. Lo ms probable es que si cambia de BD ya no le trabajar tan perfectamente. Veamos un ejemplo de cmo introducir esta propiedad: Dim MiVariable As String MiVariable = "DSN=MiConexionODBC;UID=Luis;PWD=MiContrasea;DATABASE=BaseGE;" RemoteData1.Connect = MiVariable El hecho de que podamos abrir una base de datos mediante DatasourceName o Connect tiene su explicacin. Si tenemos creada una conexin ODBC con todos los datos necesarios para que pueda abrir una base de datos, es mucho ms simple usar la propiedad DatasourceName y el Control RemoteData le abrir perfectamente la BD. Pero cuando

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 16

usamos una BD a travs de Red de Area Local, lo normal es que esa base est compartida por varios usuarios, que cada uno tendr un nombre y un Password, que puede estar habilitado para trabajar desde un puesto o desde varios puestos, e incluso puede estar habilitado para trabajar sobre una BD utilizando una determinada aplicacin, y no estarlo para utilizar esa misma BD con una aplicacin distinta. Por eso este control nos brinda las dos posibilidades, una sencilla, DatasourceName, para trabajar con los datos ya introducidos en la conexin ODBC, y la otra, para variar los datos de esa conexin ODBC ya existente y lograr con ello todas las ventajas que nos ofrece ODBC respecto a restricciones de usuarios, contraseas, etc. (la conexin ODBC en este caso es muy normal que tenga solamente el nombre, y que no apunte a ninguna base de datos concreta). Puede incluso utilizar ambas propiedades. Es muy tpico por ejemplo, que la conexin apunte a una determinada base de datos, (el nombre de la conexin se lo pasamos en la propiedad DatasourceName) y que en la propiedad Connect le pasamos el nombre del usuario y la contrasea. Puede utilizar el control, RemoteData incluso sin tener una conexin preestablecida. Pero deber establecer mediante el programa, utilizando los mtodos OpenConnection o EstablishConnection. Se sale del contenido deseado para este curso comentar estos mtodos, pero el alumno aventajado puede intentar obtener informacin en la escasa bibliografa existente. No le recomiendo que se complique la vida rizando el rizo, pudiendo establecer previamente la conexin ODBC.

Propiedad SQLMediante las dos propiedades estudiadas, DatasourceName y Connect hacemos que el control RemoteData sepa la conexin sobre la que va a trabajar - y por lo tanto la base de datos que utilizar. Ahora nos falta indicarle los datos que deseamos leer o escribir. Nos falta lo que sera en DAO, darle los datos para crear el Recordset (Por ejemplo el nombre de una tabla o una sentencia SQL, tal como hacamos en la propiedad RecordSource del control Data). Para el control RemoteData esta informacin se le introduce en la propiedad SQL La propiedad SQL establece o devuelve una instruccin SQL vlida para crear un conjunto de registros a partir del origen de datos establecido en las propiedades DatasourceName o Connect. Esta instruccin SQL debe comenzar necesariamente por SELECT, En tiempo de ejecucin, podemos asignar a esta propiedad el nombre de una Consulta ya almacenada en la BD, pero en este caso, debemos anteponer la palabra EXECUTE. Tambin podemos introducir en esta propiedad un rdoQuery, un rdoResultset o un rdoTable. Eso lo veremos ms adelante. Para establecer esta propiedad en tiempo de diseo, basta con escribir la instruccin SQL en la ventana de propiedades. Una instruccin tpica sera SELECT * From Alumnos SELECT * From Alumnos Where Apellido1= 'Surez' En tiempo de ejecucin podemos introducir una de estas instrucciones en la propiedad SQL MSRDC1.SQL = "SELECT * From Alumnos Where Apellido1= 'Surez'" Si la BD tiene una consulta (la tpica consulta de Access) llamada C_Suarez, donde hemos seleccionado todos los registros cuyo campo Apellido1 sea Surez, podemos poner: MSRDC1.SQL = EXECUTE C_Suarez (No intente hacer esto mismo con el nombre de una tabla. Solamente sirve para consultas) Con los registros seleccionados por la propiedad SQL, formamos lo que en DAO era un recordset, pero en este caso adopta otro nombre: rdoResultset. En RDO se ha buscado otra terminologa, posiblemente para diferenciarlo claramente de DAO. Por ejemplo, en vez de registros es habitual hablar de Filas, y en vez de campos, hablamos de Columnas.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 17

Si pudisemos crear un rdoResultset mediante algn procedimiento, (y seguro que podremos hacerlo), podemos introducir directamente ese rdoResultset como rdoResultset del control RemoteData, al igual que lo hacamos con el Recordset del Control Data en DAO: Set MSRDC1.Resultset = rdoResultsetYaCreado

Propiedad ConnectionVeamos previamente que es un objeto rdoConnection. Un Objeto rdoConnection es un objeto de acceso a datos remotos. Es el equivalente al objeto Database en DAO (Vea cuadro pgina 2) El control RemoteData tiene un objeto rdoConnection subyacente y podemos "verlo" mediante esta propiedad. El poner verlo entre comillas no significa otra cosa que, al igual que ocurra con el objeto Database, el objeto rdoConnection es un objeto de acceso a datos del que podemos ver sus propiedades y ejecutar sus mtodos. Por ejemplo, si queremos ver la cadena de conexin completa podemos analizar la propiedad Connect del Objeto Connection: Label1 = MSRDC1.Connection.Connect Si deseamos saber si el control RemoteData sigue conectado para realizar una determinada operacin: If MSRDC1.Connection.StillConnecting Then . Podemos ejecutar uno de sus mtodos. Por ejemplo, cerrar la conexin MSRDC1.Connection.Close

Propiedades EOFAction y BOFActionEstablecen el comportamiento del RemoteData cuando llega a la fila anterior a la primera o a la fila posterior a la ltima. (Y no es un juego de palabras) Puede establecerse en tiempo de diseo, mediante la caja de propiedades, o en tiempo de ejecucin mediante la siguiente sintaxis: MSRDC1.BOFAction = valor MSRDC1.EOFAction = valor Los valores (o constantes) que puede tomar son los siguientes: Para la propiedad BOFAction Valor 0 1 Constante rdMoveFirst rdBOF Efecto Se mueve a la primera fila Se mantiene en la fila anterior a la primera. Se genera el evento Validate y a continuacin el evento Reposition, y se desactiva el botn de desplazar hacia abajo

Para la propiedad EOFAction Valor 0 1 2 Constante rdMoveLast rdEOF rdAddNew Efecto Se mueve a la ltima fila Se queda en la fila posterior a la ltima. Se genera el evento Validate y a continuacin el evento Reposition. Se desactiva el botn de desplazar hacia arriba. Crea una nueva fila.

La propiedad EOFAction slo tiene efecto cuando se manipula el cambio de filas mediante el ratn, sobre los botones del control RemoteData. No tiene efecto si se llega a la fila posterior a la ltima mediante cdigo. (Por ejemplo, mediante la instruccin MSRDC1.resultset.MoveNext) NO es recomendable establecer la propiedad BOFAction a 1 (rdBOF) ni la propiedad EOFAction a 1 (rdEOF), ya que puede entrar en una situacin de la que es imposible salir. Si

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 18

ve aparecer un aviso de error parecido a Estado del conjunto de datos no vlido para Update le est indicando que se ha metido en un proceso del que no puede salir, debido a que se encuentra en el EOF BOF intentando introducir un nuevo dato, y no puede.

Propiedad CursorDriverDevuelve o establece un valor que especifica el tipo de cursor que se va a crear. Veamos primero qu es un cursor. Segn la definicin de Microsoft: Conjunto lgico de filas administrado por el origen de datos o por el administrador de controladores ODBC. Los cursores reciben dicho nombre porque indican la posicin actual dentro del conjunto de resultados, igual que el cursor de la pantalla indica la posicin actual. (#G!*&@%) Vamos a no complicarnos la vida para intentar comprenderlo. El mecanismo de ODBC espera una base de datos albergada en un servidor, a la que le vamos a manipular sus registros desde un puesto conectado al servidor donde se encuentra la base de datos a travs de una red de rea local. Cuando creamos un recordset, el conjunto de registros que forma ese recordset deber estar en la memoria RAM de algn equipo. Del servidor? Del cliente? En cualquiera de ellos que est deber estar en la memoria RAM, ocupando cierto espacio. A esa memoria ocupada por el recordset, y a la forma en la que estn guardados los datos dentro de ella es a lo que llamamos Cursor. Este concepto de cursores es nuevo (No exista en DAO) debido a que RDO se utiliza fundamentalmente en sistemas basados en un servidor, donde se alberga la base de datos, y una serie de puestos de operacin, unidos al servidor a travs de una red. El trfico de datos a travs de la red es algo que se debe optimizar. Y en algunos casos puede ser beneficioso llevarse todas las filas de un rdoResultset al puesto, operar con ellas e introducirlas de nuevo, si es necesario, en la base de datos, una vez procesadas, o puede ser beneficioso mantener ese conjunto de filas en la memoria RAM del servidor para tener disponibles all los datos y acceder a ellos de forma rpida a travs de la red. En un caso lograremos o rapidez y en otro poco trfico, pero en ambos casos gastaremos recursos. Podemos no crear un cursor, no usaremos memoria pero, o empleamos mas tiempo, o introducimos ms trfico en la red. El crear un cursor de lado cliente o de lado servidor puede hacer que su cdigo funciones o no funcione. Los cursores lado cliente suelen ser de lectura / escritura, que permiten avanzar hacia a delante y hacia atrs. Los cursores lado servidor suelen ser solamente de lectura y de avance solamente hacia delante. Hemos empleado una palabra no muy exacta: suelen ser. Y es que eso depender de la base de datos (Oracle no se comporta como SQLServer, y ninguna de ellas se comporta como Access) y depende tambin del controlador ODBC que utilice (Hay controladores de varias marcas para la misma base de datos) Es muy frecuente realizar un cdigo que funciona perfectamente con un controlador ODBC, y cuando se cambia de controlador o de versin ya no funciona. Le recomiendo mucho cuidado. El control RemoteData permite elegir el crear un cursor en el servidor, en el puesto, o crearlo solamente si es necesario. Para ello usamos la propiedad CursorDriver. Puede tomar los siguientes valores: Descripcin El controlador ODBC elegir el tipo de cursores adecuado. Se rdUseIfNeeded 0 usarn cursores del servidor si hay alguno disponible. rdUseOdbc 1 RemoteData usar la biblioteca de cursores de ODBC . rdUseServer 2 Se usarn cursores del lado del servidor. rdUseClientBatch 3 RDO usar la biblioteca de cursores por lotes de tipo optimista. Le recomiendo que repase el tema de cursores de la base de datos concreta que est usando, y espero que la bibliografa que le brinda el fabricante sea suficiente. No suelen ser muy explcitos con los manuales aportados, o al menos tienen la habilidad de explicarlo de una forma tan sutil que es a veces inescrutable. Casi siempre esas dudas se resuelven en el curso que cada marca tienen para su base de datos, que es estrictamente de pago. Constante Valor

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 19

Mtodos del control RemoteData Mtodo UpdateRowEs equivalente al mtodo UpdateRecord del Control Data. Guarda los valores actuales de los controles enlazados en la base de datos. El mtodo UpdateRow tiene el mismo efecto que ejecutar el mtodo Edit, modificar una columna y despus ejecutar el mtodo Update, excepto que no ocurre ningn evento. Nota Cuando usa una biblioteca de cursores ClientBatch, todas las actualizaciones a las tablas base se retrasan hasta que use el mtodo BatchUpdate. En este caso, el mtodo UpdateRow actualiza el rdoResultset local, pero no actualiza las tablas base. Estos cambios pueden perderse si la aplicacin termina antes de que se haya completado el mtodo BatchUpdate.

Mtodo BatchUpdate (Mtodo del rdoResultset)Este mtodo no es del control RemoteData, sino de su rdoResultset asociado. De igual forma que un control data tena asociado un recordset, un RemoteData tiene asociado un Resultset. El Resultset es el objeto rdoResultset del control RemoteData (Coleccin de registros, o si lo prefiere, de filas ya que estamos en RDO), y que como cualquier objeto de acceso a datos, tiene sus mtodos, y este es uno. Realiza una actualizacin optimista por lotes. Sintaxis MSRDC1.Resultset.BatchUpdate (filaunica, forzar)

Donde MSRDC1 es el nombre del control RemoteData Filaunica (Booleano) indica si es True, que solamente actualizar la fila actual, si es False, actualiza todo el lote. El lote es un conjunto de filas. Pueden ser las filas del cursor. Forzar (Booleano)indica si est a True que sobreescribir la fila actual, independientemente de si causa o no colisiones. Si est a False, no sobreescribir si va a ocurrir una colisin. Este mtodo es un mtodo del rdoResultset. Si tenemos un rdoResultset creado con cdigo (Ahora veremos como se hace) la sintaxis sera MirdoResultset. BatchUpdate (filaunica, forzar) Con esta introduccin ya podemos pensar que el alumno tiene cierta idea respecto a lo que es el control RemoteData. Vamos a comenzar a explicar lo que son los objetos de acceso remoto a datos (Objetos RDO) y podremos seguir viendo cosas acerca del control RemoteData como aplicacin de estos nuevos objetos.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 20

Objetos de datos remotos (Objetos RDO)Como ya conocemos los objetos de acceso a datos DAO, veremos los objetos RDO basndonos un poco en este conocimiento. Los objetos de datos remotos nos permiten manipular componentes de un sistema de base de datos ODBC remoto. Lo de remoto no implica que la base de datos deba estar en un ordenador distinto al que tiene la aplicacin. (Aunque esta sea la disposicin ms usual en aplicaciones que usan RDO). El significado de RDO es que se accede a la base de datos a travs de una conexin ODBC. RDO solamente funciona en plataformas de 32 bits. (Windows 95/98/2000 o Windows NT). Para usar objetos de datos remotos, debe establecer una referencia a Microsoft Remote Data Object 2.0 en Proyecto | Referencias. Al igual que en DAO, los objetos RDO tienen una estructura jerrquica que se puede ver en la siguiente figura:

Estructura jerrquica de los objetos RDO Los objetos RDO siguen la misma regla para su creacin que los objetos DAO: el objeto jerrquicamente superior crea al objeto inferior.

El Objeto rdoEngineEl objeto rdoEngine representa el origen de datos remoto. Es el equivalente al dbEngine de DAO, es decir, el motor de bases de datos. Es el objeto de nivel jerrquico superior, por lo tanto no se crea por otro objeto, sino que est creado simplemente al introducir la referencia. La caracterstica del rdoEngine es que trabaja siempre a travs del Administrador de controladores. El objeto rdoEngine contiene al objeto rdoEnvironments (Coleccin de objetos rdoEnvironment) y el rdoErrors. Los objetos rdoEnvironment de nueva creacin se inicializan de acuerdo a los valores predeterminados establecidos en el objeto rdoEngine. Se crea de forma automtica el objeto rdoEnvironments(0), al igual que lo haca el dbEngine con el Workspaces(0) en DAO. El objeto rdoErrors contiene todos los mensajes de error enviados desde el origen de datos remoto. Cada vez que se recibe uno de estos mensajes, se produce el evento InfoMessage del rdoEngine

Propiedades del objeto rdoEngine

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 21

rdoDefaultLoginTimeout

Determina el valor predeterminado la propiedad LoginTimeout de los objetos rdoEnvironment que se creen. Esta propiedad se utiliza en la administracin del tiempo disponible para la conexin. Si la conexin no se ha realizado en el nmero de segundos indicado, dar error. Sintaxis rdoEngine.rdoDefaultLoginTimeout = NumeroDeSegundos Si el valor NumeroDeSegundos es cero, esperar indefinidamente a que se realice la conexin.

rdoDefaultCursorDriver Determina el valor predeterminado de la propiedadCursorDriver de los objetos rdoEnvironment. Esta propiedad determina si el Administrador de controladores ODBC crea cursores por lotes del lado del cliente, locales, del servidor o si no crea cursores. Sintaxis rdoEngine.rdoDefaultCursorDriver = valor

Donde Valor es un valor o contante segn puede verse en la siguiente tabla RdUseIfNeeded (Predeterminado) elige el estilo de cursores ms apropiado para el Controlador RdUseODBC Utiliza la biblioteca de cursores ODBC. RdUseServer Utiliza cursores del servidor RdUseClientBatch Usa la biblioteca de cursores optimista por lotes RdUseNone No crea un cursor desplazable. Bsicamente es un conjunto de resultados de slo lectura de tipo forward-only

rdoDefaultUser y rdoDefaultPassword Determinan los valores predeterminados delas propiedades UserName y Password de los objetos rdoEnvironment cuando se abren conexiones sin suministrar valores para estos parmetros.

rdoVersion Examina la versin de RDO en uso. rdoLocaleID Devuelve o establece un valor que indica la configuracin regional de labiblioteca RDO, para mostrar los mensajes de error. Sintaxis rdoEngine.rdoLocaleID = valor

Por defecto, esta propiedad toma el valor 0, que pone la configuracin establecida en Windows. Si el archivo DLL del idioma especificado no est presente en el equipo del usuario, RDO se establece como rdLocaleEnglish, lo cual no requiere un archivo DLL independiente. Cuando esto ocurre, se coloca un mensaje informativo en la coleccin rdoErrors para indicar que RDO no pudo cargar el archivo DLL de recursos para la configuracin regional especificada. Cuando distribuya la aplicacin, asegrese de incluir el archivo DLL del lenguaje apropiado.

Mtodos del rdoEnginerdoCreateEnvironment Este mtodo es equivalente al CreateWorkspace de DAO. Creaun nuevo objeto rdoEnvironment. (Es decir, una sesin de trabajo) Sintaxis Contrasea) Set MiSesion = rdoEngine.rdoCreateEnvironment(Nombre, Usuario,

Donde: Nombre es la propiedad Name del nuevo objeto rdoEnvironment. (En el cdigo, para nombrar a este rdoEnvironment debemos hacerlo con MiSesion). Debe suministrar un nombre, ya que si no lo hace, este rdoEnvironment creado no se suma a la coleccin rdoEnvironments. Usuario es el nombre del usuario. Contrasea es la contrasea usada en esa sesin. Puede tener hasta 14 caracteres.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 22

Cuando se inicializa el rdoEngine se crea automticamente una sesin de trabajo predeterminada, el rdoEnvironments(0), con el nombre de usuario que tenga el rdoEngine en su propiedad rdoDefaultUser y con contrasea igual a la propiedad rdoDefaultPassword. En una aplicacin multiusuario es necesario crear un rdoEnvironment para cada uno de ellos, siempre que empleemos transacciones. En este mtodo es necesario suministrar todos los parmetros (Nombre, Usuario y Contrasea)

rdoRegisterDataSourceSintaxis atributos

Introduce la informacin de conexin en el Registro de Windows para un origen de datos ODBC (Crea una conexin ODBC igual que lo haramos en Windows) rdoEngine.rdoRegisterDataSource DSN, controlador, silencio,

DSN es el nombre que queremos dar a la conexin ODBC Controlador es el nombre del controlador ODBC. Debe ser uno de los instalados y hay que poner el nombre exacto por el que se le conoce en Windows, NO el nombre de la DLL. Por ejemplo, debe poner Microsoft Access Driver y no odbcjt32.dll Silencio es un valor True / False y se refiere a si queremos que presente el cuadro de creacin de un enlace ODBC (El mismo que aparece en Windows) Si ponemos False en esta propiedad, le introducimos los datos de la conexin a travs de ese cuadro. Si le ponemos True, no mostrar el cuadro, y por lo tanto deberemos pasarle todos los parmetros correctamente. Si la informacin suministrada no es completa, mostrar el cuadro citado. Atributos. Una expresin de cadena que es una lista de palabras clave que se van a agregar al archivo ODBC.INI. Las palabras claves estn en una cadena delimitadas por retornos de carro. No es trivial esta cadena de caracteres y es propia de cada controlador. Por lo tanto, le recomiendo que si no conoce muy bien la cadena a introducir, ponga el parmetro Silencio a False y se olvide de este parmetro de atributos. Eso s, deber ser el usuario quien introduzca los datos a travs del cuadro de creacin del enlace ODBC. Hasta aqu las propiedades y mtodos del rdoEngine. Vamos a bajar un nivel jerrquico y ver el siguiente objeto RDO

El Objeto rdoEnvironmentUn objeto rdoEnvironment es una sesin de trabajo en RDO. Equivale al Workspace de DAO. En un rdoEnvironment podemos tener varios objetos Connection (varias conexiones) de la misma forma que en un Workspace podamos tener varias objetos Database. La coleccin de todos los objetos rdoEnvironment es el objeto rdoEnvironments. Visual Basic crea automticamente un rdoEnvironment, de la misma forma que creaba un Workspace. El objeto rdoEnvironment creado es el rdoEnvironments(0) y el nombre de usuario ser el que tenga el rdoEngine en su propiedad rdoDefaultUser y la contrasea igual a la propiedad rdoDefaultPassword NOTA. Visual Basic crea automticamente un Workspace o un rdoEnvironment si el proyecto contiene la referencia al motor de bases de datos correspondiente. Visual Basic no crear ninguno de ellos si no tiene la referencia a ningn motor de bases de datos. Los objetos rdoEnvironment se anexan automticamente a la coleccin rdoEnvironments a menos que no proporcione un nombre para el nuevo objeto cuando utilice el mtodo rdoCreateEnvironment.

Propiedades del Objeto rdoEnvironmentPropiedad CursorDriver Ya hemos visto esta propiedad para el control RemoteData. Laaplicacin al objeto rdoEnvironment es similar, por lo que solamente exponemos su sintaxis:

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 23

MiSesin.CursorDriver = Valor donde Valor toma uno de estos valores o constantes: 0 rdUseIfNeeded adecuado. Se 1 2 3 rdUseOdbc rdUseServer rdUseClientBatch El controlador ODBC elegir el tipo de cursores usarn cursores del servidor si hay alguno disponible. Usar la biblioteca de cursores de ODBC . Se usarn cursores del lado del servidor. RDO usar la biblioteca de cursores por lotes de tipo optimista.

Propiedad hEnvEsta propiedad es el Handle de la conexin ODBC. Es similar a la propiedad hDC (para controles) o hWnd (para formularios) que ya hemos visto en captulos anteriores. Esta propiedad es slo de lectura y devuelve un Long. Este valor lo usan las APIs de Windows para trabajar. Alguna instruccin nos pedir el hEnv como parmetro.

Propiedad LoginTimeoutDevuelve o establece el nmero de segundos que el Administrador de controladores ODBC espera antes de que se produzca un error de espera al abrir una conexin. Sintaxis NombreDelObjetordoEnvironment.LoginTimeout = NumeroDeSegundos

El valor predeterminado es el de la propiedad rdoDefaultLoginTimeout del objeto rdoEngine, y en su defecto, de 15 segundos. Si este valor es igual a 0 se espera indefinidamente y no se producir ningn error. Si establece un valor para esta misma propiedad en uno de sus objetos rdoConnection, este valor es prioritario al establecido en el objeto rdoEnvironment.

Mtodos del objeto rdoEnvironment Mtodo OpenConnectionAbre una conexin con un origen de datos ODBC. En otras palabras, crea un objeto rdoConnection, objeto que deber declarar antes de abrirlo: Dim MiConexion as rdoConnection Set MiConexin = MiSesion.OpenConnection(Nombre, LineaComandos, SloLectura, Conectar, Opciones) Nombre puede ser una conexin ya creada, en cuyo caso se abrir esa conexin. Si este parmetro es una cadena vaca, deber obtener los datos de la conexin, o bien del argumento Conectar, o mediante el cuadro de dialogo de abrir la conexin. LineaComandos. Determina si muestra o no muestra el cuadro de dilogo de abrir la conexin ODBC. Puede tomar estos valores rdDriverPrompt (0) Muestra el cuadro de dilogo rdDriverNoPrompt (1) No muestra nunca el Cuadro de dilogo rdDriverComplete (2) Muestra el cuadro de dilogo solamente si la informacin facilitada no es suficiente para abrir la conexin. RdDriverComplete (3) Igual que rdDriverComplete pero deshabilita las opciones Required que ya estn bien pasadas en la informacin facilitada. SloLectura Determina si la conexin se abre como slo lectura o para lectura / escritura. Si no se especifica nada, se abre para lectura / escritura.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 24

Conectar Este es el argumento que lleva los datos completos de la conexin. Es similar a la propiedad Connect del control RemoteData, cuyo contenido repetimos aqu por comodidad. Para introducir los datos de la propiedad Connect deber usar una palabra para definir el dato, seguido del signo = y del dato a introducir. Como final del dato debe introducir necesariamente el signo punto y coma ; DSN Origen de datos ODBC registrado. UID Nombre de un usuario reconocido PWD Contrasea asociada al usuario DRIVER Descripcin del controlador DATABASE Base de datos predeterminada para usarla una vez conectado SERVER Nombre del servidor donde se aloja la base de datos WSID Nombre de la estacin de trabajo (Nombre del PC que se va a comunicar con el servidor APP Nombre de la Aplicacin que va a Usar la Base de Datos DSN=MiConexinODBC; UID=Luis; PWD=MiContrasea; DRIVER=SQL Server; DATABASE=MiBase; SERVER=MiServidor; WSID=NombredemiPC; APP=MiAplicacin

Estos datos complementan la informacin de la conexin. Si ya habamos establecido la conexin mediante el argumento Nombre, y en esa conexin ya estaban perfectamente definidos todos los parmetros de esa conexin, de este argumento Conectar solamente tomar el nombre de usuario y la contrasea. Puede comprobar si se ha completado la conexin examinando la propiedad StillConnecting del objeto rdoConnection recin creado, que debe devolver False cuando se ha completado la operacin de conexin. If MiConexion.StillConnecting = false then .

BeginTrans, CommitTrans, RollbackTrans (Transacciones)Son los mtodos para realizar transacciones. BeginTrans comienza una nueva transaccin. CommitTrans finaliza la transaccin actual y guarda los cambios. RollbackTrans finaliza la transaccin actual y restaura las bases de datos del objeto rdoEnvironment al estado en que estaban cuando comenz la transaccin actual. El funcionamiento en RDO es distinto al de DAO. Adems, es distinto para cada base de datos. La forma de trabajar de SQLServer es distinta de cmo lo hace Oracle. Y muy distinta de cmo lo hace Access. Le recomiendo que estudie las transacciones en el manual de su gestor de base de datos. Hay algunas bases de datos que no aceptan transacciones. Puede comprobarlo analizando la propiedad Transactions del objeto Connection.

Mtodo CloseCierra un el rdoEnvironment y todas las conexiones que tena abiertas. Las modificaciones pendientes de los objetos RDO inferiores que estuviesen abiertos se deshacen. Sintaxis MiSesion.Close

No se puede cerrar el rdoEnvironments(0) Si utiliza Close con el objeto ya cerrado, se producir un error interceptable..

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 25

El objeto rdoConnectionUn objeto rdoConnection representa una conexin abierta con un origen de datos a travs de ODBC. Es el equivalente al Objeto DataBase de DAO Un objeto rdoConnection (es decir, una conexin a una base de datos a trvs de ODBC) se crea o con un control RemoteData o mediante el mtodo OpenConnection del objeto rdoEnvironment. Puede tambin crear un nuevo objeto rdoConnection que no est vinculado de forma inmediata con una conexin fsica especfica a un origen de datos. Por ejemplo, el siguiente cdigo crea un objeto rdoConnection independiente: Dim OtraConexion as New rdoConnection. Posteriormente puede introducir las caractersticas que desee y establecer la conexin real con la base de datos. No es normal hacer esto, por lo que le remito en caso necesario, a la ayuda de VB de este objeto.

Propiedades del Objeto rdoConnectionUn objeto rdoConnection tiene Propiedades. Muchas de ellas ya se han visto, bien al estudiar el control RemoteData o los objetos RDO ya estudiados. Las propiedades que se han visto se describirn slo de forma somera.

Propiedad Connect Devuelve o establece un valor que proporciona informacin sobre elorigen de un objeto rdoConnection abierto. La propiedad Connect contiene la cadena de conexin ODBC. Esta propiedad puede leerse siempre, pero no puede modificarse una vez establecida la conexin. Sintaxis objeto.Connect = CadenaDeConexin

Las partes de CadenaDeConexin son: (Puede no usar alguna de ellas) DSN UID PWD DRIVER DATABASE SERVER WSIS APP Nombre del origen de datos (Nombre de la conexin ODBC) Nombre del usuario (Puede no tener nombre de Usuario) Password. (Puede no tener Password) Nombre del driver ODBC empleado Nombre de la base de datos que se va a emplear Nombre del servidor remoto Nombre de la estacin de trabajo dentro de la red Nombre de la Aplicacin

(El separador es el carcter punto y coma (;) No es necesario aportar estos datos para crear la conexin, ya que son los que se han introducido en Windows al crear la conexin ODBC. Estos datos solamente son necesarios si la conexin ODBC se cre sin aportarle datos acerca de la base de datos.

Propiedad hDbcDevuelve el controlador de conexin ODBC. Sintaxis MiConexion.hDbc

La propiedad hDbc devuelve un valor de tipo Long. Este valor lo utilizan las APIs de Windows. Y es similar a hDc o hWnd

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 26

Propiedad LastQueryResultsDevuelve un objeto rdoResultset, precisamente el que se ha generado la ltima consulta, si la ha habido. Esta propiedad podemos utilizarla para crear un nuevo Resultset, clnico del ultimo que se ha generado. Sintaxis Dim MiRs as rdoResultset Set MiRs = MiConexion.LastQueryResults Si no se haba creado todava ningn Resultset, devuelve Nothing.

Propiedad QueryTimeoutDevuelve o establece un valor que especifica el nmero de segundos que espera el Administrador de controladores ODBC antes de que se produzca un error de tiempo de espera al ejecutarse una consulta. El valor predeterminado es de 30 segundos.

Propiedad StillConnectingDevuelve un valor que indica si la conexin se est estableciendo todava. Sintaxis MiConexion.StillConnecting Esta propiedad devuelve True si la conexin no ha terminado de establecerse, y False si ya est establecida. Es fundamental saber que la conexin ya est establecida antes de realizar ninguna operacin con ella, por ejemplo, crear un Resultset

Propiedad StillExecutingDevuelve un valor que indica si una consulta est an ejecutndose. Esta propiedad se usa cuando creamos un rdoResultset o un rdoQuery, para conocer si ya se ha finalizado el proceso de seleccin de filas que esa operacin implica. Esta propiedad puede aplicarse al rdoConnection, rdoQuery y rdoResultset. Devuelve True cuando la consulta est ejecutndose todava, False si ya se ha finalizado. Sintaxis objeto.StillExecuting

Propiedad TransactionsDevuelve un valor que indica si se pueden realizar transacciones con un objeto rdoConnection rdoResultset. Esta propiedad le permite asegurarse de esta circunstancia antes de ejecutar la instruccin BeginTrans. La propiedad Transactions llama a la funcin SQLGetInfo de ODBC para determinar si el controlador ODBC es capaz de permitir transacciones, no si el conjunto de resultados actual es actualizable.

Propiedad AsyncCheckIntervalDevuelve o establece un valor que especifica el nmero de milisegundos que espera RDO entre dos comprobaciones para ver si se ha completado una consulta asncrona. Sintaxis MiConexion.AsyncCheckInterval = valor

El valor por defecto es de 1 segundo (1000 mseg) Comentarios Al usar la opcin rdAsyncEnable para ejecutar una consulta de forma asncrona, RDO comprueba peridicamente el origen de datos para determinar si la consulta se ha completado. Puede modificar la duracin del intervalo entre comprobaciones mediante

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 27

la propiedad AsyncCheckInterval. RDO tambin comprueba el estado de las consultas asncronas cuando se examina la propiedad StillExecuting.

Propiedad UpdateOperationEsta propiedad afecta a la forma en la que se realiza la modificacin de una fila en una actualizacin optimista por lotes. Si a esta propiedad se le pone el valor 0 (Predeterminado) la modificacin de la fila se realiza mediante una instruccin Update. Si el valor es 1, la operacin de modificacin se realiza mediante dos instrucciones, primero una instruccin Delete (borra la fila) y a continuacin otra instruccin Insert (Crea la fila con los nuevos valores). Sintaxis objeto.UpdateOperation [= valor]

El Objeto rdoResultsetEl Objeto rdoResultset es el conjunto de filas que devuelve la ejecucin de una consulta. Es

el equivalente al Recordset de DAO El Objeto rdoResultset se crea mediante el mtodo OpenResultset del rdoConnection. Ejemplo: Creamos el objeto rdoEnvironment utilizando el objeto creado automticamente por VB Set GepaWs = rdoEnvironments(0) El objeto rdoEnvironment crea el objeto rdoConnection Set GepaConex = GepaWs.OpenConnection(Gepa, rdDriverNoPrompt, False) (Gepa es el nombre de la conexin ODBC creada en el ordenador) El objeto rdoConnection crea el objeto rdoResultset Set GepaRs = GepaConex.OpenResultset("Select Ex_expedite, Ex_numproye, " & _ "Ex_presenta, Ex_plan, Ex_tipoexpe, Ex_tipoprop, Ex_tipotram, Ex_redaproy, Ex_situxpe, " & _ "Ex_Numero_Ini, Ex_subsiste " & _ "From Expedientes Order By Ex_Numero_Ini", rdOpenDynamic, rdConcurRowVer) Puede ver que el proceso de creacin de un rdoResultset en RDO no difiere demasiado de la creacin de un recordset en DAO. Veamos cada una de las partes del Mtodo OpenResultset Set MirdoResultset = MiConexin.OpenResultset(nombre [,tipo [,tipoBloq [,opciones]]]) Donde MirdoResultset = variable tipo rdoResultset que debe estar declarada. MiConexin = Objeto Connection con el que se crea el rdoRsultset Nombre = Nombre de una tabla o consulta de la base de datos, o una sentencia SQL que pueda devolver filas. Tipo = Tipo de cursor que se va a crear TipoBloq = Tipo de bloqueo de la base de datos. Por defecto, lo crea solo lectura. Opciones = Opciones que puede tener el rdoResultset

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 28

El argumento Tipo puede tener una de estos valores: Constante rdOpenForwardOnly rdOpenKeyset rdOpenDynamic rdOpenStatic Valor 0 1 2 3 Descripcin (Predeterminado) Abre un rdoResultset tipo forward-only. Abre un rdoResultset tipo Keyset Abre un rdoResultset tipo Dinamico Abre un rdoResultset tipo esttico

El tipo forwar-only es un rdoResultset en el que las filas solamente se pueden explorar en sentido ascendente. No se puede retroceder . El tipo Keyset es un rdoResultset que se puede actualizar, insertar nuevas filas, y se puede recorrer en ambos sentidos sin limitacin. Los miembros de este rdoResultset son fijos. El tipo Dinmico es un rdoResultset que se puede actualizar, insertar nuevas filas, y se puede recorrer en ambos sentidos sin limitacin. Los miembros de este rdoResultset no son fijos.Es similar al Dynaset de DAO. El tipo esttico presenta los valores existentes en la BD en el momento de su creacin y no detecta las posibles variaciones de los datos en la misma. Es similar al Snapshot de DAO Para el parmetro Tipo de Bloqueo acepta los siguientes datos: Constante rdConcurReadOnly RdConcurLock rdConcurRowVer rdConcurValues rdConcurBatch Valor 1 2 3 4 5 Descripcin (Predeterminado) Slo lectura. Concurrencia pesimista. Concurrencia optimista basada en el Id. de fila. Concurrencia optimista basada en valores de filas. Concurrencia optimista usando actualizaciones de modo por lotes. Valores Status devueltos por cada fila actualizada con xito.

El parmetro opciones acepta estos valores: (Se pueden sumar ambas) Constante rdAsyncEnable rdExecDirect Valor 32 64 Descripcin Ejecuta la operacin de forma asncrona. (Predeterminado) Evita la creacin de procedimientos almacenados para ejecutar la consulta.

El objeto rdoResultset tiene algunas particularidades que no tienen los recordsets de DAO, por ejemplo, poder obtener resultados mltiples, es decir, se pueden introducir varias sentencias SELECT y cada una de ellas crea un conjunto de registros. Esto no significa que haya mas de un rdoResultset, sino que existe un nico rdoResultset con resultados mltiples. Se puede ir accediendo a cada uno de los conjuntos de registros mediante el mtodo MoreResults.

Propiedades del Objeto rdoResultsetEl rdoResultset no tiene exactamente las mismas propiedades que el Recordset. Y adems no siempre funcionan tal como lo hacan en el recordset. En RDO van a depender del tipo de cursor y del tipo de bloqueo. Veamos las propiedades del rdoResultset AbsolutePosition. Igual que en RDO, pero no siempre funciona, ya que depende del tipo de cursor. ActiveConnection Devuelve una referencia a la conexin con la que est asociado el rdoResultset

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 29

BatchCollisionCount Devuelve un valor que especifica el nmero de filas que no finalizaron la ltima actualizacin por lotes. Devuelve un Long. En caso de que esta propiedad sea mayor de 0 significa que la actualizacin por lotes no se ha completado con xito. En este caso habr que ejecutar el mtodo BatchUpdate para completar la actualizacin. BatchCollisionRows Devuelve una matriz de marcadores que indica las filas que han provocado colisiones en la ltima operacin de actualizacin por lotes. Devuelve un Variant con una matriz de las filas que han provocado una colisin la ltima vez que se invoc el mtodo BatchUpdate. El nmero de elementos de esta matriz es el que indica la propiedad BatchCollisionCount BatchSize (Propiedad) Devuelve o establece un valor que especifica el nmero de instrucciones enviadas al servidor en cada lote. De forma predeterminada se envan 15 instrucciones al servidor en cada lote. Esta propiedad puede modificarse en cualquier momento. Si un DBMS no admite lotes de instrucciones, puede establecer esta propiedad a 1, con lo que cada instruccin se enviar por separado. BOF, EOF Son idnticas a las mismas propiedades del Recordset de DAO

Bookmark Funciona igual que en el Recordset de DAO. Pero en RDO es posible que esa propiedad no se pueda usar. Depende del tipo de cursor. Para asegurarse de que el objeto rdoResultset admite marcadores, examine el valor de su propiedad Bookmarkable antes de usar su propiedad Bookmark. Si Bookmarkable es False, el objeto rdoResultset no admite marcadores y el uso de Bookmark producir un error La propiedad Bookmark no se aplica a los objetos rdoResultset de tipo forward-only. En DAO la variable donde se guarda el Bookmark deba se un String. En RDO es un variant. Desconozco la razn, pero usando una variable String para almacenar el Bookmark falla. Bookmarkable Devuelve un valor que indica si un objeto rdoResultset admite marcadores, es decir, si acepta la propiedad Bookmark. EditMode Devuelve un valor que indica el estado de edicin de la fila actual. Devuelve un integer o una constante de acuerdo con la tabla siguiente: Constante RdEditNone RdEditInProgress RdEditInProgress Valor 0 1 2 Descripcin No se est efectuando ninguna operacin de modificacin. Se ha invocado el mtodo Edit y la fila est en buffer de copia. Se ha invocado el mtodo AddNew y la fila actual del bfer de copia es una fila nueva que no se ha guardado en la B. D.

LastModified Devuelve un marcador que indica la ltima fila modificada o agregada ms recientemente. Este marcador es el Bookmark de esa fila. Devuelve un Variant. LockEdits Devuelve un valor de tipo Booleano que indica el tipo de bloqueo en vigor. Si devuelve True utiliza bloqueo pesimista. Si devuelve False utiliza bloqueo optimista. Si LockEdits es True y otro usuario ya tiene la pgina bloqueada, se producir un error al intentar usar el mtodo OpenResultset. En general, los dems usuarios pueden leer datos de las pginas bloqueadas. Si LockEdits es False (valor predeterminado) y utiliza despus Update mientras la pgina est bloqueada por otro usuario, se producir un error. El bloqueo se realiza sobre una pgina de datos. La pgina suele se de 2 K (Ese es el tamao que utiliza Microsoft SQL Server) LSB Visual Basic - Gua del estudiante. Captulo 13 Pgina 30

LockType Devuelve o establece un valor entero de tipo Long que indica el tipo de tratamiento de concurrencia. Los valores admitidos son: Descripcin (Predeterminado) El cursor es de slo lectura. No se admiten rdConcurReadOnly 1 actualizaciones. rdConcurLock 2 Concurrencia pesimista. rdConcurRowVer 3 Concurrencia optimista basada en el identificador de fila. rdConcurValues 4 Concurrencia optimista basada en los valores de las filas. Concurrencia optimista con actualizaciones por lotes. Se obtienen rdConcurBatch 5 valores de estado para cada fila actualizada correctamente. Lea la ayuda de VB para obtener mayor informacin de cada uno de los tipos. Restartable Devuelve un valor que indica si un objeto rdoResultset admite el mtodo Requery, que vuelve a ejecutar la consulta en la que est basado el objeto rdoResultset. Debe usarse antes de utilizar el mtodo Requery para evitar que se produzca un error. PercentPosition Devuelve o establece un valor que indica o modifica la ubicacin aproximada de la fila actual en el objeto rdoResultset, basndose en el porcentaje con respecto al total de filas de dicho objeto. El valor devuelto es un Single entre 0,0 y 100,0 Puede usar la propiedad PercentPosition con una barra de desplazamiento de un control Form o TextBox para indicar la ubicacin de la fila actual en un objeto rdoResultset. Esta propiedad solamente se aplica a los rdoResultset tipo Keyset y Dynamic. RowCount Devuelve el nmero de filas a las que se ha tenido acceso en un objeto rdoResultset. Es un Long. Esta propiedad no indica el nmero de filas del Resultset, sino el nmero de filas a las que se ha accedido. No es por lo tanto, el equivalente a la propiedad RecordCount del Recordset DAO. Si esta propiedad no est disponible en el controlador, devuelve -1 Status Devuelve o establece el estado de la fila o columna actual. El valor de esta propiedad indica si la fila o la columna estarn implicadas en la prxima actualizacin optimista por lotes y de qu modo lo estarn. Los valores admitidos para la propiedad Status son: Constante Valor

Constante rdRowUnmodified rdRowModified rdRowNew rdRowDeleted rdRowDBDeleted

Valor 0 1 2 3 4

Valor de la propiedad Prepared (Predeterminado) La fila o la columna no se han modificado o se han actualizado correctamente. La fila o la columna se han modificado y an no se han actualizado en la base de datos. La fila o la columna se han insertado con el mtodo AddNew, pero an no se han insertado en la base de datos. La fila o la columna se han eliminado, pero an no se han eliminado de la base de datos. La fila o la columna se han eliminado localmente y tambin de la base de datos.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 31

StillExecuting Devuelve un valor de tipo Booleano que indica si una consulta est an ejecutndose. Esta propiedad es muy til (muy necesaria) para saber si la consulta ya est disponible, antes de presentar los datos de esa consulta. La propiedad debe ser False para poder presentarlos. Es tpico crear un bucle parecido a este: Do While GepaRs.StillExecuting = True DoEvents Loop Transactions transacciones. Devuelve un valor Booleano que indica si un rdoResultset permite

Type Devuelve un Long el tipo de rdoResultset. (0 = rdOpenForwardOnly, 1 = rdOpenKeyset, 2 = rdOpenDynamic, 3 = rdOpenStatic)

Updatable Devuelve un valor Booleano que indica si se pueden efectuar cambios en el rdoresultset

Mtodos del Objeto rdoResultsetEl rdoResultset tiene algunos mtodos comunes con el Recordset de DAO, sin embargo no se puede esperar que funcionen siempre de la misma forma. En DAO era Visual Basic quien abra la base de datos, y una base muy concreta, Access, dBase, etc., bases que controla directamente Visual Basic a travs de la dll correspondiente a la versin de la BD que vamos a abrir. Esto no es exactamente igual en RDO. Aqu quien abre el fichero que contienen la base de datos no es Visual Basic, sino el driver de ODBC. Y no solamente eso, dependiendo de la base de datos, unas permiten hacer unas operaciones y otras no. Lo mismo podemos decir del tipo de rdoResultset, del cursor y de si es lado cliente o lado servidor. Por lo tanto no se asuste si pretende ejecutar un mtodo y no funciona. Probablemente es que Visual Basic ha puesto por defecto unas caractersticas a los objetos que no son las adecuadas. Y si no fuese posible, en ltima instancia nos queda realizar directamente la operacin que pretendamos realizar con el mtodo, es decir, mediante las operaciones que nos permite el propio driver de ODBC. Eso s, en este caso estamos en sus manos. Lo veremos ms adelante.

Mtodo AddNewCrea una nueva fila para un objeto rdoResultset actualizable. Sintaxis MirdoResultset..AddNew

Funciona igual que el mismo mtodo de DAO, se ejecuta el mtodo AddNew, se introducen los datos en los campos y se termina la operacin con el mtodo Update, que es cuando los datos entran en la base de datos. Si se est usando cursores de tipo Client Batch los datos se escribitrn en la BD cuando se ejecute el mtodo BatchUpdate. Hay que tener cuidado, pues el mtodo AddNew no devuelve ningn error si se intenta aadir una nueva fila a un rdoResultset no actualizable. Ese error va a salir cuando ejecutemos el mtodo Update. Para evitar este error hay que comprobar la propiedad Updatable del rdoResultset. Debe tener cuidado tambin con asegurarse que tras el mtodo AddNew ejecuta el mtodo Update antes de cambiar de fila, ya que de no hacerlo se pierden los cambios realizados y VB no avisa de ese error.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 32

Si desea interrumpir la entrada de datos, una vez ejecutado el mtodo AddNew puede anularse usando el mtodo CancelUpdate MirdoResultset. CancelUpdate La fila recin aadida no pasa a ser la fila actual. Sigue siendo fila actual la que era anteriormente. Para que sea la nueva la fila actual basta con poner el siguiente cdigo: MirdoResultset.BookMark = MirdoResultset.LastModified Pero eso s, el rdoResultset debe aceptar marcadores. Para comprobarlo, se usa la propiedad Bookmarkable.

Mtodo BatchUpdateRealiza una actualizacin optimista por lotes. Veamos que significa esto. Este mtodo solamente se puede aplicar a un rdoResultset del tipo Client Batch (Cuando se crea el rdoResultset usando como tercer parmetro rdUseClientBatch) El tipo de rdoResultset puede ser Keyset o Dynamic. En estas condiciones, cuando usamos el mtodo Update para guardar los datos, solamente se guardan en el rdoResultset local, pero no se meten en la base de datos. Cuando se ejecuta este mtodo, se envan a la base de datos todos los cambios pendientes. Sintaxis MirdoResultset.BatchUpdate (filanica, forzar)

El parmetro filanica es un Booleano que si es True, hace que la actualizacin sea solamente de la fila actual. Si es False, se actualizan todas las filas pendientes. forzar es tambinun Booleano que si es True fuerza a escribir los valores, aunque puedan causar colisiones. Si usa el mtodo CancelBatch, se descartan los cambios guardados en el objeto rdoResultset local.

Mtodo CloseCierra un rdoResultset abierto. Es igual al mtodo Close del Recordset de DAO Sintaxis MirdoResultset.Close

Mtodo DeleteElimina la fila actual de un objeto rdoResultset actualizable. Sintaxis MirdoResultset.Delete

Es posible deshacer la eliminacin de una fila si emplea transacciones y el mtodo RollbackTrans, suponiendo que usa BeginTrans antes que el mtodo Delete. Se producir un error al utilizar Delete si: No hay ninguna fila actual. La conexin o el rdoResultset es de slo lectura. Ninguna columna de la fila es actualizable. La fila ya se ha eliminado. Otro usuario ha bloqueado la que contiene la fila. El usuario no tiene permiso para realizar la operacin.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 33

Mtodo EditInicia la operacin de cambiar los valores de los datos de la fila actual o en un objeto rdoResultset actualizable. Funciona de la misma forma que el mtodo del mismo nombre del Recordset de DAO. Al igual que en el mtodo AddNew, es necesario terminar la operacin con el mtodo Update. Sintaxis MirdoResultset.Edit

Si cambia la fila actual antes de ejecutar el mtodo Update, se perdern los cambios. Si desea anular el cambio que est realizando, basta con ejecutar el mtodo CancelUpdate. Cuando la propiedad LockEdits del objeto rdoResultset es True (bloqueo pesimista), todas las filas del conjunto de filas del objeto rdoResultset se bloquean en cuanto se ejecuta Edit, y se mantienen bloqueadas hasta que se ejecuta Update.

Mtodo GetRowsRecupera mltiples filas de un rdoResultset y las introduce en una matriz. Sintaxis matriz = MirdoResultset.GetRows (filas)

Donde filas es el nmero de filas que se quieren recuperar. Es un Long matriz es un Variant El primer subndice de la matriz identificar la columna y el segundo identifica el nmero de fila, de esta forma: matriz(intColumn)(intRow)

Mtodo MoreResultsEste mtodo se utiliza cuando se ha creado un rdoResultset de resultados mltiples, es decir, se han empleado varias sentencias SELECT para crearlo. Cada sentencia formar dentro del rdoResultset un juego de filas. Cuando se utiliza el mtodo MoreResults se borran las filas del conjunto de resultados actual y se colocan en su lugar las filas correspondientes al siguiente. El mtodo devuelve un Booleano que es True si ha encontrado un nuevo conjunto de resultados, o False si no lo ha encontrado. No todas las bibliotecas de cursores son compatibles con consultas de conjuntos de resultados mltiples. Por ejemplo, la biblioteca de cursores del servidor no es compatible con este tipo de consultas si no desactiva el procesamiento del cursor en un cursor de slo lectura slo hacia adelante con la propiedad RowsetSize a 1.

Mtodo MoveCambia la posicin de la fila actual en un objeto rdoResultset. Funciona igual que el mismo mtodo del Recordset de DAO Sintaxis MirdoResultset.Move filas[, inicio]

Mtodos MoveFirst, MoveLast, MoveNext y MovePreviousFunciona de la misma forma que los mtodos del mismo nombre en el Recordset de DAO. Mtodo Requery Actualiza los datos de un objeto rdoResultset volviendo a ejecutar la consulta en la que est basado el objeto. Sintaxis MirdoResultset.Requery [opciones]

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 34

El valor admitidi para Opciones es rdAsyncEnable (32) que ejecuta la operacin de forma asncrona

Mtodo UpdateTermina una operacin de modificacin de datos o de aadir una nueva fila. Ya se ha comentado su funcionamiento con los mtodos AddNew y Update. No vamos a profundizar ms en los objetos RDO. Su comportamiento es muy parecido a DAO, exceptuando los nombres de los objetos, y las particularidades del ODBC en cuanto a la situacin de los cursores. ODBC es una tecnologa ya obsoleta (En el ao 2002) y no debe emplearse para nuevos proyectos. Lgicamente un curso de Visual Basic debe incluir RDO, pero siempre para aplicarlo al mantenimiento de aplicaciones ya existentes. No se debe emplear para nuevos proyectos, ya que si se quiere emplear ODBC es mucho ms prctico y sencillo emplear DAO en su versin de ODBCDirect. Tendr cdigo compatible con DAO, y ms rapidez que con RDO. Adems RDO es una tecnologa considerada obsoleta por Microsoft, con lo que ello conlleva. Microsoft dice, y este autor recomienda: USE ADO EN TODOS SUS NUEVOS PROYECTOS Pero si usa Access con la base de datos instalada en el mismo ordenador que el programa, use directamente DAO. Si usa Access olvdese de nuevas tecnologas. Con Access DAO significa: Rapidez, sencillez, eficacia, control sobre el programa, independencia de drivers.

LSB

Visual Basic - Gua del estudiante. Captulo 13

Pgina 35