Está en la página 1de 45

Visual Basic - Gua del Estudiante

ACTIVE X DATA OBJECT (ADO) ADO es lo ltimo de Microsoft en acceso a bases de datos. No se porqu, pero desde su inicio, ADO est como metido en una aureola de dificultad a la que solamente pueden acceder informticos especialmente elegidos. Quizs sea el uso de palabras de argot mu rebuscadas, que ms que facilitar el estudio, atemorizan al principiante. !a "u#a del $studiante pretende quitar esos %elos que ocultan la sencillez de lo cotidiano mostrar la facilidad de esta tcnica. &on el estilo didctico que caracteriza a este libro, pasaremos de las definiciones gloriosas e iremos a lo %erdaderamente importante' saber programar con ADO ADO permite crear aplicaciones capaces de manipular bases de datos a travs de un proveedor OLE DB (Object Linking and Embedding for DataBase). El objetivo de OLE DB es poner a disposici n del programador una !erramienta de nivel inferior "ue le de acceso uni%ersal a los datos con independencia del origen de datos# $a sea un servidor de correo electr nico# una !oja de c%lculo u otro tipo de almacenamiento de datos. Debido a la complejidad de los elementos de OLE DB# no se puede acceder a ellos directamente desde &isual Basic' para ello utili(aremos los objetos ADO "ue permiten acceder a la pr%ctica totalidad de las funciones de OLE DB.

O L E A D O D B O D B C

Bases de datos Relacionales

Aplicacin que accede a los datos

Texto

Modelo de datos ADO R D O D A O Bases de datos relacionales

O D B C

Modelo DAO/RDO

)ng. *. +aredes ,. /

&isual Basic -u.a del Estudiante

+%gina

Las caracter.sticas generales de ADO son0 1a$or velocidad $ facilidad de uso. 1enor carga de memoria $ de espacio en el disco duro.

Las caracter.sticas espec.ficas "ue proporciona ADO para entornos de ,liente23ervidor (,23) son0 ,reaci n de los objetos de forma independiente. 4o se necesita navegar por ninguna jerar"u.a de objetos para poder crearlos. La ma$or.a de los objetos se pueden instanciar de forma independiente. De esta forma crearemos solo los objetos "ue necesitemos. ADO nos permite utili(ar los procedimientos almacenados en el sistema gestor de la base de datos (si este soporta esta funcionalidad)# pudiendo recoger los resultados devueltos por dic!os procedimientos como par%metros de salida. Esta caracter.stica permite mejorar el rendimiento $ la rapide( de las aplicaciones. Diferentes tipos de cursores. 3oporte para limitar el n5mero m%6imo de registros devueltos de una sola ve( en un recordset. Esta caracter.stica mejora el rendimiento tanto de la aplicaci n como de la red. 3oporte para recibir varios recordset como resultados devueltos de un procedimiento almacenado. 7a$ "ue tener en cuenta "ue todas estas caracter.sticas est%n limitadas por el servidor de los datos. Es decir# si el servidor de datos no soporta procedimientos almacenados# no podremos utili(ar con l las caracter.sticas de ADO "ue se refieren a dic!os tipos de procedimientos. 8ig 9:./ *erar"u.a de Objetos ADO. ,onnection; Errors Command * Parameters =ecordset
;

Error *

Parameter *

ields

ield*

; <odos los objetos marcados con un asterisco contienen la colecci n +roperties con un subconjunto de objetos +ropert$. Properties Propert! ,omo puede verse en la figura# e6isten tres objetos principales dentro de ADO0 El objeto ,onnection# el objeto ,ommand $ el objeto recordset. Luego veremos algunas de las caracter.sticas principales de cada uno de estos objetos. Antes de proseguir con estos objetos vamos a e6plicar donde $ por"u se deben utili(ar objetos ADO en ve( de objetos DAO u objetos =DO 7asta a!ora !ab.amos utili(ado bases de datos Access# $ tambin otras bases de datos sencillas como dBase. Acceder a Access es e6tremadamente f%cil. > ello es debido a "ue Access es una base de datos sin grandes aspiraciones en cuanto a seguridad. Es una gran base de datos# $ tiene sus dispositivos de seguridad en cuanto a permisos de acceso (&ea El dbEngine. &isi n desde DAO $ la propiedad 3$stemDB en el ,ap.tulo /:) sin embargo estas posibilidades se usan en mu$ pocas ocasiones# $ estos mecanismos de seguridad de Access )ng. *. +aredes ,. : &isual Basic -u.a del Estudiante +%gina

tampoco son una maravilla. +or lo tanto Access se !a "uedado como una gran base de datos para aplicaciones "ue no pasen de algunos centenares de miles de registros $ con pocos puestos de operaci n. En esta base de datos# el mtodo ideal de acceso es DAO# bien directamente o a travs de ODB, Direct. ,uando se accede directamente# la BD se suele buscar bien mapeando el disco del servidor como una unidad m%s del puesto cliente# o bien accediendo a travs de la direcci n )+ del servidor. ,uando "ueremos empe(ar a tener una seguridad en los accesos# disponer de privilegios distintos para cada usuario# trabajar en una red de %rea local con muc!os usuarios# !a$ "ue recurrir a bases de datos tipo Oracle o 3?L3erver. >a empe(amos a tener problemas0 &isual Basic no puede acceder directamente a abrir estas bases de datos. +odemos acceder a travs de ODB,# pero como $a se dijo en el# cap.tulo correspondiente# ODB, se !a "uedado obsoleto. > 1icrosoft !a sacado para ello ADO. > ADO permite abrir la base de datos usando para ello un dispositivo intermedio "ue es el proveedor OLE DB. Este no es m%s "ue una DLL. 1ejor dic!o# un juego de DLLs "ue puede ver en la carpeta0 &'(Arc)i%os de *rograma(Arc)i%os &omunes(+ stem(Ado Estas DLLs permiten conectar con las bases de datos m%s conocidas (Oracle# 3?L3erver# Access $ las dem%s BD controladas por el motor *et). ADO funciona de forma diferente a ODB,. ,on ODB, se preparan cone6iones permanentes en el ordenador# $ cual"uier programa puede acceder a la BD a travs de esas cone6iones. ,on ADO no !a$ "ue preparar previamente ninguna cone6i n. Es el propio programa el "ue llama al proveedor de datos OLE DB $ le pasa como par%metros los datos necesarios para "ue este realice la cone6i n $ abra la BD. 3i !ubiese dos programas ejecut%ndose simult%neamente $ accediendo a la misma base de datos a travs de ADO# cada programa prepara una cone6i n a esa BD. En ODB, podr.amos ver las cone6iones e6istentes en el +, a travs del +anel de Control | Fuentes de Datos ODBC. En ADO no e6iste esa posibilidad $a "ue# como se !a dic!o# es el propio programa "uien crea esa cone6i n al ajecutarse. +ara "ue &B pueda acceder a ADO es necesario introducir en el programa la referencia a 1icrosoft Active@ Data Objets :./ Librar$ ( ro!ecto|"e#erencias) ,na particularidad de ADO frente a lo a %isto con DAO o -DO es que ADO se salta la .erarqu#a a la )ora de crear nue%os ob.etos. $n DAO, el ob.eto DAO superior creaba al ob.eto DAO inferior /-ecuerde aquello del .uego de ni0os1. $n ADO podemos crear cada ob.eto sin que e2ista el ob.eto inmediatamente superior. *or e.emplo podemos crear un recordset sin que e2ista el ob.eto &onnection. &laro que en este caso, a la )ora de crear el ob.eto recordset deberemos indicarle, mediante los parmetros que debemos aportar en la sinta2is de creaci3n del recordset, todos aquellos datos que le aportar#amos a la creaci3n del ob.eto &onnection. &omo %e no tiene %enta.as. +olamente que nos desentendemos un poco de abrir cerrar el ob.eto &onnection. &eamos como se crea la cone6i n0 1ediante el Objeto ,onnection EL OB*E<O CO$$ECTIO$ El objeto ,onnection representa una sesi n con el origen de los datos. Dependiendo de la funcionalidad del proveedor de los datos podremos utili(ar determinadas propiedades# mtodos $ colecciones de este objeto. La funci n de este objeto es recoger toda la informaci n del proveedor de los datos "ue se va a utili(ar para crear un objeto recordset. +ara crear un objeto ,onnection# previamente debemos declararlo como variable objeto ,onnection0 Dim 1i,one6ion as ADODB.,onnection El sitio donde se debe declarar depende como siempre# del %mbito "ue deseamos "ue tenga ese objeto. +ara crear el objeto ,onnection deberemos utili(ar la siguiente sinta6is0 )ng. *. +aredes ,. A &isual Basic -u.a del Estudiante +%gina

3et 1i,one6ion B 4eC ADODB.,onnection $ota% $n el caso de que e.ecutemos la aplicaci3n nos salga un error diciendo que el tipo no est definido por el usuario, es que no )emos a0adido la referencia de 4Microsoft Acti%es Data Ob.ects !ibrar 2.25 La cone6i n Dest% creadaE. 3.# pero de momento es completamente in5til $a "ue no sabe ni si"uiera "ue base de datos debe abrir# ni con "ue usuario# ni las condiciones en las "ue debe abrir esa base (3olo lectura# etc.) Esta informaci n se la pasamos mediante la propiedad ,onnection3tring (,adena de cone6i n) &a 'ro'iedad Connection(trin) Es la propiedad m%s importante del objeto ,onnection. 3e basa en encadenar una serie de argumentos en una cadena de caracteres. Los diferentes argumentos son (dependiendo del proveedor OLE DB $ de la configuraci n de la red# se necesitar%n todos o parte de ellos) Especifica el nombre del proveedor "ue se usa en la cone6i n. (Oracle# 3?L3erver# *et# etc) Data (ource Especifica el nombre de la fuente de datos para la cone6i n. (4ombre de la base de datos a la "ue se va a acceder. +ser Id Especifica el nombre de usuario "ue abre la cone6i n. Debe ser un usuario $a declarado en la base de datos. ass,ord Especifica la clave utili(ada por el usuario para abrir la cone6i n. Debe coincidir con el "ue tiene ese usuario registrado en la Base de datos. File $a-e Especifica el nombre del fic!ero espec.fico de proveedor# "ue contiene la informaci n de configuraci n de la cone6i n. Este fic!ero es 5til en instalaciones en red "ue re"uieran modificaciones de cone6i n frecuentes. "e-ote ro*ider Especifica el nombre de un proveedor de datos remoto cuando se utili(a una cone6i n cliente2servidor "e-ote (er*er Especifica el nombre del camino al servidor "ue se va a usar cuando se establece una cone6i n cliente2servidor ,omo ejemplo para la cone6i n a una base de datos Oracle# con el usuario "ue esa BD tiene por defecto (scott) $ el +assCord de este usuario (tiger) tendremos "ue especificar en el Connection(trin) la siguiente cadena de caracteres. . ro*ider/0(DAO"A123 ass,ord/ti)er3+ser ID/scott3Data (ource/0AD"ID34 donde el valor de 3ource es la cadena de cone6i n de Oracle "ue previamente tiene "ue estar configurada con el 3?L;4et o 4etF de Oracle. 3i lo "ue "ueremos es crear una cone6i n con una base de datos Access :GGG . ro*ider/0icroso#t1Jet1O&EDB15163Data (ource/C%7GuiadelEstudiante7 rue8aADO1-d834 3i la base de datos es de Access H9 entonces tendremos "ue especificar otro provider0 . ro*ider/0icroso#t1Jet1O&EDB191:3Data (ource/C%7GuiadelEstudiante7d821-d834 ro*ider

)ng. *. +aredes ,. I

&isual Basic -u.a del Estudiante

+%gina

+ara una base de datos 3?L3erver ; ro*ider/(<&O&EDB123 ass,ord/a!udas623 +ser ID/a!udas623 Initial Catalo)/A!udas=03 Data (ource/a!udas=s>l; (en una l.nea 5nica) ,omo puede comprobar# resulta una tanto complicado construir la cadena de cone6i n $ mientras "ue seamos novatos en ADO podemos tener problemas para crear esta cadena. D+ero es "ue no e6iste una manera m%s f%cil de construir esta cadenaE Efectivamente. 7a$ un pe"ueJo truco mediante el cual no solo podemos crearla con un asistente# sino "ue adem%s probaremos si la cone6i n es satisfactoria o no. Truco 'ara construir la cadena de cone?i@n1 1) +rimero tenemos "ue incluir el componente K1icrosoft ADO data control L.G (OLEDB)M. +odemos !acerlo pulsando ,trl.N< o en el men5 +ro$ecto ,omponentes. :) 1etemos en nuestro formulario el control $ pulsamos 8I para ver sus propiedades. A) 7acemos ,lick en la propiedad ,onnection3tring $ nos aparecer% el bot n de puntos suspensivos. 7acemos ,lick en el bot n. I) A!ora nos aparece el asistente "ue nos mostrar% A opciones. Otili(ar un D34 de arc!ivo# utili(ar un controlador ODB, o utili(ar una cadena de cone6i n. En todos los casos# a la derec!a de la opci n !a$ una opci n "ue nos permite seleccionar o generar el origen de los datos. Osaremos la cadena de cone6i n (opci n por defecto) $ pulsaremos el bot n generar.

P) Al pulsar el bot n generar# nos aparece otra ventana en la "ue tenemos cuatro pestaJas aun"ue 5nicamente necesitaremos dos de ellas para crear una cadena de )ng. *. +aredes ,. P &isual Basic -u.a del Estudiante +%gina

cone6i n correcta $ probada. El resto de las pestaJas forman parte de otro cap.tulo e6clusivo del control data de ADO# aun"ue le invito a "ue curiosee por ellas. 3eleccionaremos el proveedor de datos "ue "ueramos utili(ar $ pulsaremos el bot n siguiente para pasar a la siguiente pestaJa.

L) En la +estaJa cone6i n# tenemos "ue proporcionar los datos correspondientes al proveedor de la base de datos a la "ue "ueremos conectar. +or ejemplo para conectar con una base de datos de tipo 0( Access (13 *et I.G OLEDB +rovider para la versi n :GGG de Access# 13 *et A.P OLEDB +rovider para la versi n H9 de Access)# tenemos "ue decirle el nombre $ pat! de la BD. +ara ello podemos utili(ar el bot n de los puntos suspensivos# "ue abrir% una ventana "ue permitir% seleccionar el arc!ivo .mdb . 3i utili(amos el proveedor de datos de Oracle# tendremos "ue indicarle como nombre de servidor la cadena de cone6i n utili(ada en el 3?L 4et o en el 4etF de Oracle (la misma cadena "ue especifica cuando se conecta a travs de 3?L;+lus). En esta pestaJa e6isten dos opciones interesantes0 K,ontraseJa en BlancoM# si la marcamos no nos permitir% teclear la contraseJa. K+ermitir guardar la contraseJaM# dependiendo de si est% o no seleccionada# incluir% o no en la cadena de cone6i n la clave del usuario. +ara la primera prueba le recomiendo "ue la mar"ue. 4o obstante# !aga diferentes pruebas con ellas para ver los resultados. Despus de !aber dado esta informaci n# pulsaremos el bot n +robar cone6i n. En el caso de "ue !a$a alg5n error# el asistente nos lo indicar% con un mensaje.

)ng. *. +aredes ,. L

&isual Basic -u.a del Estudiante

+%gina

+rueba de cone6i n (fallida) con +roveedor de datos de Oracle

+rueba satisfactoria 9) Ona ve( "ue !emos probado satisfactoriamente la cone6i n# pulsaremos aceptar $ volveremos a la pantalla inicial# la de las A opciones. La diferencia es "ue a!ora tenemos la cadena de cone6i n rellenada por el asistente. A!ora podemos copiarla con ctrl.N, $ llevarla a la parte del c digo donde "ueremos establecer la cone6i n. 4o se olvide de "ue es una cadena $ "ue cuando se asigne a la propiedad ,onnection3tring debe ir entre comillas dobles. F) Ona ve( "ue !emos probado "ue funciona al abrir el objeto ,onnection# 4o debemos olvidarnos de eliminar el control data de ADO $ de "uitar el componente de nuestro pro$ecto# salvo "ue lo va$amos a utili(ar para otra cosa. >a conocemos el truco para formar la cadena de cone6i n $ se la !emos introducido en la propiedad Connection(trin) D>a est% creada la cone6i nE 3.# pero todav.a no sirve para obtener datos de la base de datos. +ero $a !emos avan(ado muc!o. A!ora nuestro programa $a sabe al menos# como poder abrir esa base de datos# pues conoce su nombre# usuario "ue la abre $ +assCord. 3olamente "ueda aplicar un mtodo del objeto ,onnection0 el mtodo O'en con una sinta6is "ue no es e6cesivamente dif.cil0 1icone6i n.Open

)ng. *. +aredes ,. 9

&isual Basic -u.a del Estudiante

+%gina

!a cone2i3n se %a a realizar a una base de datos que est en un ser%idor. $ste ser%idor puede definirse, bien por su direcci3n 6* o por su nombre. !o normal es definirlo por su nombre /+er%er7+Q!7Mae1 no por su direcci3n 6*. Ob%iamente el nombre del ser%idor corresponder a una direcci3n 6* /8amos a considerar una red 6* esttica, pues si pretendemos entrar a e2plicar lo que es una red con direcciones 6* asignadas dinmicamente se nos complica la e2plicaci3n1. $sa direcci3n 6* debemos indicrsela al *& en el fic)ero 9osts /o !m)osts1 que estn en la carpeta :indo;s o en una de sus subcarpetas. $n estos fic)eros e2plica como )acerlo. No se e2tra0e si, una %ez indicado en ese fic)ero, sigue sin encontrarlo. !a primera cone2i3n con el ser%idor la busca mediante llamadas broadcast en la red que no siempre son bien tratadas por los routers. $n muc)as ocasiones )e tenido que buscar el ser%idor a mano /entorno de red1 , milagros de :indo;s, a partir de esa operaci3n a lo encuentra sin problemas. +ara seguir un poco el ejemplo "ue acompaJa a este cap.tulo# vamos a ver el c digo utili(ado para crear la cone6i n. En el ejemplo usamos una base de datos Access (4o es la mejor para demostrar como funciona ADO# pero es la "ue los alumnos van a tener con ma$or facilidad. Ona base Oracle o 3?L no se instala f%cilmente en un ordenador personal) 3et 1i,one6ion B 4eC ADODB.,onnection Q1i,one6ion.,onnection3tring B R+roviderB1icrosoft.*et.OLEDB.I.G'Data 3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR Q1i,one6ion.Open A!ora nuestro programa $a est% en contacto con la base de datos. Lo "ue falta $a lo puede suponer0 crear un recordset. A"u. vamos a ver la primera diferencia con DAO. El recordset no lo crea el objeto ,onnection. 3e crea l a s. mismo. +ara "ue pueda e6istir un objeto =ecordset primero !a$ "ue declararlo0 Dim 1i=ecordset As ADODB.=ecordset (7a$ "ue declararlo en el sitio adecuado dependiendo del %mbito "ue necesite)

En el procedimiento donde se va$a a crear el recordset# para crearlo utili(aremos la siguiente sinta6is0 3et 1i=ecordset B 4eC ADODB.=ecordset (>a est% creado. +ero no est% abierto# a!ora !a$ "ue abrirlo)

1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic >a tenemos abierto el recordset. En este caso el recordset est% formado por todos los registros con todos sus campos de la tabla Alumnos# "ue est% en la base de datos definida en la cone6i n 1i,one6ion# es del tipo D$namic $ el blo"ueo de escritura es optimista. +odr.amos elegir ciertos registros# $ solamente unos campos. Otili(ar.amos una sentencia 3?L 1i=ecordset.O'en R3elect AlumnoT4ombre# AlumnoTApe/# AlumnoTApe: 8rom Alumnos R T U KV!ere AlumnoT4ombre B WLuisXM# 1i,one6ion# adOpenD$namic# adLockOptimistic 3i no !ubisemos creado previamente el objeto ,onnection# podr.amos crear $ abrir igualmente este objeto recordset# pero# en ve( de pasarle el nombre de la cone6i n (1i,one6ion) le pasar.amos la cadena de cone6i n usada para crear ese objeto ,onnection.

3et 1i=ecordset B 4eC ADODB.=ecordset 1i=ecordset.Open RAlumnosR# R+roviderB1icrosoft.*et.OLEDB.I.G'Data 3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR# adOpenD$namic# adLockOptimistic )ng. *. +aredes ,. F &isual Basic -u.a del Estudiante +%gina

/$s solamente una l#nea. 9a sido :ord quien la )a troceado1 A!ora $a podemos presentar los campos del recordset# usando la sinta6is "ue $a conocemos de DAO <b4ombre B KM U 1i=ecordsetYAlumnoT4ombre <bApe/ B KM U 1i=ecordsetYAlumnoTApe/ <bApe: B KM U 1i=ecordsetYAlumnoTApe: 7agamos una pe"ueJa pausa. Observe "ue !a$ diferencias de trabajar con ADO o !acerlo con DAO. Con DAO1 Declarar 1i3esion# 1iBase $ 1i=ecordset Dim 1i3esion as Vorkspace Dim 1iBase As DataBase Dim 1i=ecordset as =ecordset ,rear el objeto Vorkspace# el objeto DataBase $ el objeto =ecordset 3et 1i3esion B Vorkspaces(G) 3et 1iBase B 1i3esion.OpenDatabase (K,0S-uiadelEstudianteSAlumnos.1dbM) 3et 1i=ecordset B 1iBase.Open=ecordset (KAlumnos# dbOpenD$naset) Con ADO (Creando el o8Aeto Connection) Declarar 1i,one6ion $ 1i=ecordset Dim 1i,one6ion As ADODB.,onnection Dim 1i=ecordset As ADODB.=ecordset ,rear la cone6i n $ ponerle la cadena de cone6i n en su propiedad ,onnection3tring 3et 1i,one6ion B 4eC ADODB.,onnection 1i,one6ion.,onnection3tring B R+roviderB1icrosoft.*et.OLEDB.I.G'Data 3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR Abrir el objeto ,onnection 1i,one6ion.Open ,rear el objeto recordset 3et 1i=ecordset B 4eC ADODB.=ecordset Abrir el objeto =ecordset 1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic Con ADO ((in crear el o8Aeto Connection) Declarar 1i=ecordset Dim 1i=ecordset As ADODB.=ecordset ,rear el =ecordset 3et 1i=ecordset B 4eC ADODB.=ecordset Abrir el =ecordset 1i=ecordset.Open RAlumnosR# R+roviderB1icrosoft.*et.OLEDB.I.G'Data 3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR# adOpenD$namic# adLockOptimistic Obser%e siempre que tanto en las declaraciones del ob.eto &onnection como en su creaci3n, debemos anteponer siempre la palabra ADOD< del ob.eto -ecordset,

<anto el objeto =ecordset como el objeto ,onnection se deber%n cerrar cuando $a no se utilicen# o al menos# al cerrar la aplicaci n. Esto es tanto m%s necesario cuanto ma$or sea la )ng. *. +aredes ,. H &isual Basic -u.a del Estudiante +%gina

seguridad de la base de datos "ue vamos a utili(ar. En algunas bases de datos# dejar una sesi n abierta significa dejar una aplicaci n (ombie ejecut%ndose en el servidor# "ue !abr% "ue cerrar desde su propio sistema operativo. Este problema no le va a ocurrir utili(ando Access# pero como $a se dijo al principio# Access no es el mejor ejemplo de utili(aci n de ADO. +ara cerrar una sesi n $ un recordset utili(aremos el mtodo ,lose 1i=ecordset.,lose 1i3esion.,lose (=ecuerde "ue debe cerrar antes el recordset "ue la cone6i n)

B<uC 'asa con el e>ui*alente del DorEs'aceF ,uando resum.amos en la p%gina anterior el c digo a usar si us%bamos DAO o ADO# parec.a (aun"ue no fuese cierto) "ue pod.amos asimilar estos objetos DAO =ecordset DataBase Vork3pace ADO =ecordset ,onnection D

Efectivamente el Vorkspace no tiene algo "ue pudisemos decir Ke"uivalenteM en ADO. Esto es debido a "ue ADO $a considera "ue el acceso desde los usuarios lo gestiona directamente la base de datos. =ecuerde "ue el Vorkspace en DAO era una Ksesi n de trabajoM de la base de datos# donde pod.amos asociar un Vorkspace a cada usuario. ADO $a le pasa a la BD el nombre del usuario $ su +assCord para "ue la propia base de datos "uien autorice a ese usuario. Al)unas cosas >ue le *an a ocurrir cuando !a Ga!a creado el recordset1 El empleo de bases de datos complejas en cuanto a seguridad nos va a obse"uiar con limitaciones a los recordsets "ue vamos a abrir en ADO. > adem%s esas sorpresas van a ser distintas si usa uno u otro tipo de base de datos. (nos centraremos solamente en Oracle $ 3?L3erver. Access# con la modestia "ue le caracteri(a# no va a dar ning5n problema.) Los recordsets abiertos mediante una consulta 3?L (a"uellos en los "ue seleccionamos parte de los registros mediante (elect H DGere van a crearse solo de lectura. )ndependientemente de los par%metros "ue le pasemos a la !ora de crearlos. La descripci n del error va a ser algo as. como "ue el cursor es solamente de lectura. <ambin observar% con frecuencia# cuando intente ir a un registro anterior al actual# 1i=ecordset.1ove8irst# p.e.) "ue le enviar% un error diciendo "ue el cursor es solamente de avance !acia a delante. Estos efectos los observar% tambin cuando use la instrucci n 3?L Order B!. 4o !a$ "ue arrojar la toalla solamente por esto. ,uando eso ocurra# lo "ue !a$ "ue !acer es volver a crear el recordset de forma "ue acepte escritura $ movimiento !acia atr%s. Eso generalmente se logra abriendo el recordset con todos los registros de la tabla# e inclu$endo en l todos los campos. En ve( de 0 1i=ecordset.O'en R3elect AlumnoT4ombre# AlumnoTApe/# AlumnoTApe: 8rom Alumnos R T U KV!ere AlumnoT4ombre B WLuisXM# 1i,one6ion# adOpenD$namic# adLockOptimistic usar esta otra alternativa0 1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic +osiblemente necesitemos crear dos recordsets en un mismo procedimiento. +or ejemplo# es mu$ t.pico tener "ue buscar el 5ltimo registro para ver el 5ltimo n5mero de un identificador de registro (AlumnoT)D) $ poner en este campo# al registro "ue vamos a crear# un n5mero igual a ese m%s /. En ese caso# abrir.amos el recordset usando la sentencia Order B$ AlumnoT)D. ,uando "ueramos introducir un nuevo registro mediante0

)ng. *. +aredes ,. /G

&isual Basic -u.a del Estudiante

+%gina

1i=ecordset.Add4eC nos dir% "ue el cursor (el recordset# para entendernos) es solamente de lectura. La soluci n es# abrir el recordset con la sinta6is anterior# leer el n5mero de AlunmoT)D# cerrar el recordset# crear otro recordset con el mismo nombre# usando la sinta6is0 1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic A!ora $a nos permitir% usar el mtodo Add4eC. Basta con aJadir las l.neas de c digo adecuado para introducir los valores en cada campo0 1irecordset.Add4eC 1i=ecordsetYAlumnoT)D B &alor numrico 1i=ecordsetYAlumnoT4ombre B &alor string Etc. Z. 1i=ecordset.Opdate 4o renuncie nunca a intentar !acer esto. 4o siempre funciona. +ero esto es muc!o m%s sencillo "ue introducir los datos Ka cap nM utili(ando la instrucci n 3?L Insert "ue $a veremos m%s adelante. 3?L3erver es bastante m%s d cil "ue Oracle para usar el mtodo Add4eC. A este respecto, )a que citar la propiedad &ursor!ocation que %eremos ms adelante. +i creamos un cursor lado cliente, seguramente nos permitir utilizar ms opciones /entre ellas AddNe;1 que si lo establecemos de lado ser%idor. =enga en cuenta que si usa un cursor lado cliente, el recordset no se actualiza cuando otro usuario realiza modificaciones en la base. 0odi#icar datos -ediante EDIT En ADO no !ace falta usar Edit para modificar los datos del registro actual. Edit no existe en ADO. +ara modificar un dato basta con poner el mismo c digo "ue utili(%bamos en DAO# pero sin comen(ar por la l.nea 1irecordset.Edit. ,oloc%ndonos en el registro a modificar pondremos0 1i=ecordsetYAlumnoT4ombre B K+edroM 1i=ecordsetYAlumnoTApe/ B K+ere(M 1i=ecordset.Opdate De cual"uier forma# esto tampoco tiene por"ue funcionar en todas las bases de datos. En ese caso tendremos "ue recurrir# al igual "ue para un registro nuevo# a las instrucciones 3?L# "ue en este caso ser% +'date1 +ero $a lo veremos m%s adelante. 7asta a!ora solamente !e "uerido usar el c digo m%s simple para "ue pueda empe(ar con ADO# $ sobre todo# para "ue vea "ue esta es una tcnica completamente accesible# aun"ue# dadas las grandes prestaciones "ue tiene# un poco m%s adelante se va a complicar algo. >a !a visto "ue podemos trabajar perfectamente con recordsets# tal como lo !emos !ec!o con el DAO de toda la vida. +ero $a lo coment%bamos al principio# parece "ue !a$ "ue adornar lo obvio para "ue no lo pare(ca tanto. > a!. viene el Objeto ,ommand# "ue como !abr% podido ver en la figura de la *erar"u.a de los objetos ADO# es un objeto "ue a5n no sabemos lo "ue !ace. El o8Aeto Co--and lo "ue va a !acer es crear un recordset. O tambin# meter 4a cap3n5 un nuevo registro# o borrarlo# utili(ando directamente instrucciones 3?L. 7a$ "ue darse cuenta "ue ADO trabaja con una gran diversidad de bases de datos# $ no todas trabajan igual. +or eso# muc!as veces fallan operaciones tan sencilla como aJadir un nuevo registro con el mtodo Add4eC del recordset 1i=ecordset.Add4eC > !a$ "ue emplear una instrucci n 3?L0 I$(E"T

)ng. *. +aredes ,. //

&isual Basic -u.a del Estudiante

+%gina

En estos casos# en ADO utili(amos el mtodo E@E,O<E sobre el objeto ,onnection. ,reamos una variable# 3tr)ntroducir# con el contenido de la instrucci n 3?L $ ejecut%bamos esa instrucci n mediante E6ecute 3tr)ntroducir B R)nsert )nto )4<TDO,O1E4<O3 R T U R(,LTDO,#4O1TDO,#<)<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD+<TDO,#M T U KLT<)+OTDO,#8),7TDO,#8E,7ATE1)3)O4TDO,#OL<)1AT7O=ATDO,#&)3)BLETDO,)RT U R&alues (R U 4umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U RQ#QR U <b<itulo.<ag T U RQ#/H#:#/#QR U 7=ef+rensa U R2R U <b4omb8ic!<)8 U RQ#QR U Date U RQ#G#/)R ,one6BD+rensa.E?ecute 3tr)ntroducir Esta l.nea (3tr)ntroducir) es el contenido de la propiedad ,ommand<e6t de un objeto ,ommand de ADO. 4i m%s ni menos "ue una instrucci n "ue "ueremos reali(ar sobre la BD. On objeto ,ommand tiene pocas cosas m%s. ,omo objeto ADO "ue es tiene sus propiedades $ mtodos. +ero en esencia es lo "ue acaba de ver con la instrucci n E@E,O<E del objeto ,onnection. Lo "ue pasa# "ue ADO lo !an !ec!o mu$ organi(ado# $ por eso tiene la categor.a de Objeto. Es !acer lo mismo# utili(ando las mismas e6presiones# pero d%ndole m%s cuerpo. ,on la instrucci n anterior# lo "ue !ac.amos era aJadir un registro. 3i lo "ue "ueremos !acer es crear un recordset# la instrucci n 3?L comen(ar.a por K3elect ; 8rom Z.M > el mtodo E@E,O<E devolver.a un =ecordset 3tr)ntroducir B K3elect ; 8rom Alumnos V!ere Apellido/ B W3uare(XM +odemos crear un recordset (1i=ecordset# previamente declarado como tal) con esta instrucci n 1i=ecordset B ,one6BD+rensa.E?ecute 3tr)ntroducir O con estas otras 3et 1i,omando as 4eC ADODB.,ommand 1i,omando.Active,onnection B ,one6BD+rensa 1i,omando.,ommand<e6t B K3elect ; 8rom Alumnos V!ere Apellido/ B W3uare(XM 1i=ecordset B 1i,omando.E6ecute &er% el ejemplo completo al final del cap.tulo. A!ora# tras la e6plicaci n informal de c mo se crea una cone6i n $ un recordset en ADO# $ "ue es un ,ommand# vamos a entrar a conocer sus propiedades $ mtodos. Al final# $ con un buen ejemplo reali(ado de varias formas# entender% perfectamente la forma de trabajar con ADO.

)ng. *. +aredes ,. /:

&isual Basic -u.a del Estudiante

+%gina

ADO. El Objeto ,onnection


On objeto Connection representa una cone6i n abierta con un origen de datos. >a !emos

visto como crear un objeto ,onnection# por lo "ue vamos a pasar directamente a ver sus objetos# colecciones# propiedades $ mtodos. ,omo puede verse en la figura# el Objeto ,onnection tienen los objetos ,ommand $ =ecordset# $ la colecci n Errors. El O8Aeto "ecordset es el recordset de toda la vida0 un conjunto de registros "ue contienen datos. El Objeto =ecordset# aun"ue pertenece al objeto ,onnection# puede crearse sin "ue e6ista previamente un objeto ,onnection. Esta es una de las propiedades de los objetos ADO0 no necesita cumplir estrictamente con la jerar"u.a. El O8Aeto Co--and es una definici n de un comando espec.fico "ue se piensa ejecutar contra un origen de datos. Los objetos ,ommand sirven para tener almacenadas operaciones de acceso a datos $ usarlas en el momento adecuado# simplemente cit%ndolas. Lo "ue obtenemos de un objeto ,ommand es# o un recordset (ver% "ue no merece la pena usar un objeto ,ommand para crear un recordset# puesto "ue se pueden crear directamente) o una operaci n "ue afecte a los registros de la base de datos (aJadir registros# borrarlos# si es "ue no se deja !acer eso mediante recordsets) La Colecci@n Errors es el conjunto de errores generados por el proveedor de datos ante el fallo de una operaci n de acceso. La colecci n Errors se refiere 5nicamente a los errores generados por el proveedor# no a los fallos interceptables producidos por el programa# "ue deben ser tratados de la forma !abitual0 mediante Err ro'iedades del O8Aeto Connection /!ea esto de las propiedades sin complicarse demasiado la %ida. !as realmente importantes %er que estn ad%ertidas debidamente1 Las propiedades del objeto ,onnection dependen de cada proveedor. 4o todos se comportan de igual forma# por lo "ue cada propiedad debe condicionarse a si el proveedor es capa( de ofrecerla. ro'iedad Attri8utes Es un Long. Acepta dos valores o la suma de los dos0 adXactCo--it"etainin) adXactA8ort"etainin) Estos atributos condicionan el modo de operaci n de la cone6i n con los mtodos ,ommit<rans $ =ollBack<rans. ro'iedad Co--andTi-eout )ndica# en segundos# el intervalo de espera para "ue se ejecute un comando (Objeto ,ommand) antes de "ue finalice el intento $ se genere un error. Es un Long. El valor predeterminado es AG. ro'iedad ConnectionTi-eout )ndica# en segundos# el intervalo de espera para establecer una cone6i n antes de "ue finalice el intento $ se genere un error. Es un Long $ el valor predeterminado es /P.

)ng. *. +aredes ,. /A

&isual Basic -u.a del Estudiante

+%gina

ro'iedad Connection(trin) ()1+O=<A4<E) Es una cadena de caracteres "ue contiene la informaci n "ue se utili(a para establecer una cone6i n a un origen de datos. (&ea la e6plicaci n amplia m%s atr%s) La cadena de cone6i n tiene varios argumentos# todos ellos separados por un punto $ coma (') de la forma argumento> ? %alor@ argumentoA ? %alor@ argumentoB ? %alor etc. ADO procesa solamente cuatro argumentos0 +rovider# 8ile 4ame# =emote +rovider $ =emote 3erver. Los dem%s argumentos los pasa al proveedor para "ue el los procese (Osuario# +assCord# etc) 3i al emplear el mtodo Open se utili(a el par%metro ,onnection 3tring# este par%metro utili(ado en el mtodo Open sustituir% a cual"uier otro e6istente anteriormente. Ona ve( abierta la cone6i n# esta propiedad no se puede cambiar puesto "ue es solamente de lectura. Los argumentos File Name $ Provider son e6clu$entes. ro'iedad Cursor&ocation ()1+O=<A4<E)

Establece o devuelve la posici n de un servicio de cursores. Es un Long# $ acepta las siguientes constantes0 Ad+se$one 4o se usan servicios de cursor. (Esta constante es obsoleta $ aparece 5nicamente por compatibilidad con versiones anteriores.) Ad+seClient Osa cursores del lado del cliente. Ad+se(er*er +redeterminado. Osa cursores del lado servidor. Esta propiedad parece "ue no dice nada. > es sumamente importante. Los cursores son# por decirlo de alguna manera# los mecanismos de la base de datos donde se crean los recordsets. 3e estar% dando cuenta "ue las bases de datos "ue tienen cursores son $a bases de datos con mecanismos propios para la creaci n de recordsets. (3?L 3erver u Oracle# p.e.) Estas bases de datos trabajan como aplicaciones cliente [ servidor. <ienen en el servidor# aparte de los datos# la ma$or.a de sus recursos. En el cliente tienen pr%cticamente los recursos de conectividad# $ poco m%s. Esta conectividad permite enviar desde el cliente una petici n a la base de datos alojada en el servidor. Esa petici n ser% el resultado por ejemplo# de una sentencia 3?L. Al recibirla el servidor# gestionar% la obtenci n de los resultados $ una ve( "ue los !a$a conseguido viene su primera duda0 DD nde los almacenoE +uede almacenarlos en el servidor# $ cada ve( "ue necesitemos un nuevo registro# por ejemplo al ejecutar la sentencia 1i=ecordset.1ove4e6t# el cliente se lo indica al servidor $ este le env.a el nuevo registro. <ambin puede almacenar los datos obtenidos en el cliente# $ de esta forma el cliente puede moverse con entera libertad a lo largo de los registros del recordset. +uede !asta contarlos $ saber en "ue posici n est%. La diferencia entre uno $ otro sistema es "ue en el primer caso el tr%fico por la red es m.nimo (solamente se env.a la informaci n estrictamente necesaria) $ en el segundo caso# se env.a muc!a informaci n de un golpe# la correspondiente a todos los registros del recordset# independientemente de si se va a usar en el servidor o no. ,onsiderando el tr%fico generado# parece "ue es mejor crear los cursores en el lado servidor. +ero esto trae tambin sus dificultades. 4os priva de muc!as propiedades del recordset. Ona propiedad mu$ usada# Absolute+osition# no la tienen los cursores de lado servidor# circunstancia "ue no nos debe sorprender# $a "ue al no estar todos los registros en el cliente# ste# aun"ue disponga de todos los datos guardados en todos los campos de un determinado registro# no puede saber "ue posici n ocupa ese registro dentro de la totalidad de registros del recordset. +or lo tanto# usar cursores de lado cliente o lado servidor ser% siempre una decisi n a tomar dependiendo de la velocidad de la red# de la memoria disponible en el cliente# de la complejidad del programa# etc. =ecuerde "ue por defecto# ADO crea cursores de lado servidor. +ara "ue la cone6i n le cree todos los cursores de lado cliente basta ejecutar la instrucci n0

)ng. *. +aredes ,. /I

&isual Basic -u.a del Estudiante

+%gina

1i,one6ion.,ursorLocation B adOse,lient 3i desea !acer transacciones# deber% crear cursores del lado servidor# $a "ue los de lado cliente no las admiten. ,omprender% seg5n va$a programando $ encontr%ndose con problemas# "ue esta propiedad es absolutamente importante. Este valor debe establecerlo antes de crear la cone6i n. De esta forma# todos los cursores creados con esa cone6i n ser%n de lado cliente o lado servidor# seg5n !a$a elegido. +ero muc!as veces ser.a ideal "ue unos recordsets tuvieran el cursor de un tipo $ otros de otro. Los recordsets tambin tienen esta propiedad# por lo "ue puede elegir el lado deseado para cada recordset utili(ando esta propiedad aplicada no a la cone6i n# sino al recordset. El n5mero de registros "ue el servidor env.a al cliente# cuando el cursor es de lado servidor# se controla mediante la propiedad CacGe(iIe del recordset. Lo ver% m%s adelante. ro'iedad De#aultData8ase Establece la base de datos predeterminada para un objeto ,onnection. Es un string con el nombre de la base de datos por defecto de esa cone6i n. 3olamente es v%lida con a"uellos proveedores "ue permiten varias bases de datos por cone6i n. Isolation&e*el Esta propiedad afecta al comportamiento de un objeto ,onnection durante una transacci n. Ona ve( establecida esta propiedad# solamente ser% efectiva cuando se invo"ue el mtodo Beguin<rans. &ea la a$uda para ma$or informaci n de los valores posibles. ro'iedad 0odeJ Establece los permisos disponibles para modificar datos en un objeto ,onnection. Los valores aceptados son0 Ad0ode+nEno,n +redeterminada. )ndica "ue los permisos no se !an establecido a5n o "ue no se pueden determinar. Ad0ode"ead )ndica "ue son permisos de s lo lectura. Ad0odeDrite )ndica "ue son permisos de s lo escritura. Ad0ode"eadDrite )ndica "ue son permisos de lectura2escritura. Ad0ode(GareDen!"ead )mpide "ue otros abran una cone6i n con permisos de lectura. Ad0ode(GareDen!Drite )mpide "ue otros abran una cone6i n con permisos de escritura. Ad0ode(GareE?clusi*e Ad0ode(GareDen!$one )mpide "ue otros abran una cone6i n. )mpide "ue otros abran una cone6i n con cual"uier tipo de permiso.

3 lo puede establecer la propiedad 0ode cuando el objeto Connection est% cerrado. ,uando se usa en un objeto Connection del lado del cliente# la propiedad 0ode s lo se puede establecer a ad0ode+nEno,n . ro'iedad ro*ider Es un string "ue indica el nombre del proveedor de un objeto ,onnection. 3i no se especifica ning5n proveedor# la propiedad tendr% el valor predeterminado 13DA3?L (+roveedor de 1icrosoft OLE DB para ODB,).

)ng. *. +aredes ,. /P

&isual Basic -u.a del Estudiante

+%gina

ro'iedad (tate Devuelve el estado del objeto ,onnection0 abierto (ad3tateOpen B /) o cerrado (ad3tate,losed B G). ro'iedad Version Devuelve el n5mero de versi n de ADO. Es un 3tring.

0Ctodos del O8Aeto Connection


0Ctodos Be)inTransJ Co--itTrans ! "oll8acETrans Estos mtodos de transacci n administran el proceso de la transacci n dentro de un objeto ,onnection de la forma siguiente0 Be)inTrans 0 inicia una nueva transacci n. Co--itTrans0 guarda las modificaciones $ termina la transacci n actual. <ambin puede iniciar una nueva transacci n. "oll8acETrans0 cancela las modificaciones efectuadas durante la transacci n actual $ termina la transacci n. <ambin puede iniciar una nueva transacci n.

Despus de invocar el mtodo Be)inTrans# el proveedor $a no aplicar% inmediatamente las modificaciones !asta "ue invo"ue Co--itTrans o "oll8acETrans para terminar la transacci n. Los mtodos Be)inTrans # Co--itTrans $ "oll8acETrans no est%n disponibles en los objetos Connection del lado del cliente.

0Ctodo Cancel ,ancela la ejecuci n de una llamada as.ncrona pendiente a un mtodo E?ecute u O'en. 3inta6is 4ombre,onection1Cancel

El mtodo Cancel se utili(a para terminar la ejecuci n de una llamada as.ncrona a un mtodo E?ecute o O'en (es decir# el mtodo fue invocado con la opci n adAs!ncConnect# adAs!ncE?ecute o adAs!ncFetcG). Cancel devolver% un error de ejecuci n si no se utili( adAs!ncE?ecute en el mtodo "ue "uiere terminar. CloseJ -Ctodo ,ierra el objeto ,onnection. 3inta6is NombredelOb.eto&onnection.Close

El cierre de un objeto Connection mientras !a$ objetos "ecordset abiertos en la cone6i n cancela las modificaciones pendientes en todos los objetos "ecordset. El cierre e6pl.cito de un objeto Connection (llamando a su mtodo Close) mientras una transacci n est% en progreso genera un error. 3i un objeto Connection cae fuera del alcance mientras la transacci n est% en progreso# ADO cancela autom%ticamente la transacci n. El cierre de un objeto ,onnection no lo elimina de la memoria' puede modificar los valores de sus propiedades $ volver a abrirlo m%s tarde. +ara eliminar completamente un objeto de la memoria# estable(ca la variable de objeto a Not)ing. 3et NombredelOb.eto&onnection B 4ot!ing

)ng. *. +aredes ,. /L

&isual Basic -u.a del Estudiante

+%gina

0Ctodo E?ecute (&ea tambin 1todo E6ecute para el objeto ,ommand) Ejecuta una consulta# instrucci n 3?L# procedimiento almacenado especificados o te6to espec.fico del proveedor. 3inta6is (+ara una cadena de comando "ue no devuelva filas)0 cone2i3n1E?ecute CommandText# RecordsAffected# Options (+ara una cadena de comando "ue de%uel%a filas1' (et Mi-ecordset B connection1E?ecute (CommandText# RecordsAffected# Options) (1i=ecordset debe ser una variable declarada tipo ADODB.=ecordset) CommandText $s un 3tring "ue contiene la instrucci n 3?L# el nombre de la tabla# el procedimiento almacenado o el te6to espec.fico del proveedor "ue se va a ejecutar. RecordsAffected Opcional. Ona variable Long en la "ue el 'ro*eedor de*uel*e el n5mero de registros afectados por la operaci n. Options Opcional. Ona constante o valor Long "ue indica c mo debe evaluar el proveedor el argumento CommandText. +uede ser uno de los siguientes valores. Constante adC-dTe?t adC-dTa8le adC-dTa8leDirect adC-dTa8le adC-d(tored roc adC-d+nEno,n adAs!ncE?ecute adAs!ncFetcG Descri'ci@n )ndica "ue el proveedor tiene "ue evaluar CommandText como definici n te6tual de un comando# como una instrucci n 3?L. )ndica "ue ADO tiene "ue generar una consulta 3?L para devolver todas las filas de la tabla mencionada en CommandText. )ndica "ue el proveedor tiene "ue devolver todas las filas de la tabla mencionada en CommandText. )ndica "ue ADO tiene "ue generar una consulta 3?L para devolver todas las filas de la tabla mencionada en CommandText. )ndica "ue el proveedor tiene "ue evaluar CommandText como procedimiento almacenado. )ndica "ue el tipo de comando en CommandText es desconocido. )ndica "ue el comando se tiene "ue ejecutar de forma as.ncrona. )ndica "ue el resto de las filas siguientes a la cantidad inicial especificada en la propiedad CacGe(iIe tiene "ue ser recuperada de forma as.ncrona.

,uando esta operaci n termina se genera el evento E6ecute,omplete. 0Ctodo O'en ()1+O=<A4<E)

Abre una cone6i n a un origen de datos. 3inta6is 1i,onnection1O'en ConnectionSTring J UserIDJ Pass ord! Options 1i,onnection1O'en Los par%metros &onnection+=ring# ,ser6D# *ass;ord, Options puede introducirlos previamente a abrir la cone6i n# $ utili(ar la segunda sinta6is cuando desee abrirla realmente. Estos par%metros se le pasan en la cadena de cone6i n0 ,one6BD+rensa.,onnection3tring B R+roviderB13DAO=A./'Oser )DB)4<=A4E<'M U T K+assCordB)4<=A4E<'Data 3ourceBintranet'+ersist 3ecurit$ )nfoB8alseR Options Opcional. +uede ser una de las constantes siguientes0 Ad,onnectOnspecified Abre la cone6i n de forma sincron.a AdAs$nc,onnect Abre la cone6i n de forma as.ncrona

)ng. *. +aredes ,. /9

&isual Basic -u.a del Estudiante

+%gina

,uando se usa un objeto ,onnection del lado del cliente# el mtodo Open no establece realmente una cone6i n con el servidor !asta "ue se abre un =ecordset del objeto ,onnection.

Colecciones del O8Aeto Connection


Colecci@n Errors ,ontiene todos los objetos Error creados en respuesta a un 5nico fallo relacionado con el proveedor. ,ada objeto Error representa un error espec.fico del proveedor# no un error ADO. Los errores ADO se e6ponen al mecanismo de control de e6cepciones en tiempo de ejecuci n. +or ejemplo# en 1icrosoft &isual Basic# cuando ocurre un error espec.fico de ADO dispara un evento On Error $ aparece en el objeto Err. ,uando otra operaci n ADO genera un error# se borra la colecci n Errors $ el nuevo conjunto de objetos Error se coloca en la colecci n Errors. Las operaciones ADO "ue no generan un error no tienen ning5n efecto sobre la colecci n Errors. +ara borrar manualmente la colecci n Errors utilice el mtodo Clear. ,ada objeto Error de la colecci n# nos dar% informaci n sobre un error producido en la cone6i n. 3us propiedades son las siguientes0 Descri'tion% ,ontiene la descripci n del error producido (3tring). $ati*eError% )ndica el error devuelto por la base de datos (Long). $u-8er% Es el c digo de error (Long). (ource% )ndica el nombre del objeto o aplicaci n "ue !a generado el error (3tring). (<&(tate% )ndica el error 3?L est%ndar asociado.(3tring). Debido a "ue este objeto ser% de gran utilidad a continuaci n se inclu$e un ejemplo de su uso. Ejemplo del tratamiento de errores0 El resultado de la ejecuci n es el siguiente0 +rivate 3ub ,B,one6ionT,lick() Dim 1i,one6/ As ADODB.,onnection Dim 1iError As ADODB.Error On Error -o<o =utErr 3et 1i,one6/ B 4eC ADODB.,onnection 1i,one6/.,onnection3tring B R+roviderB13DAO=A./'+assCordBtiger'Oser )DBE(cot'Data 3ourceB1AD=)D'+ersist 3ecurit$ )nfoB<rueR 1i,one6/.Open E6it 3ub =utErr0 8or Eac! 1iError )n 1i,one6/.Errors 1sgBo6 (RError &B0R U 1iError.4umber U vb,rLf T U RError Oracle0R U 1iError.4ativeError U vb,rLf T U RError 3?L0R U 1iError.3?L3tate U vb,rLf T U R-enerado +or0R U 1iError.3ource U vb,rLf T U RDescripci n0R U 1iError.Description) 4e6t End 3ub

,omo puede observarse# algunas de las propiedades no devuelven los valores esperados0 4ativeError vale G cuando deber.a valer [/G/9# "ue es el error asociado de Oracle. A5n as. podemos capturar el c digo del error desde la cadena de caracteres descri'tion . ,on este )ng. *. +aredes ,. /F &isual Basic -u.a del Estudiante +%gina

comentario se pretende sugerir "ue se realicen pruebas con el proveedor de datos "ue va$amos a utili(ar para conocer su comportamiento respecto a este objeto error $ d nde nos devuelve los c digos. Observese en el c digo "ue la declaraci n de 1iError se !ace con ADODB.Error

Colecci@n ro'erties
Es el conjunto de objetos +ropert$ O8Aeto ro'ert! On objeto ro'ert! representa una caracter.stica din%mica de un objeto ADO "ue est% definida por el proveedor.

Los objetos ADO tienen dos tipos de propiedades0 intrnsecas $ dinK-icas. Las propiedades intr.nsecas son a"uellas propiedades implementadas en ADO e inmediatamente disponibles para cual"uier nuevo objeto# utili(ando la sinta6is O8Aeto. ro'iedad . 4o aparecen como objetos ro'ert! en la colecci n +roperties de un objeto# de forma "ue aun"ue puede modificar sus valores# no puede modificar sus caracter.sticas. Las propiedades din%micas est%n definidas por el proveedor de los datos $ aparecen en la colecci n ro'erties del objeto ADO apropiado. +or ejemplo# una propiedad espec.fica del proveedor puede indicar si un objeto =ecordset acepta transacciones o actuali(aciones. Estas propiedades adicionales aparecer%n como objetos ro'ert! en la colecci n ro'iedades de dic!o objeto "ecordset. A las propiedades din%micas se les puede !acer referencia s lo a travs de la colecci n# utili(ando la sinta6is Objeto.Properties(0) u Objeto.Properties("Name"). On objeto ro'ert! din%mico tiene cuatro propiedades incorporadas propias0 La propiedad $a-e es una cadena "ue identifica la propiedad. La propiedad T!'e es un entero "ue especifica el tipo de datos de la propiedad. La propiedad Value es un variant "ue contiene el valor de la propiedad. La propiedad Attri8utes es un valor Long "ue indica caracter.sticas de la propiedad espec.ficas del proveedor.

El O8Aeto "ecordset de ADO


El objeto "ecordset representa un conjunto de registros. El recordset en ADO puede crearse abrindolo# tomando todos los registros de una tabla o seleccion%ndolos con una consulta 3?L# o ejecutando un comando "ue contienen el nombre de esa tabla o la consulta. En un momento determinado# el objeto "ecordset s lo !ace referencia a un 5nico registro dentro del conjunto de registros# llamado registro actual.

ro'iedades del O8Aeto "ecordset


El recordset de ADO tiene propiedades iguales al recordset de DAO# pero tienen otras "ue no tienen el de DAO. 3e van a estudiar todas# profundi(ando m%s en las "ue son particulares del recordset ADO. )ng. *. +aredes ,. /H &isual Basic -u.a del Estudiante +%gina

ro'iedad A8solute osition (ADO) Especifica la posici n ordinal del registro actual de un objeto =ecordset. Esta propiedad devuelve un Long con el n5mero de orden del registro. Es posible "ue el recordset no acepte esta propiedad# dependiendo del proveedor de datos# $ del tipo de cursor (lado cliente o lado servidor. El cursor tipo lado servidor no permite esta propiedad) Esta propiedad devolver% / cuando el registro actual sea el primer registro del recordset. ro'iedades BOF ! EOF )ndican si la posici n del puntero del =ecordset est% apuntando a un registro anterior al primero (BO8 B <rue) o posterior al 5ltimo (EO8 B <rue). Esta propiedad siempre la podremos mirar# independientemente si el cursor es lado cliente o lado servidor. ro'iedad Acti*eConnection (ADO) )ndica a "u objeto ,onnection pertenece actualmente el objeto =ecordset especificado. Devuelve un string con el nombre del objeto ,onnection. ro'iedad BooE-arE Devuelve un marcador "ue identifica un.vocamente al registro actual de un objeto =ecordset o establece el registro actual de un objeto "ecordset al registro identificado por un marcador v%lido. El valor del Bookmark !a$ "ue introducirlo en una variable tipo &ariant. La propiedad Bookmark solo podr% establecerse cuando el proveedor lo permita. +uede utili(arse el mtodo (u''orts para averiguarlo. ,uando el recordset es de lado cliente# siempre est% disponible el Bookmark. ro'iedad CacGe(iIe )ndica el n5mero de registros del objeto =ecordset "ue est%n en la memoria cac! local. Es un Long de lectura $ escritura. El valor predeterminado es /. Esta propiedad nos permite conocer cuantos registros est%n en la memoria local. 3i ponemos esta propiedad por ejemplo a /G# al abrir la primera ve( el objeto "ecordset# el proveedor recupera los /G primeros registros en la memoria local. A medida "ue se despla(a por el objeto "ecordset# el proveedor devuelve los datos desde el b5fer de memoria local. <an pronto como pasa del 5ltimo registro de la memoria cac!# el proveedor recupera los /G registros siguientes desde el origen de datos $ los carga en la memoria cac!. Los registros recuperados desde la memoria cac! no reflejan los cambios concurrentes "ue !agan otros usuarios en el origen de datos. +ara for(ar una actuali(aci n de todos los datos en la memoria cac!# debe usarse el mtodo "es!nc. ro'iedad 0a?"ecords )ndica el n5mero m%6imo de registros "ue se devuelven a un =ecordset desde una consulta. Es un Long $ el valor predeterminado es G# "ue significa sin l.mite (Obtienen todos los registros). Esta propiedad es de lectura $ escritura cuando el recordset est% cerrado# $ solamente de lectura cuando est% abierto. Esta propiedad debe usarse solamente cuando se prev "ue se pueden obtener un n5mero mu$ grande de registros. Es prudente tomar medidas frente a a"uellas operaciones en las "ue el ordenador pueda meterse en un proceso e6cesivamente largo o "ue ocupe m%s recursos de los disponibles. Estas cosas son las "ue suelen KcolgarM al ordenador $ en las "ue es mu$ frecuente ec!arle luego la culpa a VindoCs 3i estamos frente a una base de datos con todos los datos de los afiliados a la 3eguridad 3ocial# no es del todo prudente crear un recordset mediante esta sentencia0 3ELE,< ; 8rom Afiliados V!ere Apellido/ B W8ernande(X )ncluso las !a$ peores0 )ng. *. +aredes ,. :G &isual Basic -u.a del Estudiante +%gina

3ELE,< ; 8rom Afiliados A nadie se le ocurrir.a# pero puede surgir involuntariamente cuando ese acceso se reali(a desde un puesto de operaci n p5blico (Acceso desde )nternet por ejemplo). ,on la propiedad 0a?"ecords puede limitar el n5mero de registros obtenidos. +osiblemente no llegue a obtener el dato deseado# $ se vea en la obligaci n de reali(ar la misma consulta sucesivas veces !asta encontrarlo. ro'iedad Cursor&ocation Establece o devuelve la posici n de un servicio de cursores. Es idntica a la propiedad del mismo nombre vista m%s atr%s con todo detalle para el objeto ,onnection. ro'iedad CursorT!'e )ndica el tipo de cursor "ue se usa en un objeto =ecordset. Es de lectura $ escritura si el recordset est% cerrado# $ solo de lectura si est% abierto. +uede tomar uno de los siguientes valores0 AdO'enFor,ardOnl! +redeterminado. )dntico a un cursor est%tico# e6cepto s lo permite despla(arse !acia delante en los registros. Esto mejora el rendimiento en situaciones en las "ue s lo se "uiere pasar una ve( por cada registro. En muc!as ocasiones es necesario moverse por el recordset !acia delante $ !acia atr%s. Este tipo de cursor solamente permite moverse !acia delante. <enga presente "ue este es el tipo predeterminado. AdO'enLe!set ,ursor de conjunto de claves. )gual "ue un cursor din%mico# e6cepto "ue no se pueden ver los registros "ue agregan otros usuarios# aun"ue los registros "ue otros usuarios eliminan son inaccesibles desde su conjunto de registros. Los cambios "ue otros usuarios !acen en los datos permanecen visibles. AdO'enD!na-ic ,ursor din%mico. Las incorporaciones# cambios $ eliminaciones "ue !acen otros usuarios permanecen visibles# $ se admiten todo tipo de movimientos entre registros# a e6cepci n de los marcadores si el proveedor no los admite. Es el e"uivalente en DAO al tipo D$naset AdO'en(tatic ,ursor est%tico. Ona copia est%tica de un conjunto de registros "ue se puede usar para buscar datos o generar informes. Las incorporaciones# cambios o eliminaciones "ue !acen otros usuarios no son visibles. Es el e"uivalente en DAO al tipo 3naps!ot NOTA" +i un pro%eedor no admite el tipo de cursor solicitado, el pro%eedor puede que de%uel%a otro tipo de cursor. !a propiedad C#rsorT$pe cambiar para coincidir con el tipo de cursor en uso cuando el ob.eto Recordset se abra. *ara comprobar la funcionalidad espec#fica del cursor de%uelto, use el mtodo +upports. &uando cierre el Recordset, la propiedad C#rsorT$pe %ol%er a su configuraci3n original.

ro'iedad &ocET!'e )ndica el tipo de blo"ueo "ue se pone en los registros durante el proceso de edici n. Establece tambin si el recordset se actuali(a registro a registro o por lotes. Este 5ltimo sistema permite reali(ar varios cambios en el recordset $ mantenerlos en la cac! durante cierto tiempo# $ proceder a la actuali(aci n de todos los cambios pendientes en una sola operaci n. Esto es mu$ importante cuando se est% trabajando con una base de datos situada en un servidor con un acceso lento (cone6i n v.a )nternet# por ejemplo) Los valores de la propiedad Lock<$pe pueden ser0 Ad&ocE"eadOnl! )ng. *. +aredes ,. :/ +redeterminado. 3 lo lectura\no puede modificar los datos &isual Basic -u.a del Estudiante +%gina

Ad&ocE essi-istic

Blo"ueo pesimista# registro a registro0 el proveedor !ace lo necesario para asegurar la modificaci n correcta de los registros# generalmente blo"ueando registros en el origen de datos durante todo el proceso de modificaci n. Este valor solamente es v%lido si el cursor (+ropiedad ,ursorLocation) esta establecido a lado servidor. Ad&ocEO'ti-istic Blo"ueo optimista# registro a registro0 el proveedor usa blo"ueo optimista# blo"ueando registros s lo cuando llama al mtodo Opdate. Ad&ocEBatcGO'ti-istic Actuali(aciones optimistas por lotes0 re"uerido para el modo de actuali(aci n por lotes como contraposici n al modo de actuali(aci n inmediata. ro'iedad Edit0ode )ndica el estado de modificaci n del registro actual. Es solamente de lectura. Devuelve uno de las siguientes constantes0 AdEdit$one AdEditIn ro)ress AdEditAdd AdEditDelete )ndica "ue no !a$ ninguna operaci n de modificaci n en ejecuci n. )ndica "ue los datos del registro actual se !an modificado pero "ue no se !an guardado. )ndica "ue se !a invocado el mtodo Add4eC $ "ue el registro situado actualmente en el b5fer de copia es un nuevo registro "ue no se !a guardado en la base de datos. )ndica "ue el registro actual se !a eliminado.

ro'iedad Filter Esta propiedad solamente la tienen los recordset ADO. > es "ue ADO presupone "ue est% obteniendo datos de una base de datos alojada en un servidor $ "ue la comunicaci n entre servidor $ cliente puede ser especialmente lenta. 1ediante 8ilter puede descartar registros "ue no cumplan una determinada condici n. En realidad lo "ue !acemos mediante 8ilter es crear un nuevo =ecordset a partir de otro =ecordset. La propiedad 8ilter se utili(a tambin para actuar sobre determinados registros en varios mtodos del recordset (=es$nc# 3ave# Z) pero no se va a e6plicar en este manual la e6plicaci n de la utili(aci n de esta propiedad en esos mtodos# $a "ue el nivel del programador "ue utili(a esos recursos debe ser elevado. Le reservamos por tanto la posibilidad de conocerlo directamente desde la a$uda de &isual Basic# "ue en este caso es bastante buena. De momento lo "ue vamos a !acer con 8ilter es crear un nuevo recordset D+or "u no creamos directamente el nuevo recordset utili(ando una sentencia 3?L "ue lleve impl.cito ese filtroE +ersonalmente no me gusta utili(ar la propiedad 8ilter# $ prefiero crear un nuevo recordset. ,reo "ue solamente lo !e usado para rellenar un 1378le6-rid con parte de los datos del recordset "ue uso en una parte de la aplicaci n. &eamos un ejemplo0 (1i,one6ion es una cone6i n $a creada) Dim =s)nicial As ADODB.=ecordset Dim =s8iltrado As ADODB.=ecordset 3et =s)nicial B 4eC ADODB.=ecordset 3et =s8iltrado B 4eC ADODB.=ecordset =s)nicial.Open RAutoresR# 1i,one6ion# adOpenD$namic# adLockOptimistic WEste es el recordset "ue uso para muc!as cosas dentro de la aplicaci n. A!ora "uiero presentar en un 1378le6-rid solamente los datos de los autores de nacionalidad espaJola. 8iltro el recordset anterior utili(ando un criterio de igualdad de un campo0 4acionalidad =s8iltrado B =s)nicial.8ilter (K4acionalidad B WEspaJolaXM) WA!ora $a podemos aplicar este recordset al 1378le6-rid0 )ng. *. +aredes ,. :: &isual Basic -u.a del Estudiante +%gina

3et 1378le6-/.=ecordset B =s8iltrado W> cuando "ueremos presentar todos los autores# basta con poner la l.nea0 3et 1378le6-/.=ecordset B =s)nicial Este es el 5nico ejemplo "ue puedo sacar de todas mis aplicaciones. 3eguro "ue el alumno va a ver m%s aplicaciones de esta propiedad. La propiedad Filter puede mostrar tambin a"uellos registros "ue !an sido manipulados recientemente# mediante las constantes siguientes0 AdFilter$one AdFilter endin)"ecords ?uita el filtro actual $ vuelve a poner todos los registros a la vista. +ermite ver s lo los registros "ue !an cambiado# pero "ue no !an sido enviados a5n al servidor. Aplicable s lo para el modo de actuali(aci n por lotes. +ermite ver s lo los registros afectados por la 5ltima llamada Delete# =es$nc# OpdateBatc! o ,ancelBatc! +ermite ver los registros de la cac! actual# es decir# los resultados de la 5ltima llamada para recuperar registros de la base de datos +ermite ver los registros "ue fallaron en el 5ltimo intento de actuali(aci n por lotes.

AdFilterA##ected"ecords a AdFilterFetcGed"ecords AdFilterCon#lictin)"ecords

ro'iedad Inde? )ndica el nombre del .ndice "ue se utili(a actualmente en el =ecordset. Es un 3tring con el nombre del .ndice. El .ndice se utili(a para moverse a lo largo del recordset mediante el mtodo 1ove. El .ndice $a debe estar creado en la tabla de la base de datos. Al utili(ar un .ndice# el orden de los registros se cambia al orden establecido en ese .ndice. +or lo tanto# los valores obtenidos anteriormente por la propiedad Absolute+osition cambiar%n completamente. 4o todos los proveedores de datos aceptan la propiedad )nde6. +uede comprobarlo mediante el mtodo 3upports. ro'iedad 0arsGalO'tions Esta propiedad se usa cuando estamos trabajando con cursores lado cliente . En este caso# como vimos m%s atr%s# los registros del recordset est%n en el e"uipo cliente. <odas las operaciones reali(adas sobre el recordset se reali(an en el cliente# por lo tanto llegar% el momento en "ue !abr% "ue actuali(ar en el servidor los datos "ue !a$amos modificado en el recordset "ue est% en el e"uipo cliente. 1ediante esta propiedad podemos !acer "ue se env.en al servidor todos los registros (filas) o solamente los "ue !an cambiado. Acepta estas dos constantes0 Ad0arsGalAll Ad0arsGal0odi#iedOnl! +redeterminada. )ndica "ue todos los registros se devuelven al servidor. )ndica "ue s lo los registros modificados se devuelven al servidor.

Esta propiedad puede mejorar el rendimiento de la aplicaci n para a"uellos casos en los "ue se use un canal de comunicaci n lento.

)ng. *. +aredes ,. :A

&isual Basic -u.a del Estudiante

+%gina

ro'iedad a)e(iIe )ndica cu%ntos registros constitu$en una p%gina del objeto =ecordset. Es de lectura $ escritura. Devuelve un Long $ su valor predeterminado es /G. Esta propiedad 'er-ite determinar cu%ntos registros componen una p%gina l gica de datos. Al establecer un tamaJo de p%gina# puede utili(ar la propiedad A8solute a)e $ se mover% al primer registro de una p%gina espec.fica. Esto es 5til en las situaciones de servidor Veb cuando se desea permitir "ue el usuario pase p%ginas de datos $ vea cierto n5mero de registros al mismo tiempo. Esta propiedad se puede establecer en cual"uier momento $ su valor se utili(ar% para calcular la ubicaci n del primer registro de una p%gina espec.fica. ro'iedad a)eCount )ndica cu%ntas p%ginas de datos contiene el objeto =ecordset. Es solamente de lectura. Devuelve un Long. 3i el objeto "ecordset no admite esta propiedad# el valor ser% N/ para indicar "ue no se puede determinar el valor de a)eCount . ro'iedad A8solute a)e Especifica en "u p%gina reside el registro actual. Es de lectura $ escritura. Devuelve un Long o una de las siguientes constantes0 Ad os+nEno,n Ad osBOF Ad osEOF El objeto "ecordset est% vac.o# la posici n actual se desconoce o el proveedor no admite la propiedad A8solute a)e. El puntero del registro actual est% al comien(o del arc!ivo (es decir# la propiedad BOF tiene el valor True). El puntero del registro actual est% al final del arc!ivo (es decir# la propiedad EOF tiene el valor True).

ro'iedad "ecordCount )ndica el n5mero actual de registros de un objeto =ecordset. Devuelve un Long Es posible "ue esta propiedad no la permita el proveedor de datos# o "ue no pueda llegar a averiguarse# $a "ue dependiendo del tipo de cursor utili(ado puede "ue no suministre ese dato. ro'iedad (ource Devuelve la tabla# consulta o sentencia 3?L utili(ado en el mtodo Open para crear el recordset. Es un 3tring. ro'iedad (tate )ndica el estado (abierto# cerrado# proceso de ejecuci n) en el "ue se encuentra el recordset. Devuelve uno de los siguientes valores0 Descri'ci@n &alor predeterminado. )ndica "ue el objeto est% ad(tateClosed cerrado. ad(tateO'en )ndica "ue el objeto est% abierto. )ndica "ue el objeto "ecordset se est% ad(tateConnectin) conectando. )ndica "ue el objeto "ecordset est% ejecutando ad(tateE?ecutin) un comando. )ndica "ue se est% obteniendo el conjunto de filas ad(tateFetcGin) del objeto "ecordset. +uede tener una combinaci n de valores. +or ejemplo# si se est% ejecutando una instrucci n# esta propiedad tendr% un valor combinado de ad(tateO'en $ ad(tateE?ecutin) . Constante

)ng. *. +aredes ,. :I

&isual Basic -u.a del Estudiante

+%gina

ro'iedad (tatus Esta propiedad se refiere al registro actual. )ndica el estado de este registro respecto a las operaciones de actuali(aci n por lotes u otras operaciones masivas. 4o es una propiedad "ue se use todos los d.as. &ea la a$uda para mas detalles.

ro'iedades dinK-icas del o8Aeto recordset


Las propiedades anteriores se refieren a propiedades del recordset "ue se refieren a unas caracter.sticas propias del recordset una ve( creado. 3on estas0 +ni>ue Ta8leJ +ni>ue (cGe-a ! +ni>ue Catalo) +ni>ue Ta8le especifica la tabla sobre la "ue se permite reali(ar modificaciones de datos ()nsertar o actuali(ar)# en el caso de "ue el recordset se !a$a creado mediante una operaci n *O)4 +ni>ue (cGe-a indica el nombre del propietario de la tabla +ni>ue Catalo) indica el nombre de la base de datos a la "ue pertenece la tabla. Estas dos 5ltimas propiedades deben tener un valor para poder poner valor a la propiedad +ni>ue Ta8le. Estas propiedades son tipo 3tring Estas propiedades din%micas se ane6an a la colecci n ro'erties del objeto "ecordset al asignar el valor ad+seClient a la propiedad ,ursor Location.

0Ctodos del o8Aeto "ecordset de ADO


0ETODO (u''orts Este mtodo es mu$ 5til para ver si un recordset acepta una determinada funcionalidad. Devuelve un Booleano $ es solamente de lectura. De esta forma puede consultar si un recordset admite el mtodo 1ove8irst# la propiedad Absolute+osition# Bookmark# etc.# antes de invocar ese mtodo o leer esa propiedad# $ evitar de esta forma un error en la ejecuci n. Esto es mu$ 5til !abida cuenta "ue no todos los proveedores funcionan de la misma forma. Es por lo tanto mu$ prudente consultar si el =ecordset soporta una funcionalidad antes de ped.rsela. Estas funcionalidades se le pasan como par%metro mediante una de las siguientes constantes0 AdAdd$e, AdA''ro? osition AdBooE-arE AdDelete AdMold"ecords Ad0o*e re*ious Ad"es!nc Ad+'date Ad+'dateBatcG AdInde? Ad(eeE +uede usar el mtodo Add4eC para agregar nuevos registros. +uede leer $ establecer las propiedades Absolute+osition $ Absolute+age. +uede usar la propiedad Bookmark para tener acceso a registros espec.ficos +uede usar el mtodo Delete para eliminar registros. +uede recuperar m%s registros o cambiar la posici n de recuperaci n siguiente sin efectuar todos los cambios pendientes. +uede usar los mtodos 1ove8irst $ 1ove+revious# $ los mtodos 1ove o -et=oCs para despla(ar !acia atr%s la posici n del registro actual sin "ue se re"uiera marcadores. +uede usar el mtodo =es$nc para actuali(ar el cursor con los datos visibles en la base de datos sub$acente. +uede usar el mtodo Opdate para modificar datos e6istentes. +uede usar actuali(aci n por lotes (mtodos OpdateBatc! $ ,ancelBatc!) para transmitir grupos de cambios al proveedor. +uede utili(ar la propiedad )nde6 para dar nombre a un .ndice. +uede utili(ar el mtodo 3eek para encontrar una fila en un =ecordset.

En este eAe-'lo *e-os la sinta?is de (u''orts% )f =s3eg.3upports(adAppro6+osition) B <rue <!en )ng. *. +aredes ,. :P &isual Basic -u.a del Estudiante +%gina

1sgBo6 R3)R Else 1sgBo6 R4OR End )f Nota Aunque el mtodo S#pports puede de%ol%er Tr#e para una funcionalidad determinada, eso no garantiza que el pro%eedor pueda )acer que la caracter#stica est disponible ba.o cualquier circunstancia. $l mtodo S#pports de%uel%e simplemente si el pro%eedor puede admitir la funcionalidad especificada, dando por supuesto que se renen determinadas condiciones. *or e.emplo, el mtodo S#pports puede indicar que un ob.eto Recordset admite actualizaciones aunque el cursor se base en una uni3n de mltiples tablas, de las que algunas columnas no son actualizables. El valor devuelto por el mtodo 3upports depender% del tipo de recordset elegido. En la siguiente tabla puede ver el tipo de recordset $ las constantes para las "ue va a devolver <rue0 AdO'enFor,ardOnl! AdO'enLe!set AdO'enD!na-ic AdO'en(tatic 4inguna adBookmark# ad7old=ecords# ad1ove+revious# ad=es$nc Ad1ove+revious adBookmark# ad7old=ecords# ad1ove+revious# ad=es$nc

0Ctodo O'en
Es el mtodo "ue A%RE el recordset. Este mtodo es el "ue busca los registros "ue !an de rellenar el recordset. 3inta6is. Esta es la sinta6is general0 Mi-ecordset1O'en So#rceJ ActiveConnection J C#rsorT$peJ &oc'T$peJ Options ,n recordset puede abrirse partiendo de una cone2i3n a abierta. *ero tambin puede crearse directamente, sin abrir pre%iamente la cone2i3n. Al final, deber aportar todos los datos necesarios para determinar en que base de datos se abre ese recordset. +obre que tabla, consulta o sentencia +Q!., que tipo de cursor %a a ser, etc. !o que ocurre es que ADO es mu fle2ible nos permite )acerlo de %arias formas, aunque todas ellas conducen a lo mismo. So#rce /Opcional1 Es el nombre de una tabla# consulta o sentencia 3?L de la cual se obtienen los registros del =ecordset. ActiveConnection /Opcional1" Es el nombre de un objeto ,onnection abierto o una cadena de cone6i n v%lida. Esta cadena es la misma "ue la "ue emplear.amos para abrir el objeto ,onnection. C#rsorT$pe /Opcional1. On valor "ue determina el tipo de cursor "ue el proveedor debe usar al abrir el "ecordset. +uede ser una de las siguientes constantes AdO'enFor,ardOnl! (+redeterminado) Abre un cursor de tipo s lo avance. AdO'enLe!set Abre un cursor de tipo conjunto de claves. AdO'enD!na-ic Abre un cursor de tipo din%mico. ()gual "ue el D$naset de DAO) AdO'en(tatic Abre un cursor de tipo est%tico. &oc'T$pe /Opcional1. On valor "ue determina el tipo de blo"ueo "ue debe usar el proveedor al abrir el "ecordset. ,on este par%metro se le indica tambin si debe !acer las actuali(aciones registro a registro o en blo"ue. +uede ser una de las siguientes constantes Ad&ocE"eadOnl! Ad&ocE essi-istic (+redeterminado) 3 lo lectura. 4o puede modificar los datos. Blo"ueo pesimista# registro a registro. El proveedor !ace lo necesario para asegurar una modificaci n correcta de los

)ng. *. +aredes ,. :L

&isual Basic -u.a del Estudiante

+%gina

registros# normalmente blo"ueando registros en el origen de datos inmediatamente antes de la modificaci n. Ad&ocEO'ti-istic Blo"ueo optimista# registro a registro. El proveedor usa blo"ueooptimista# blo"ueando registros s lo cuando se llama al mtodo Opdate. Ad&ocEBatcGO'ti-istic Actuali(aciones optimistas por lotes. =e"ueridas en el modo de actuali(aci n por lotes en oposici n al modo de actuali(aci n inmediata. (Actuali(aci n en blo"ue) Options /Opcional1. ,onstante "ue determina como va a evaluar el proveedor de datos el argumento So#rce. +uede ser una de las siguientes constantes de esta lista. AdC-dTe?t )ndica "ue el proveedor debe evaluar So#rce como una definici n te6tual de un comando. AdC-dTa8le )ndica "ue ADO debe generar una consulta 3?L para devolver todaslas filas de la tabla nombrada en So#rce. AdC-dTa8leDirect )ndica "ue el proveedor debe devolver todas las filas de la tabla nombrada en So#rce. AdC-d(tored roc )ndica "ue el proveedor debe evaluar So#rce como un procedimiento almacenado AdC-d+nEno,n )ndica "ue el tipo de comando del argumento So#rce es desconocido. AdC-dFile )ndica "ue el "ecordset guardado se debe restaurar desde el arc!ivo nombrado en So#rce. AdAs!ncE?ecute )ndica "ue So#rce se debe ejecutar de forma as.ncrona. AdAs!ncFetcG )ndica "ue# tras alcan(ar la cantidad inicial especificada en la propiedad Initial FetcG (iIe# las filas restantes deben buscarse de forma as.ncrona. 3i se re"uiere una fila "ue no se !a encontrado# se blo"uear% el subproceso principal !asta "ue se disponga de la fila solicitada. AdAs!ncFetcG$onBlocEin) )ndica "ue el subproceso principal nunca se blo"uea durante la b5s"ueda. 3i no se encuentra la fila solicitada# la fila actual se despla(a autom%ticamente al final del arc!ivo. 9abr obser%ado que )emos remarcado que el mtodo Open A<-$ un recordset. No lo crea. $l recordset debe estar creado pre%iamente. CQu cuando se creaD Mediante la instrucci3n' +et Mi-ecordset ? Ne; ADOD<.-ecordset

0etodo "e>uer!
Actuali(a los datos de un objeto =ecordset volviendo a ejecutar la consulta utili(ada para abrirlo. 3e obtiene el mismo resultado "ue si se cerrara el recordset $ se volviera a abrir. 3inta6is 1i=ecordset."e>uer! Opciones

Optiones Opcional. 1%scara de bits "ue indica opciones "ue afectan a esta operaci n. 3i el valor de este par%metro est% establecido a adAs!ncE?ecute# esta operaci n se ejecutar% de forma as.ncrona $ se emitir% un evento =ecordset,!ange,omplete cuando conclu$a.

0Ctodo "es!nc
Actuali(a los datos del objeto =ecordset actual. Este mtodo# a diferencia del mtodo =e"uer$# no vuelve a ejecutar el comando de creaci n del recordset# sino "ue lee los registros e6istentes en el recordset para actuali(ar su valor# pero no presenta a"uellos registros "ue !ubieran sido creados con posterioridad a la apertura del recordset. Es m%s r%pido "ue el mtodo =e"uer$# $ en muc!os casos solamente nos interesa actuali(ar los registros sobre los "ue estamos trabajando. (inta?is 1i=ecordset."es!nc Affect=ecords# =es$nc&alues

)ng. *. +aredes ,. :9

&isual Basic -u.a del Estudiante

+%gina

Los par%metros AffectRecords $ Res$nc(al#es determinan "ue registros se van a volver a leer $ sobreescribir. &ea la a$uda para mas detalles.

0ETODO Add$e,
,rea un nuevo registro en un objeto =ecordset actuali(able. 3inta6is NombreDel-ecordset"Add$e, Field&istJ (al#es

Los par%metros Field&ist $ (al#es son opcionales. En caso de ponerlos# 8ieldList ser%n los nombres de los campos a los "ue se les va a poner un valor# $ &alues son los valores de cada uno de estos campos. El orden nombre N valor debe mantenerse estrictamente. 3iempre recomendar "ue# en ve( de meter los datos mediante estos par%metros# se metan posteriormente linera a l.nea# tal como se !i(o siempre con los recordsets 4ombreDel=ecordsetY4ombredel,ampo B &alorDel,ampo 4ombreDel=ecordset(K4ombredel,ampoM) B &alorDel,ampo Esta segunda forma es necesaria cuando el nombre del campo tiene espacios. 4unca es recomendable poner espacios en los nombres de campos# pero en caso de "ue e6istan# debe optar por utili(ar la sinta6is segunda# con los parntesis $ comillas dobles. 4o siempre se puede utili(ar el mtodo Add4eC. +uede comprobar si se puede utili(ar# usando el mtodo (u''orts visto anteriormente. El mtodo Add4eC convierte a este registro recin creado en registro actual. +ero este registro solamente e6iste en el recordset. +ara introducir los datos en la base de datos# (> por lo tanto en el disco duro) es necesario invocar el mtodo +'date una ve( introducidos todos los valores de los campos "ue deseamos introducir. ,on alg5n tipo de cursor es necesario tambin utili(ar el mtodo "e>uer! para poder acceder al registro recin creado. 3i se invoca el mtodo Add$e, mientras se est% editando el registro actual# o durante otra operaci n Add$e,# ADO invoca autom%ticamente el mtodo +'date para guardar los cambios. &ea m%s adelante los mtodos +'date $ +'dateBatcG.

0Ctodo +'date
-uarda los cambios reali(ados en el registro actual de un objeto =ecordset. 3e utili(a tanto para KrematarM una operaci n de creaci n de un registro iniciada con Add4eC# como para guardar los nuevos datos del registro actual (=ecuerde "ue en ADO no e6iste el mtodo Edit# tal como ocurr.a en DAO) . 3inta6is NombreDel-ecordset1+'date FieldsJ (al#es En esta sinta6is# 8ields $ &alues son opcionales# $ solamente tienen aplicaci n cuando se trata de cambiar los valores del registro actual# no de terminar una operaci n de creaci n de un nuevo registro mediante Add4eC. &uelvo a recomendar lo anterior. +ara cambiar los valores de varios campos de un registro# nos colocaremos sobre ese registro# $ sin invocar ning5n mtodo# ejecutaremos este c digo 1i=ecordsetY,ampo/ B &alor/ 1i=ecordsetY,ampo: B &alor: ZZZ. 1i=ecordsetY,ampo4 B &alor4 1i=ecordset.+'date

)ng. *. +aredes ,. :F

&isual Basic -u.a del Estudiante

+%gina

+ero en ADO pasa una cosa "ue no pasaba en DAO. 3i cambiamos de registro una ve( modificado el valor de un registro# ADO invoca autom%ticamente el mtodo +'date. +or lo tanto# el c digo siguiente0 1i=ecordsetY,ampo/ B &alor/ 1i=ecordsetY,ampo: B &alor: ZZZ. 1i=ecordsetY,ampo4 B &alor4 <endr% el mismo resultado "ue el anterior cuando cambiemos de registro actual. Esto puede ser bueno a malo# pero personalmente pienso "ue no es pr%ctico por"ue implica tener muc!o m%s cuidado "ue en DAO. 7ace lo mismo "ue cuando tenemos unos controles enla(ados a datos mediante un control Data. 3i una ve( "ue ejecutamos una l.nea tal como esta 1i=ecordsetY,ampo/ B &alor/ ?ueremos "ue ese nuevo valor no entre en la base de datos# debemos cancelarlo mediante el mtodo Cancel+'date.

0Ctodo +'dateBatcG
Escribe en disco todas las actuali(aciones pendientes de proceso por lotes. En ADO un recordset puede actuali(arse registro a registro o por lotes. <odo depender% de c mo se !a abierto (3i el valor &oc'T$pe se !a puesto a Ad&ocEBatcGO'ti-istic) (inta?is 1i=ecordset1+'dateBatcG Affect-ecords

AffectRecords ,onstante "ue determina a cu%ntos registros afectar% el mtodo +'dateBatcG. +uede tomar uno de los siguientes valores. AdA##ectCurrent AdA##ectGrou' AdA##ectAll Escribe solamente los cambios pendientes en el registro actual. Escribe los cambios pendientes "ue cumplen el valor de la propiedad 8ilter. (+redeterminado) Escribe los cambios pendientes en todos los registros del objeto "ecordset.

0Ctodo Cancel
,ancela la ejecuci n del mtodo O'en. (inta?is NombreDel-ecordset1Cancel

El mtodo ,ancel solamente puede usarse si el mtodo Open fue invocado con la opci n adAs!ncConnect# adAs!ncE?ecute o adAs!ncFetcG.

0Ctodo Delete
Elimina el registro actual o un grupo de registros. +or defecto elimina solamente el registro actual. &ea la a$uda para ampliar los detalles respecto al par%metro opcional AffectRecords (inta?is 1i=ecordset.Delete Affect-ecords

0Ctodo Cancel+'date
7ab.amos visto m%s atr%s "ue el ADO no e6iste el mtodo Edit. +ara modificar un registro basta con poner una instrucci n tal como esta0

)ng. *. +aredes ,. :H

&isual Basic -u.a del Estudiante

+%gina

1i=ecordsetY1i,ampo B 1i4uevo&alor > a continuaci n rematar la operaci n mediante el mtodo Opdate 1i=ecordset.Opdate 3i por cual"uier circunstancia se !a ejecutado la primera instrucci n# $ luego "ueremos volvernos atr%s# antes de ejecutar el mtodo Opdate debemos des!acer el cambio con el mtodo ,ancelOpdate# con lo "ue el registro afectado recuperar% nuevamente su valor original. 3inta6is 1i=ecordset.Cancel+'date

-ecuerde que ADO funciona de forma distinta a DAO con estos mtodos de modificaci3n de los registros. -ecuerde que si est en proceso de modificaci3n de un registro /9a e.ecutado la primera l#nea del e.emplo anterior1 cambia de registro, por el )ec)o de cambiar de registro, ADO in%oca automticamente el mtodo ,pdate.

0Ctodo CancelBatcG
,ancela una actuali(aci n por lotes pendiente. Es similar a la anterior# pero para actuali(aci n por lotes. 3inta6is 1i=ecordset.CancelBatcG Affect-ecords

0Ctodo Clone
,rea un objeto =ecordset duplicado a partir de un objeto "ecordset e6istente. Opcionalmente# puede especificarse "ue el nuevo recordset sea solamente de lectura (inta?is (et rstDuplicate B rstOriginal.Clone (!ocE= pe)

(El objeto rstDuplicate debe estar declarado previamente como objeto ADODB.=ecordset) Lock<$pe puede tomar uno de los siguientes valores0 Ad&ocE+ns'eci#ied Ad&ocE"eadOnl! (+redeterminado) El recordset resultante tendr% el mismo tipo de blo"ueo "ue el original. El recordset creado es solamente de lectura.

El recordset resultante del mtodo ,lone# aun"ue igual al original en el momento de su creaci n# es completamente independiente de este a partir de ese momento# por lo "ue las actuali(aciones efectuadas en el original no afectan al clonado.

0Ctodo 0o*e
1ueve la posici n del registro actual de un objeto =ecordset . 3inta6is 1i=recordset10o*e Num-ecords# +tart N#mRecords ,n %alor Long con signo "ue especifica el n5mero de registros "ue debe moverse a partir de la posici n del registro actual o del registro especificado en el par%metro Start# si es "ue se especifica. Start Opcional. On (trin) o Variant cu$o resultado sea un marcador del tipo Bookmark. +uede utili(ar tambin una de las siguientes constantes0 AdBooE-arECurrent (+redeterminado) ,uenta a partir del registro actual AdBooE-arEFirst ,uenta a partir del primer registro )ng. *. +aredes ,. AG &isual Basic -u.a del Estudiante +%gina

AdBooE-arE&ast

,uenta a partir del 5ltimo registro

0Ctodos 0o*eFirstJ 0o*e&astJ 0o*e$e?t ! 0o*e re*ious


+asa al primer# 5ltimo# siguiente o anterior registro de un objeto =ecordset especificado $ lo convierte en el registro actual. 8unciona igual "ue en DAO <enga en cuenta a la !ora de usar los mtodos 1ove "ue pueden e6istir =ecordsets "ue no permiten el movimiento !acia atr%s.

0Ctodo Find
Busca el primer registro del recordset "ue satisfaga los criterios especificados en el criterio de b5s"ueda. 3i se cumple el criterio de b5s"ueda# la posici n del recordset se establece en el primer registro encontrado' si no# la posici n se establece al final del recordset. (inta?is 1i=ecordset.Find /criterio, +Eip-o;s, searc)Direction, start1

criterio Es el criterio de b5s"ueda. +or ejemplo K+ais B EspaJaM siendo +ais el nombre del campo en el cual buscamos el valor EspaJa S'ipRo s )Opciopnal* Es un Long# cu$o valor predeterminado es cero# "ue especifica el n5mero de registros a partir del registro actual donde debe empe(ar la b5s"ueda. searc+Direction )Opcional* On valor "ue especifica si la b5s"ueda se reali(a en direcci n al final del recordset (ad(earcGFor,ard ) o en direcci n !acia el principio del recordset (ad(earcGBacE,ard). La b5s"ueda termina al final o al principio del recordset# dependiendo del valor de searc+Direction . start la b5s"ueda. )Opcional* On marcador tipo Book1ark "ue se utili(a como posici n inicial de

El operador de comparaci3n de criterio puede ser RNR# ROR# RBR# R]BR # R^BR# R^]R (distinto de) o RliEeR (coincidencia parcial de cadenas). El valor de comparaci n puede ser una cadena# un n5mero en coma flotante o una fec!a. Los valores de cadena est%n delimitados con comillas sencillas (por ejemplo# R+ais B QEspaJaQR). Los valores de fec!a est%n delimitados con signos RPR $ con formato mm2dd2$$ (por ejemplo# R #ecGa=inicial N PQRSSRTQPR). 3i el operador de comparaci3n es RliEeR# el %alor de la cadena puede contener los caracteres comod.n R UR o R=R. (8uncionan de forma idntica# sustitu$endo a cual"uier sucesi n de caracteres.) 4o acepta el car%cter KEM (+or ejemplo# R+ais like WEsTXR o K+ais Like WEs;X encuentra EspaJa $ Estonia)

ADO no tiene los mtodos FindFirst, FindNe2t, Find*re%ious Find!ast. Deber emplear el mtodo Find de forma inteligente para implementar estos otros.

0Ctodo (a*e
Este mtodo permite guardar el contenido de un "ecordset en un fic!ero. +uede ser mu$ 5til cuando "ueremos e6portar ese recordset !acia otra aplicaci n. (inta?is 1i=ecordset1(a*e FileName, *ersistFormat

FileName es la ruta completa del fic!ero en el "ue se guardar% el "ecordset. PersistFormat /Opcional). On valor "ue especifica el formato en "ue se guardar% el =ecordset. +uede ser una de las constantes siguientes. Ad ersistADTG (&alor predeterminado) 3e guarda en un formato propietario (Advanced Data <ablegram). 4o es inteligible a simple vista# pero genera fic!eros bastante cortos.

)ng. *. +aredes ,. A/

&isual Basic -u.a del Estudiante

+%gina

3e guarda en formato @1L. Es un formato puramente en donde pueden verse los nombres de los campos $ su contenido. Este formato genera fic!eros m%s grandes "ue el AD< 3i el recordset tienen aplicado un filtro (1ediante la propiedad 8ilter) solamente guarda los registros "ue deja ver ese filtro. A3,)) 3i $a e6iste el fic!ero le dar% un error. ,erci rese "ue no e6iste (1ediante la funci n Dir) $ b rrelo antes de volver a utili(ar el mtodo 3ave.

AAd ersistX0&

0Ctodo (eeE
Este mtodo busca un registro despla(%ndose por el recordset a lo largo de un .ndice o un conjunto de .ndices. La b5s"ueda mediante 3eek es muc!o m%s r%pida "ue con 8ind# $a "ue la reali(a siguiendo el ordenamiento de los registros seg5n un .ndice. +ara poder usar el mtodo )nde6 es necesario "ue el proveedor acepte .ndices en el objeto recordset. Esto !a llevado al autor a no poder presentar ning5n ejemplo de este mtodo# $a "ue todas las bases de datos ensa$adas no permit.an .ndices. +uede ver si acepta .ndices mediante el mtodo 3upports0 )f 1i=ecordset/.3upports(ad)nde6) B <rue <!en &ea la a$uda de &B para ma$or informaci n

0Ctodo $e?t"ecordset
+ara entender este mtodo es necesario e6plicar previamente como se puede crear un recordset compuesto. On recordset compuesto es un recordset "ue se crea concatenando sentencias 3ELE,<# $ cada una de ellas crear%# dentro del mismo =ecordset# un recordset particular. Al crear el recordset# el recordset particular "ue va a estar activo es el correspondiente a la primera sentencia 3ELE,<. 1ediante el mtodo $e?t"ecordset podemos ir avan(ando a travs de los siguientes recordsets particulares. El car%cter de separaci n entre las sentencias 3ELE,< es el punto $ coma ( ' ) 1i=ecordset/.Open R3elect ; 8rom =egimenes' 3elect ; 8rom =egimenT3eguimiento V!ere =sTOrigen B QL3BQR# 1i,one6ionADO# adOpenD$namic# adLockOptimistic (La instrucci n anterior debe leerse como una sola l.nea) 1i=ecordset es un recordset compuesto. <oma datos de dos tablas distintas# pero podr.a !aberlo !ec!o solamente de una tabla con una condici n distinta en la 3ELE,<. ,uando se ejecuta esa l.nea# el recordset actual es el correspondiente a la primera selecci n. (3elect ; 8rom =egimenes). Ejecutando el mtodo 4e6t=ecordset ese recordset primero se borra $ pasa a ser recordset actual el creado con la selecci n segunda (3elect ; 8rom =egimenT3eguimiento V!ere =sTOrigen B QL3BQR) 3et 1i=ecordset/ B 1i=ecordset/.4e6t=ecordset +uede usar tambin este recordset para crear un nuevo recordset a partir del primero 3et 1i=ecordset: B 1i=ecordset/.4e6t=ecordset 1i=ecordset: debe estar declarado como objeto recordset# $ creado con la instrucci n 4eC0 3et 1i=ecordset: B 4eC ADOBD.=ecodset )ng. *. +aredes ,. A: &isual Basic -u.a del Estudiante +%gina

&a colecci@n Fields de un recordset ADO


,ontiene todos los objetos Field de un objeto "ecordset.

On objeto "ecordset tiene una colecci n Fields "ue contiene todos los objetos Field . ,ada objeto Field se corresponde a una columna del "ecordset. &amos a ver a"u. un truco "ue nos permite ADO. +odemos crear un recordset _3in necesidad de una base de datosY ,uando estudiamos el objeto recordset vimos "ue el recordset se crea con una instrucci n como esta0 3et 1i=ecordset/ B 4eC ADODB.=ecordset A!ora $a podemos abrir el recordset le$endo los datos desde una base de datos. Otili(amos para ello el mtodo Open del recordset0
1i=ecordset/.O'en R3elect ; 8rom =egimenesR# 1i,one6ionADO# adOpenD$namic# adLockOptimistic

1ediante el mtodo Open lo "ue !ace el recordset es conocer su estructura (?ue campos tiene# propiedades de estos campos# etc) $ el valor de cada uno de los campos de sus registros. D?u pasar.a si en ve( de abrir el recordset le vamos aJadiendo objetos 8ield a su colecci n 8ieldsE Lo !acemos mediante el mtodo Append0 1i=ecordset/.8ields.Append R1i,ampo/R# adBig)nt 1i=ecordset/.8ields.Append R1i,ampo:R# ad,!ar# :P 1i=ecordset/.8ields.Append R1i,ampoAR# adB3<= Lo "ue ocurre es "ue el recordset $a tiene tres campos# el primero de nombre 1i,ampo/# numrico Long# el segundo# un string de :P caracteres de nombre 1i,ampo:# $ el tercero# de nombre 1i,ampoA# una cadena de caracteres de longitud indefinida# terminada en un car%cter nulo. >a tenemos una estructura de un recordset sin necesidad de !aber le.do la base de datos. 4o es necesario por lo tanto "ue e6ista una tabla o consulta almacenada con esa estructura. A!ora podemos abrir el recordset0 1i=ecordset/.Open Lo abrimos sin pasarle ning5n par%metro. A!ora $a est% abierto $ podemos trabajar con el como con un recordset cual"uiera. =ecuerde "ue al principio est% vac.o. 1i=ecordset/.Add4eC 1i=ecordset/Y1i,ampo/ B AI 1i=ecordset/Y1i,ampo: B R-u.a del EstudianteR 1i=ecordset/Y1i,ampoA B R7ola mi amorR U vb,rLf U R>o so$ tu loboR 1i=ecordset/.Opdate >a tenemos un registro dentro del recordset. +odemos introducirle tantos registros como "ueramos# $ luego movernos por el recordset mediante los mtodos 1ove6666. A!ora podremos leer el contenido del registro actual0 Label/ B 1i=ecordset/Y1i,ampo/ Label: B 1i=ecordset/Y1i,ampo: LabelA B 1i=ecordset/Y1i,ampoA )ng. *. +aredes ,. AA &isual Basic -u.a del Estudiante +%gina

El resultado del c digo de el ejemplo se traducir% en algo como esto0

> a!ora vienen lo mejor. D+ara "ue "ueremos un recordset "ue no tienen datos le.dos desde una base de datosE Las aplicaciones de esto solamente est% limitadas por la imaginaci n. +ienso# por ejemplo# en introducir en un recordset todos los datos le.dos de un fic!ero de configuraci n# $ as. tener todos esos datos disponibles durante toda la aplicaci n# en ve( de en variables# como Mi-ecordsetGMiDato> Es una idea# pero piense "ue esto no regala nada. El espacio de memoria consumido ser% similar a si usa variables. +ero posiblemente estar% m%s c modo $ m%s inteligible su c digo. &eamos los mtodos de la colecci n 8ields

0Ctodo A''end
Agrega un campo a una colecci n 8ields de un =ecoprdset. 3inta6is 1i=ecordset.8ields.A''end Name, = pe, Defined+ize, Attrib

Name On 3tring con el nombre del nuevo objeto Field # "ue tiene "ue ser 5nico dentro de la colecc n 8ields. T$pe <ipo de datos "ue va a contener ese campo. +uede tomar uno de estos valores0 3e une en una instrucci n O" l gica con otro tipo para indicar "ue los datos son una matri( segura de ese tipo (DB<>+ETA==A>). On entero con signo de F b$tes (DB<>+ET)F). On valor binario (DB<>+ETB><E3). On valor Boolean (DB<>+ETBOOL). 3e une en una instrucci n O" l gica con otro tipo para indicar "ue los datos son un puntero a los datos del otro tipo (DB<>+ETB>=E8). Ona cadena de caracteres terminada en nulo (Onicode) (DB<>+ETB3<=). On valor de tipo (trin) (DB<>+ET3<=). On valor de tipo Currenc! (DB<>+ET,>). On valor Currenc! es un n5mero de coma fija con cuatro d.gitos a la derec!a del signo decimal. 3e almacena en un entero con signo de F b$tes en escala de /G.GGG. On valor de tipo Date (DB<>+ETDA<E). On valor Date se almacena como un valor de tipo Dou8le' la parte entera es el n5mero de d.as transcurridos desde el AG de diciembre de /FHH $ la parte fraccionaria es la fracci n de un d.a. On valor de fec!a (aaaammdd) (DB<>+ETDBDA<E). On valor de !ora ())mmss) (DB<>+ETDB<)1E). Ona marca de fec!a $ !ora (aaaammdd))mmss m%s una fracci n de miles de millones) (DB<>+ETDB<)1E3<A1+). On valor numrico e6acto con una precisi n $ una escala fijas (DB<>+ETDE,)1AL). On valor de coma flotante de doble precisi n (DB<>+ET=F). 4o se !a especificado ning5n valor (DB<>+ETE1+<>). On c digo de error de A: bits (DB<>+ETE==O=). On identificador 5nico global (-O)D) (DB<>+ET-O)D). On puntero a una interfa( Idis'atcG de un objeto OLE (DB<>+ET)D)3+A<,7). &isual Basic -u.a del Estudiante +%gina

adArra! adBi)Int adBinar! adBoolean adB!"e# adB(T" adCGar adCurrenc!

adDate adDBDate adDBTi-e adDBTi-e(ta-' adDeci-al adDou8le adE-'t! adError adG+ID adIDis'atcG

)ng. *. +aredes ,. AI

adInte)er adI+nEno,n ad&on)VarBinar! ad&on)VarCGar ad&on)VarDCGar ad$u-eric ad(in)le ad(-allInt adTin!Int ad+nsi)nedBi)Int ad+nsi)nedInt ad+nsi)ned(-allInt ad+nsi)nedTin!Int ad+serDe#ined adVarBinar! adVarCGar adVariant adVector adVarDCGar adDCGar

On entero firmado de I b$tes (DB<>+ET)I). On puntero a una interfa( IunEno,n de un objeto OLE (DB<>+ET)O4`4OV4). On valor binario largo (s lo para el objeto ara-eter). On valor largo de tipo (trin) (s lo para el objeto ara-eter). On valor largo de tipo (trin) terminado en nulo (s lo para el objeto ara-eter). On valor numrico e6acto con una precisi n $ una escala e6actas (DB<>+ET4O1E=),). On valor de coma flotante de simple precisi n (DB<>+ET=I). On entero con signo de : b$tes (DB<>+ET):). On entero con signo de / b$te (DB<>+ET)/). On entero sin signo de F b$tes (DB<>+ETO)F). On entero sin signo de I b$tes (DB<>+ETO)I). On entero sin signo de : b$tes (DB<>+ETO):). On entero sin signo de / b$te (DB<>+ETO)/). Ona variable definida por el usuario (DB<>+ETOD<). On valor binario (s lo para el objeto ara-eter). On valor de tipo (trin) (s lo para el objeto ara-eter). On tipo Variant de automati(aci n (DB<>+ET&A=)A4<). 3e une en una instrucci n O" l gica con otro tipo para indicar "ue los datos son una estructura DB&E,<O=# tal como est% definida por OLE DB# "ue contiene un contador de elementos $ un puntero a los datos del otro tipo (DB<>+ET&E,<O=). Ona cadena de caracteres Onicode terminada en nulo (s lo para el objeto ara-eter). Ona cadena de caracteres Onicode terminada en nulo (DB<>+ETV3<=).

DefinedSi,e para un string) Attrivalores0

On Long "ue define el tamaJo del campo si fuese necesario. (+or ejemplo (Opcional). Especifica los atributos del campo a aJadir. +uede tomar estos )ndica "ue el campo se apla(a# es decir# los valores del campo no se recuperan del origen de datos con todo el registro# sino solamente cuando se tiene acceso e6pl.cito a los mismos. )ndica "ue se puede escribir en el campo. )ndica "ue el proveedor no puede determinar si se puede escribir en el campo. )ndica "ue el campo contiene datos de longitud fija. )ndica "ue el campo acepta valores $ull. )ndica "ue se pueden leer valores $ull del campo. )ndica "ue se trata de un campo binario largo. <ambin indica "ue se pueden utili(ar los mtodos Append,!unk $ -et,!unk. )ndica "ue el campo contiene un identificador de fila persistente en el "ue no se puede escribir $ "ue no tiene ning5n valor significativo e6cepto la identificaci n de la fila (como por ejemplo un n5mero de registro# un identificador 5nico# etc.). )ndica "ue el campo contiene alg5n tipo de marca de !ora o de fec!a "ue se utili(a para efectuar actuali(aciones. )ndica "ue el proveedor almacena los valores del campo en la memoria cac! $ "ue las lecturas siguientes se efect5an en dic!a memoria .

adFld0a!De#er adFld+'data8le adFld+nEno,n+'data8le adFldFi?ed adFldIs$ulla8le adFld0a!Be$ull adFld&on) adFld"o,ID adFld"o,Version adFldCacGeDe#erred

0Ctodo Delete
<e ricamente elimina un objeto de la colecci n Fields. )ng. *. +aredes ,. AP &isual Basic -u.a del Estudiante +%gina

3inta6is

8ields.Delete Field

Field On Variant "ue designa el objeto Field "ue se va a eliminar. Este par%metro tiene "ue ser el nombre del objeto Field ' no puede ser una posici n ordinal o el propio objeto Field . Co-entarios La llamada al mtodo Fields1Delete en un "ecordset abierto provoca un error de ejecuci n. /&omo )a ocurrido en otras ocasiones, al autor le )a sido imposible e.ecutar este mtodo con los resultados esperados1

0Ctodo Ite3inta6is 1i=ecordset.8ields.Ite- ()nde6)

Devuelve el elemento de la colecci n Fields especificado en el .ndice. Devuelve el objeto# por lo tanto# $ sobre ese objeto# podemos obtener las propiedades "ue deseemos. En el ejemplo siguiente# introducimos los nombres de todos los campos en un ,omboBo6 llamado ,ombo,ampos Dim 11 As 3tring# ) As )nteger 8or ) B G <o 1i=ecordset/.8ields.,ount N / 11 B 1i=ecordset/.8ields.)tem()).4ame ,ombo,ampos.Add)tem 11 4e6t )

0Ctodo "e#resG
Aun"ue la colecci n 8ields tiene este mtodo# la verdad es "ue no tienen efectos visibles sobre esa colecci n.

ro'iedades de la colecci@n Fields ro'iedad Count


Devuelve el n5mero de campos de la colecci n Fields. Es un Long.

)ng. *. +aredes ,. AL

&isual Basic -u.a del Estudiante

+%gina

)ng. *. +aredes ,. A9

&isual Basic -u.a del Estudiante

+%gina

El O8Aeto

Co--and

On objeto Co--and es la definici n de un comando espec.fico "ue se piensa ejecutar contra un origen de datos. 1ediante un objeto ,ommand podemos crear un recordset# pero recuerde "ue un recordset lo podemos tambin crear directamente. Otilice un objeto Co--and para consultar una base de datos $ obtener registros en un objeto =ecordset# para aJadir o eliminar registros# ejecutar una operaci n de manejo masivo de datos o para manipular la estructura de una base de datos. ro'iedades del O8Aeto Co--and ro'iedad Acti*eConnection )ndica a "u objeto ,onnection pertenece actualmente el objeto ,ommand. Es un string con el nombre de la cone6i n. ro'iedad Co--andTe?t ,ontiene el te6to del comando "ue se "uiere emitir al proveedor. Es un string. 3uele ser una instrucci n 3?L# un nombre de tabla o un procedimiento almacenado# o cual"uier otra instrucci n "ue recono(ca el proveedor. El valor predeterminado es una cadena vac.a. ro'iedad Co--andTi-eout Especifica el intervalo de espera para "ue se ejecute un comando antes de "ue finalice el intento $ se genere un error. Es un Long "ue indica en segundos ese tiempo. El valor predeterminado es AG. ro'iedad Co--andT!'e ()1+O=<A4<E)

)ndica el tipo de un objeto ,ommand. Esta propiedad se usa para optimi(ar la evaluaci n de la propiedad Co--andTe?t# $a "ue de esta forma el proveedor no tiene "ue perder tiempo e6aminando si es una instrucci n 3?L# un procedimiento almacenado o un nombre de tabla. 3i el valor de esta propiedad es adC-d+nEno,n (valor predeterminado)# estamos for(ando al proveedor a "ue realice esa investigaci n lo "ue provocar% probablemente un descenso en su rendimiento. 3i sabe "u tipo de comando est% usando# el establecimiento de la propiedad Co--andT!'e instru$e a ADO a "ue va$a directamente al c digo relevante. 3i la propiedad Co--andT!'e no coincide con el tipo de comando de la propiedad Co--andTe?t# ocurre un error cuando llama al mtodo E6ecute. &alores posibles AdC-dTe?t un AdC-dTa8le AdC-dTa8leDirect AdC-d(tored roc AdC-d+nEno,n AdC-dFile )ndica "ue es una definici n te6tual de un comando o una llamada a procedimiento almacenado. )ndica "ue es un nombre de tabla cu$as columnas se devuelven todas mediante una consulta 3?L generada internamente. )ndica "ue es un nombre de tabla en la "ue se devuelven todas las columnas. )ndica "ue es un nombre de procedimiento almacenado +redeterminado. El tipo de comando de la propiedad Co--andTe?t es desconocido. Eval5a Co--andTe?t como el nombre de arc!ivo de un valor =ecordset persistente.

AdE?ecute$o"ecords )ndica "ue es un comando o un procedimiento almacenado "ue no devuelve filas (por ejemplo# un comando "ue s lo inserta datos). 3i se recupera alguna fila# se descarta $ no se devuelve. 3iempre se combina con adC-dTe?t o adC-d(tored roc. )ng. *. +aredes ,. AF &isual Basic -u.a del Estudiante +%gina

ro'iedad re'ared Es un Booleano "ue indica si se debe guardar una versi n compilada de un comando antes de su ejecuci n. Esta propiedad fuer(a al proveedor a guardar una versi n preparada (compilada) de la consulta especificada en la propiedad ,ommand<e6t antes de la primera ejecuci n de un objeto ,ommand. Esto puede disminuir el rendimiento de la primera ejecuci n de un comando# pero cuando el proveedor !a$a compilado el comando# utili(ar% la versi n compilada del mismo para las ejecuciones siguientes# lo cual aumentar% el rendimiento. 3i el proveedor no admite la preparaci n del comando# puede devolver un error cuando esta propiedad se estable(ca a True. 3i no devuelve un error# simplemente ignora la solicitud de preparar el comando $ establece la propiedad re'ared a False. ro'iedad (tate Describe el estado del objeto0 abierto o cerrado. Devuelve un Long o una constante0 ad(tateClosed o ad(tateO'en

0Ctodos del O8Aeto Co--and


0Ctodo E?ecute ()1+O=<A4<E# m%s bien dir.amos# el objetivo del ,ommand)

Ejecuta la consulta# la instrucci n 3?L o el procedimiento almacenado especificado en la propiedad ,ommand<e6t. Devuelve un recordset o modifica la base de datos. 3inta6is +ara un Co--and "ue devuelva filas0 (et recordset B command.E?ecute(RecordsAffected# Parameters# Options* +ara un Co--and "ue no devuelva filas0 command.E?ecute RecordsAffected# Parameters# Options command es el nombre del Objeto ,ommand RecordsAffected Opcional. Ona variable &on) en la "ue el proveedor devuelve el n5mero de registros afectados por la operaci n. Parameters Opcional. Ona matri( Variant con los valores de los par%metros pasados con una instrucci n 3?L. (Los par%metros de salida no devuelven valores correctos cuando se pasan en este argumento). Options Opcional. On valor &on) o una constante. Acepta estos valores adC-dTe?t )ndica "ue el proveedor tiene "ue evaluar &ommand=e2t como definici n te6tual de un comando# como una instrucci n 3?L. adC-dTa8le )ndica "ue ADO tiene "ue generar una consulta 3?L para devolver todas las filas de la tabla mencionada en &ommand=e2t. adC-dTa8leDirect )ndica "ue el proveedor tiene "ue devolver todas las filas de la tabla mencionada en &ommand=e2t. AdC-d(tored roc )ndica "ue el proveedor tiene "ue evaluar &ommand=e2t como procedimiento almacenado. adC-d+nEno,n )ndica "ue el tipo de comando en CommandText es desconocido. adAs!ncE?ecute )ndica "ue el comando se tiene "ue ejecutar de forma as.ncrona. adAs!ncFetcG )ndica "ue el resto de las filas siguientes a la cantidad inicial especificada en la propiedad CacGe(iIe tiene "ue ser recuperada de forma as.ncrona. 0Ctodo Cancel ,ancela la ejecuci n de una llamada as.ncrona pendiente al mtodo E?ecute )ng. *. +aredes ,. AH &isual Basic -u.a del Estudiante +%gina

3inta6is

4ombredelObjeto,ommand 1Cancel

Otilice el mtodo Cancel para terminar la ejecuci n de una llamada as.ncrona a un mtodo E?ecute (es decir# el mtodo fue invocado con la opci n adAs!ncE?ecute o adAs!ncFetcG). Co-andos 'ara-etriIados1 Los objetos ,ommand pueden utili(ar par%metros. De esta forma# podemos construir una consulta utili(ando la interrogaci n (E) como comod.n. As. cada ve( "ue ejecutemos el comando# &.B. se encargar% de sustituir el comod.n por los par%metros asociados a dic!o co--and. Adem%s podemos utili(ar los par%metros para recoger los valores devueltos por un +rocedimiento almacenado en la base de datos. +ara entender mejor este tipo de consultas primero veremos "u es el objeto 'ara-eter.

EAe-'lo de la utiliIaci@n de Co--and


&eamos un ejemplo de c mo usar el Objeto ,ommand. +ero previamente vamos a ver un c digo del "ue !emos partido para !acer ver al alumno "ue ADO permite !acer las cosas de muc!as maneras. Este c digo mete los datos de un documento en una base de datos Oracle# le$endo previamente el n5mero m%s alto del documento para poner al nuevo documento un n5mero igual al 5ltimo a /.0 Declaraciones Dim ,one6BD+rensa As ADODB.,onnection Dim =sBD+rensa/ As ADODB.=ecordset Dim 3tr)ntroducir As 3tring# 4umeroDocumento as long =em 3e abre un objeto ,onnection para crear sobre l el recordset 3et ,one6BD+rensa B 4eC ADODB.,onnection ,one6BD+rensa.,onnection3tring B R+roviderB13DAO=A./'M U T KOser )DB)4<=A4E<'+assCordB)4<=A4E<'Data 3ourceBintranet'M U T K+ersist 3ecurit$ )nfoB8alseR ,one6BD+rensa.Open =em 3e abre un recordset para leer el n5mero# se lee $ se vuelve a cerrar =sBD+rensa/.Open R)ntTDocumentos Order B$ ,LTDO,R# ,one6BD+rensa# adOpenD$namic# adLockOptimistic =sBD+rensa/.1oveLast 4umeroDocumento B =sBD+rensa/Y,LTDO, 4umeroDocumento B 4umeroDocumento a / =sBD+rensa/.,lose (; Este es el punto donde cambia el c digo "ue ver% m%s adelante) =em 3e introduce en una variable tipo 3tring una instrucci n para aJadir un nuevo registro =em Esa instrucci n se va a ejecutar desde el objeto ,onnection mediante su mtodo E6ecute 3tr)ntroducir B R)nsert )nto )4<TDO,O1E4<O3 R U T R(,LTDO,#4O1TDO,#<)<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD+<TDO,#M U T K,LT<)+OTDO,#8),7TDO,#8E,7ATE1)3)O4TDO,#OL<)1AT7O=ATDO,#M U T &)3)BLETDO,) &alues (R U 4umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U T RQ#QR U <b<itulo.<ag U RQ#/H#:#/#QR U 7=ef+rensa U R2R U <b4omb8ic!<)8 U RQ#QR U Date U RQ#G#/)R =em Observe "ue los valores tipo string introducidos (<b@@@) van entre comilla simple =em 3e ejecuta esa instrucci n desde el objeto ,onnection ,one6BD+rensa

)ng. *. +aredes ,. IG

&isual Basic -u.a del Estudiante

+%gina

,one6BD+rensa.E6ecute 3tr)ntroducir =em 3e cierra el Objeto ,onnection ,one6BD+rensa.,lose =em A"u. termina la operaci n de crear un nuevo registro 1sgBo6 RDocumento enviadoR Este es el c digo real de una aplicaci n "ue introduce los datos el resumen de prensa diario en una base de datos. 3e introduce un nuevo registro en la tabla )4<TDO,O1E4<O3. El resumen de prensa es un fic!ero .<iff de nombre <b4omb8ic!<)8 "ue se mete en una carpeta del servidor mediante 8<+# $ para su loccali(aci n $ presentaci n en una p%gina Veb es necesario introducir su nombre $ +at! $ otros datos en una base de datos. Los campos "ue se introducen $ los valores de cada uno son0 ,ampo ,LTDO,# 4O1TDO, <)<OLOTDO, AO<O=TDO, ,LT<E1ATDO, ,LTD+<TDO, ,LT<)+OTDO, 8),7TDO, &alor

4umeroDocumento (Long calculado) <b<itulo (3tring contenido en <b<itulo.<e6t) <b<itulo (3tring contenido en <b<itulo.<e6t [ se repiteN) <b<itulo.<ag (3tring contenido en <b<itulo.<ag) /H ()nteger# dato fijo) : ()nteger# dato fijo) / ()nteger# dato fijo) 7=ef+rensa U R2R U <b4omb8ic!<)8 On string "ue indica el nombre del fic!ero (<b4omb8ic!<)8.<e6t) $ su carpeta (&ariable 7ref+rensa) 8E,7ATE1)3)O4TDO, Date (8ec!a actual) OL<)1AT7O=ATDO, G (B$te# dato fijo) &)3)BLETDO, / (B$te# dato fijo) Esta forma de introducir los datos# mtodo "ue los lingbistas especiali(ados en la jerga inform%tica llaman 4a cap3n5# es la "ue nunca falla. E6ige un poco de c digo# con muc!as probabilidades de e"uivocarse# pero muc!as veces se prefiere esta forma de meter datos a utili(ar el mtodo Add4eC. <iene la gran ventaja de "ue la acepta cual"uier base de datos# independientemente de donde est el cursor. 7abr% observado "ue utili(amos el mtodo E?ecute del objeto ,onnection. > as. funciona perfectamente. &amos a !acer lo mismo# pero introduciendo la cadena de caracteres un objeto Co--and# (?ue pertenece al mismo objeto ,onnection sobre el "ue a!ora !emos ejecutado el E6ecute) $ vamos a ejecutar el E6ecute de ese ,ommand. C+e da cuenta que estamos )aciendo lo mismoD El nuevo c digo creado a partir del anterior es el siguiente0 (; Este es el mismo punto de antes. A"u. comien(a el cambio del c digo) Dim 1i,omando As ADODB.,ommand 3et 1i,omando B 4eC ADODB.,ommand 1i,omando.Active,onnection B ,one6BD+rensa 1i,omando.,ommand<e6t B R)nsert )nto )4<TDO,O1E4<O3 R T U R(,LTDO,#4O1TDO,#<)<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD+<TDO,#,LT<)+ OTDO,#8),7TDO,#8E,7ATE1)3)O4TDO,#OL<)1AT7O=ATDO,#&)3)BLETDO,) R T U R&alues (R T U 4umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U RQ#QR U <b<itulo.<ag U RQ#/H#:#/#QR U 7=ef+rensa U R2R U <b4omb8ic!<)8 U RQ#QR U Date U RQ#G#/)R 1i,omando.E6ecute ,one6BD+rensa.,lose ADO le permite !acer las cosas de maneras mu$ distintas# pero siempre debe aportar la misma informaci n. En este caso !a visto "ue el objeto ,ommand no !ace falta para nada. )ng. *. +aredes ,. I/ &isual Basic -u.a del Estudiante +%gina

DEntonces# para "ue e6isteE La respuesta es sencilla0 facilita la comprensi n del c digo. +ero "ue el objeto ,ommand no le perjudi"ue precisamente eso# la comprensi n del c digo. 4o se preocupe de no ser estrictamente acadmico. Este !umilde autor nunca usa ,ommand e6cepto para e6plicarlo. ADO nos permite eso. &amos a ver a!ora c mo !ar.amos esto mismo con el mtodo Add4eC. Deberemos crear un recordset. Lo primero# lo declaramos0 Dim =sBD+rensa as ADODB.=ecodset Luego lo creamos0 3et =sBD+rensa B 4eC ADODB.=ecordset Lo abrimos. +ero primero tomamos la precauci n de poner la propiedad ,ursorLocation del Objeto ,onnection a adOse,lient (Lado cliente) $ de esta forma los cursores creados para los recordsets abiertos sobre ese objeto connection estar%n del lado cliente. 3i el cursor est% de lado servidor es posible "ue no nos deje usar el mtodo Add4eC. (&ea 4ota /) ,one6BD+rensa.,ursorLocation B adOse,lient Abrimos el =ecordset0 =sBD+rensa.Open R)ntTDocumentosR# ,one6BD+rensa# adOpenD$namic# adLockOptimistic Ejecutamos el mtodo Add4eC =sBD+rensa.Add4eC 1etemos los datos =sBD+rensaY,LTDO, B 4umeroDocumento =sBD+rensaY4O1TDO, B <b<itulo =sBD+rensaY<)<OLOTDO, B <b<itulo =sBD+rensaYAO<O=TDO, B <b<itulo.<ag =sBD+rensaY,LT<E1ATDO, B /H =sBD+rensaY8E,7ATE1)3)O4TDO, B Date =sBD+rensaY,LTD+<TDO, B : =sBD+rensaY,LT<)+OTDO, B / =sBD+rensaY8),7TDO, B 7=ef+rensa U R2R U <b4omb8ic!<)8 =sBD+rensaY&)3)BLETDO, B / =sBD+rensaYOL<)1AT7O=ATDO, B G =ematamos con el mtodo Opdate =sBD+rensa.Opdate ,erramos el recordset. =sBD+rensa.,lose ,erramos la cone6i n ,one6BD+rensa.,lose Nota >. H Muc)os programadores se rinden cuando %en que no les funciona los mtodos AddNe; I ,pdate para introducir nue%os datos. &ierto es que cada base de datos se comporta de forma distinta respecto a este mtodo. *ero antes de rendirse usar el c3digo 4a cap3n5 intente %er como tienen la propiedad &ursor!ocation, el tipo de recordset abierto el tipo de bloque elegido /-ecuerde que por defecto es de solo lectura1. $so s#, el mtodo 4a cap3n5 funciona siempre /$2cepto que sea solo lectura1, independientemente del bloqueo del tipo de cursor

)ng. *. +aredes ,. I:

&isual Basic -u.a del Estudiante

+%gina

El VControl DataW de ADO - (Adodc ADO Data Control)


Este cap.tulo parece "ue "uedaba un poco corto. 4o por el n5mero de p%ginas# sino por"ue tanto en DAO como en =DO nos e6pla$amos con el control Data# $ en ADO parece "ue solamente lo !emos visto de pasada para e6plicar c mo se compone la cadena de cone6i n. &e%moslo un poco m%s en profundidad. El control Data para ADO es el V0icroso#t ADO data control X16 (O&EDB)W "ue se encuentra en +ro$ecto c ,omponentes. La apariencia es similar a la del Data de DAO

7agamos un repaso de sus propiedades. &eremos solamente a"uellas "ue son espec.ficas de ADO0

ro'iedad BOFAction1
Establece la forma de proceder cuando llega a la fila anterior a la primera. <oma uno de estos valores0 G [ adDo1ove8irst / [ adDo3ta$BO8 &uelve a la primera fila +ermanece en la fila BO8

ro'iedad Co--andT!'e
Es idntica a la misma propiedad del objeto ,ommand. Acepta los valores0 AdC-dTe?t un AdC-dTa8le AdC-d(tored roc AdC-d+nEno,n )ndica "ue es una definici n te6tual de un comando o una llamada a procedimiento almacenado. )ndica "ue es un nombre de tabla cu$as columnas se devuelven todas mediante una consulta 3?L generada internamente. )ndica "ue es un nombre de procedimiento almacenado +redeterminado. El tipo de comando de la propiedad Co--andTe?t es desconocido.

ro'iedad Connection(trin)
Esta propiedad $a le !emos visto m%s atr%s. Es la cadena de cone6i n con la base de datos.

ro'iedad Cursor&ocation
Es la misma "ue la vista para el objeto =ecordset.

ro'iedad CursorT!'e
Es la misma "ue para el objeto =ecordset. Acepta los valores0 / [ adOpen`e$set : N adOpenD$namic A [ adOpen3tatic

ro'iedad EOFAction

)ng. *. +aredes ,. IA

&isual Basic -u.a del Estudiante

+%gina

Establece la forma de proceder cuando llega a la fila EO8. Acepta los valores0 G [ adDo1oveLast / [ ad3ta$EO8 : [ adDoAdd4eC ro'iedad &ocET!'e <ipo de Blo"ue. )gual a la misma propiedad del Objeto =ecordset &uelve a la 5ltima fila +ermanece en la fila EO8 AJade una nueva fila

ro'iedad 0a?"ecords
Es similar a la del Objeto =ecordset. Establece el n5mero de filas "ue obtiene en su recordset asociado.

ro'iedad 0ode1
)gual a la misma propiedad del objeto =ecordset

ro'iedades ass,ord
Establece la contraseJa para crear la cadena de cone6i n durante la creaci n del objeto =ecordset asociado. Esta contraseJa es la contraseJa del usuario en la base de datos. Esta propiedad es solamente de escritura. 3i se pretende leer da error.

ro'iedad +ser$a-e
Establece el nombre del usuario. Debe ser uno de los usuarios registrados en la base de datos. Esta propiedad es de lectura $ escritura. El valor de la propiedad +assCord debe ser el asociado a este usuario.

ro'iedad "ecord(ource
Es una cadena de caracteres con el nombre de una tabla o una sentencia 3?L "ue devuelve filas.

0Ctodos del control Adodc +'dateControls


Actuali(a la informaci n de los controles enla(ados a datos. Opdate=ecords. 4o e6iste el mtodo

"e#resG
&uelve a construir el recordset. Es idntico al del control Data de DAO. &istas $a las propiedades $ mtodos del control Adodc# vamos a ver un poco como funciona $ cuales son sus diferencias con el control data de DAO

Funciona-iento del Adodc


El Adodc puede enla(ar una base de datos a los t.picos controles enla(ados (Label# <e6tBo6) usando la tecnolog.a ADO. Los dem%s controles enla(ados no tienen un comportamiento igual con el Adodc# ,ontrol Data o =DOData,ontrol. En la siguiente lista puede ver "ue controles trabajan con uno u otro control Data.

)ng. *. +aredes ,. II

&isual Basic -u.a del Estudiante

+%gina

,ontrol DB-rid Data-rid DataList Data,ombo DBList DB,ombo 138le6-rid 1378le6-rid

ADO 4O 3) 3) 3) 3) 3) 4O 3)

=DO 3) 4O 3) 3) 3) 3) 3) 4O

DAO 3) 4O 3) 3) 3) 3) 3) 4O

=eferencia 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft Data Bound -rid ,ontrol P.G 3+A Data-rid ,ontrol L.G (OLEDB) Data List ,ontrols L.G (OLEDB) Data List ,ontrols L.G (OLEDB) Data Bound List ,ontrols L.G Data Bound List ,ontrols L.G 8le6-rid ,ontrol L.G 7ierarc!ical 8le6-rid ,ontrol L.G (OLEDB)

+or lo dem%s el funcionamiento del Adodc es similar al ,ontrol data $ al =DOData,ontrol.

,on este cap.tulo creo "ue $a tienen conocimientos suficientes para empe(ar a trabajar con ADO# $ por la tanto# $a tiene permiso para aprender a programar con esta tecnolog.a. Le recomiendo paciencia# $ sobre todo no tener miedo a esta tecnolog.a. > como se dijo al principio# 5sela siempre "ue tenga "ue usar una base de datos instalada en un servidor $ conectada al usuario a travs de una red de %rea local. En el pr 6imo cap.tulo ver% como se enla(an un cliente con el servidor 3?L 3erver. De cual"uier forma no olvide la tecnolog.a DAO para sus pe"ueJas aplicaciones# con la base de datos en el mismo ordenador "ue la aplicaci n. +ersonalmente creo "ue es muc!o m%s r%pida $ m%s sencilla. 3uerte.

)ng. *. +aredes ,. IP

&isual Basic -u.a del Estudiante

+%gina

También podría gustarte