Sie sind auf Seite 1von 45

Visual Basic - Gua del Estudiante Cap.

14
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

Bases de datos Relacionales

Aplicacin que accede a los datos

O D B C

Texto

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

O D B C

Modelo DAO/RDO

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%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 ,liente2)ervidor (,2)) son0 ,reaci n de los objetos de forma independiente. 3o 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. )oporte para limitar el n4mero m%5imo 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. )oporte para recibir varios recordset como resultados devueltos de un procedimiento almacenado. 6a$ "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. 7ig 89.- :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# e5isten 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 e5plicar donde $ por"u se deben utili(ar objetos ADO en ve( de objetos DAO u objetos =DO 6asta a!ora !ab+amos utili(ado bases de datos Access# $ tambin otras bases de datos sencillas como dBase. Acceder a Access es e5tremadamente 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 )$stemDB en el ,ap+tulo -9) sin embargo estas posibilidades se usan en mu$ pocas ocasiones# $ estos mecanismos de seguridad de Access

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9

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 )@L)erver. >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# )@L)erver# Access $ las dem%s BD controladas por el motor :et). ADO funciona de forma diferente a ODB,. ,on ODB, se preparan cone5iones permanentes en el ordenador# $ cual"uier programa puede acceder a la BD a travs de esas cone5iones. ,on ADO no !a$ "ue preparar previamente ninguna cone5i 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 cone5i n $ abra la BD. )i !ubiese dos programas ejecut%ndose simult%neamente $ accediendo a la misma base de datos a travs de ADO# cada programa prepara una cone5i n a esa BD. En ODB, podr+amos ver las cone5iones e5istentes en el /, a travs del /anel de C nt! l " #uentes de Dat s ODBC. En ADO no e5iste esa posibilidad $a "ue# como se !a dic!o# es el propio programa "uien crea esa cone5i n al ajecutarse. /ara "ue &B pueda acceder a ADO es necesario introducir en el programa la referencia a 1icrosoft ActiveA Data Objets 9.- Librar$ ($! %ect "&e'e!encias) ,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 cone5i 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,one5ion 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 sinta5is0

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina B

)et 1i,one5ion C 3eD ADODB.,onnection ( ta) $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 cone5i n Eest% creadaF. )+# pero de momento es completamente in4til $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 ()olo lectura# etc.) Esta informaci n se la pasamos mediante la propiedad ,onnection)tring (,adena de cone5i n) *a p! piedad C nnecti n+t!in, Es la propiedad m%s importante del objeto ,onnection. )e 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) $! -ide! Especifica el nombre del proveedor "ue se usa en la cone5i n. (Oracle# )@L)erver# :et# etc) Data + u!ce Especifica el nombre de la fuente de datos para la cone5i n. (3ombre de la base de datos a la "ue se va a acceder. .se! Id Especifica el nombre de usuario "ue abre la cone5i n. Debe ser un usuario $a declarado en la base de datos. $ass/ !d Especifica la clave utili(ada por el usuario para abrir la cone5i n. Debe coincidir con el "ue tiene ese usuario registrado en la Base de datos. #ile (a0e Especifica el nombre del fic!ero espec+fico de proveedor# "ue contiene la informaci n de configuraci n de la cone5i n. Este fic!ero es 4til en instalaciones en red "ue re"uieran modificaciones de cone5i n frecuentes. &e0 te $! -ide! Especifica el nombre de un proveedor de datos remoto cuando se utili(a una cone5i n cliente2servidor &e0 te +e!-e! Especifica el nombre del camino al servidor "ue se va a usar cuando se establece una cone5i n cliente2servidor ,omo ejemplo para la cone5i n a una base de datos O!acle# con el usuario "ue esa BD tiene por defecto (scott) $ el /assDord de este usuario (tiger) tendremos "ue especificar en el C nnecti n+t!in, la siguiente cadena de caracteres. 1$! -ide!23+DAO&A.14$ass/ !d2ti,e!4.se! ID2sc tt4Data + u!ce23AD&ID45 donde el valor de )ource es la cadena de cone5i n de Oracle "ue previamente tiene "ue estar configurada con el )@L;3et o 3etG de Oracle. )i lo "ue "ueremos es crear una cone5i n con una base de datos Access 9HHH 1$! -ide!23ic! s 't.Jet.O*EDB.4.64Data + u!ce2C)7GuiadelEstudiante7$!ue8aADO.0d845 )i la base de datos es de Access I8 entonces tendremos "ue especificar otro provider0 1$! -ide!23ic! s 't.Jet.O*EDB.9.:4Data + u!ce2C)7GuiadelEstudiante7d81.0d845

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina .

/ara una base de datos )@L)erver ;$! -ide!2+<*O*EDB.14$ass/ !d2a%udas614 .se! ID2a%udas614 Initial Catal ,2A%udas=34 Data + u!ce2a%udas=s>l; (en una l+nea 4nica) ,omo puede comprobar# resulta una tanto complicado construir la cadena de cone5i n $ mientras "ue seamos novatos en ADO podemos tener problemas para crear esta cadena. E/ero es "ue no e5iste una manera m%s f%cil de construir esta cadenaF Efectivamente. 6a$ un pe"ueJo truco mediante el cual no solo podemos crearla con un asistente# sino "ue adem%s probaremos si la cone5i n es satisfactoria o no. T!uc pa!a c nst!ui! la cadena de c ne?i@n. 1) /rimero tenemos "ue incluir el componente K1icrosoft ADO data control L.H (OLEDB)M. /odemos !acerlo pulsando ,trl.N< o en el men4 /ro$ecto ,omponentes. 9) 1etemos en nuestro formulario el control $ pulsamos 7. para ver sus propiedades. B) 6acemos ,lick en la propiedad ,onnection)tring $ nos aparecer% el bot n de puntos suspensivos. 6acemos ,lick en el bot n. .) A!ora nos aparece el asistente "ue nos mostrar% B opciones. Otili(ar un D)3 de arc!ivo# utili(ar un controlador ODB, o utili(ar una cadena de cone5i 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 cone5i 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 4nicamente necesitaremos dos de ellas para crear una cadena de

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina P

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

6) En la /estaJa cone5i 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 3+ Access (1) :et ..H OLEDB /rovider para la versi n 9HHH de Access# 1) :et B.P OLEDB /rovider para la versi n I8 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 . )i utili(amos el proveedor de datos de O!acle# tendremos "ue indicarle como nombre de servidor la cadena de cone5i n utili(ada en el )@L 3et o en el 3etG de Oracle (la misma cadena "ue especifica cuando se conecta a travs de )@L;/lus). En esta pestaJa e5isten 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 cone5i n la clave del usuario. /ara la primera prueba le recomiendo "ue la mar"ue. 3o obstante# !aga diferentes pruebas con ellas para ver los resultados. Despus de !aber dado esta informaci n# pulsaremos el bot n /robar cone5i n. En el caso de "ue !a$a alg4n error# el asistente nos lo indicar% con un mensaje.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina L

/rueba de cone5i n (fallida) con /roveedor de datos de Oracle

/rueba satisfactoria 8) Ona ve( "ue !emos probado satisfactoriamente la cone5i n# pulsaremos aceptar $ volveremos a la pantalla inicial# la de las B opciones. La diferencia es "ue a!ora tenemos la cadena de cone5i n rellenada por el asistente. A!ora podemos copiarla con ctrl.N, $ llevarla a la parte del c digo donde "ueremos establecer la cone5i n. 3o se olvide de "ue es una cadena $ "ue cuando se asigne a la propiedad ,onnection)tring debe ir entre comillas dobles. G) Ona ve( "ue !emos probado "ue funciona al abrir el objeto ,onnection# 3o 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 cone5i n $ se la !emos introducido en la propiedad C nnecti n+t!in, E>a est% creada la cone5i nF )+# 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 $ /assDord. )olamente "ueda aplicar un mtodo del objeto ,onnection0 el mtodo Open con una sinta5is "ue no es e5cesivamente dif+cil0 1icone5i n.Open

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 8

!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 cone5i n. En el ejemplo usamos una base de datos Access (3o 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 )@L no se instala f%cilmente en un ordenador personal) )et 1i,one5ion C 3eD ADODB.,onnection Q1i,one5ion.,onnection)tring C R/roviderC1icrosoft.:et.OLEDB...H'Data )ourceC,0S*uiaDelEstudianteSADOS/ruebaADO.mdb'/ersist )ecurit$ ?nfoC7alseR Q1i,one5ion.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. )e crea l a s+ mismo. /ara "ue pueda e5istir un objeto =ecordset primero !a$ "ue declararlo0 Dim 1i=ecordset As ADODB.=ecordset (6a$ "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 sinta5is0 )et 1i=ecordset C 3eD ADODB.=ecordset (>a est% creado. /ero no est% abierto# a!ora !a$ "ue abrirlo)

1i=ecordset.Open RAlumnosR# 1i,one5ion# 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 cone5i n 1i,one5ion# 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 )@L 1i=ecordset.Open R)elect AlumnoT3ombre# AlumnoTApe-# AlumnoTApe9 7rom Alumnos R T U KV!ere AlumnoT3ombre C WLuisXM# 1i,one5ion# adOpenD$namic# adLockOptimistic )i no !ubisemos creado previamente el objeto ,onnection# podr+amos crear $ abrir igualmente este objeto recordset# pero# en ve( de pasarle el nombre de la cone5i n (1i,one5ion) le pasar+amos la cadena de cone5i n usada para crear ese objeto ,onnection.

)et 1i=ecordset C 3eD ADODB.=ecordset 1i=ecordset.Open RAlumnosR# R/roviderC1icrosoft.:et.OLEDB...H'Data )ourceC,0S*uiaDelEstudianteSADOS/ruebaADO.mdb'/ersist )ecurit$ ?nfoC7alseR# adOpenD$namic# adLockOptimistic

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina G

/$s solamente una l#nea. 9a sido :ord quien la )a troceado1 A!ora $a podemos presentar los campos del recordset# usando la sinta5is "ue $a conocemos de DAO <b3ombre C KM U 1i=ecordsetYAlumnoT3ombre <bApe- C KM U 1i=ecordsetYAlumnoTApe<bApe9 C KM U 1i=ecordsetYAlumnoTApe9 6agamos una pe"ueJa pausa. Observe "ue !a$ diferencias de trabajar con ADO o !acerlo con DAO. C n DAO. Declarar 1i)esion# 1iBase $ 1i=ecordset Dim 1i)esion as Vorkspace Dim 1iBase As DataBase Dim 1i=ecordset as =ecordset ,rear el objeto Vorkspace# el objeto DataBase $ el objeto =ecordset )et 1i)esion C Vorkspaces(H) )et 1iBase C 1i)esion.OpenDatabase (K,0S*uiadelEstudianteSAlumnos.1dbM) )et 1i=ecordset C 1iBase.Open=ecordset (KAlumnos# dbOpenD$naset) C n ADO (C!eand el 8Aet C nnecti n) Declarar 1i,one5ion $ 1i=ecordset Dim 1i,one5ion As ADODB.,onnection Dim 1i=ecordset As ADODB.=ecordset ,rear la cone5i n $ ponerle la cadena de cone5i n en su propiedad ,onnection)tring )et 1i,one5ion C 3eD ADODB.,onnection 1i,one5ion.,onnection)tring C R/roviderC1icrosoft.:et.OLEDB...H'Data )ourceC,0S*uiaDelEstudianteSADOS/ruebaADO.mdb'/ersist )ecurit$ ?nfoC7alseR Abrir el objeto ,onnection 1i,one5ion.Open ,rear el objeto recordset )et 1i=ecordset C 3eD ADODB.=ecordset Abrir el objeto =ecordset 1i=ecordset.Open RAlumnosR# 1i,one5ion# adOpenD$namic# adLockOptimistic C n ADO (+in c!ea! el 8Aet C nnecti n) Declarar 1i=ecordset Dim 1i=ecordset As ADODB.=ecordset ,rear el =ecordset )et 1i=ecordset C 3eD ADODB.=ecordset Abrir el =ecordset 1i=ecordset.Open RAlumnosR# R/roviderC1icrosoft.:et.OLEDB...H'Data )ourceC,0S*uiaDelEstudianteSADOS/ruebaADO.mdb'/ersist )ecurit$ ?nfoC7alseR# 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

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina I

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 1i)esion.,lose (=ecuerde "ue debe cerrar antes el recordset "ue la cone5i n)

B<uC pasa c n el e>ui-alente del D !EspaceF ,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 Vork)pace ADO =ecordset ,onnection E

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 /assDord para "ue la propia base de datos "uien autorice a ese usuario. Al,unas c sas >ue le -an a cu!!i! cuand %a Ga%a c!ead el !ec !dset. 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 $ )@L)erver. Access# con la modestia "ue le caracteri(a# no va a dar ning4n problema.) Los recordsets abiertos mediante una consulta )@L (a"uellos en los "ue seleccionamos parte de los registros mediante +elect H DGe!e 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.1ove7irst# 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 )@L O!de! B%. 3o !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.Open R)elect AlumnoT3ombre# AlumnoTApe-# AlumnoTApe9 7rom Alumnos R T U KV!ere AlumnoT3ombre C WLuisXM# 1i,one5ion# adOpenD$namic# adLockOptimistic usar esta otra alternativa0 1i=ecordset.Open RAlumnosR# 1i,one5ion# adOpenD$namic# adLockOptimistic /osiblemente necesitemos crear dos recordsets en un mismo procedimiento. /or ejemplo# es mu$ t+pico tener "ue buscar el 4ltimo registro para ver el 4ltimo n4mero de un identificador de registro (AlumnoT?D) $ poner en este campo# al registro "ue vamos a crear# un n4mero 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

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -H

1i=ecordset.Add3eD nos dir% "ue el cursor (el recordset# para entendernos) es solamente de lectura. La soluci n es# abrir el recordset con la sinta5is anterior# leer el n4mero de AlunmoT?D# cerrar el recordset# crear otro recordset con el mismo nombre# usando la sinta5is0 1i=ecordset.Open RAlumnosR# 1i,one5ion# adOpenD$namic# adLockOptimistic A!ora $a nos permitir% usar el mtodo Add3eD. Basta con aJadir las l+neas de c digo adecuado para introducir los valores en cada campo0 1irecordset.Add3eD 1i=ecordsetYAlumnoT?D C &alor numrico 1i=ecordsetYAlumnoT3ombre C &alor string Etc. Z. 1i=ecordset.Opdate 3o renuncie nunca a intentar !acer esto. 3o siempre funciona. /ero esto es muc!o m%s sencillo "ue introducir los datos Ka cap nM utili(ando la instrucci n )@L Inse!t "ue $a veremos m%s adelante. )@L)erver es bastante m%s d cil "ue Oracle para usar el mtodo Add3eD. 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. 3 di'ica! dat s 0ediante 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=ecordsetYAlumnoT3ombre C K/edroM 1i=ecordsetYAlumnoTApe- C 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 )@L# "ue en este caso ser% .pdate. /ero $a lo veremos m%s adelante. 6asta 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 a4n no sabemos lo "ue !ace. El 8Aet C 00and lo "ue va a !acer es crear un recordset. O tambin# meter 4a cap3n5 un nuevo registro# o borrarlo# utili(ando directamente instrucciones )@L. 6a$ "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 Add3eD del recordset 1i=ecordset.Add3eD > !a$ "ue emplear una instrucci n )@L0 I(+E&T

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina --

En estos casos# en ADO utili(amos el mtodo EAE,O<E sobre el objeto ,onnection. ,reamos una variable# )tr?ntroducir# con el contenido de la instrucci n )@L $ ejecut%bamos esa instrucci n mediante E5ecute )tr?ntroducir C R?nsert ?nto ?3<TDO,O1E3<O) R T U R(,LTDO,#3O1TDO,#<?<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD/<TDO,#M T U KLT<?/OTDO,#7?,6TDO,#7E,6ATE1?)?O3TDO,#OL<?1AT6O=ATDO,#&?)?BLETDO,)RT U R&alues (R U 3umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U RQ#QR U <b<itulo.<ag T U RQ#-I#9#-#QR U 6=ef/rensa U R2R U <b3omb7ic!<?7 U RQ#QR U Date U RQ#H#-)R ,one5BD/rensa.E?ecute )tr?ntroducir Esta l+nea ()tr?ntroducir) es el contenido de la propiedad ,ommand<e5t de un objeto ,ommand de ADO. 3i 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 EAE,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 e5presiones# pero d%ndole m%s cuerpo. ,on la instrucci n anterior# lo "ue !ac+amos era aJadir un registro. )i lo "ue "ueremos !acer es crear un recordset# la instrucci n )@L comen(ar+a por K)elect ; 7rom Z.M > el mtodo EAE,O<E devolver+a un =ecordset )tr?ntroducir C K)elect ; 7rom Alumnos V!ere Apellido- C W)uare(XM /odemos crear un recordset (1i=ecordset# previamente declarado como tal) con esta instrucci n 1i=ecordset C ,one5BD/rensa.E?ecute )tr?ntroducir O con estas otras )et 1i,omando as 3eD ADODB.,ommand 1i,omando.Active,onnection C ,one5BD/rensa 1i,omando.,ommand<e5t C K)elect ; 7rom Alumnos V!ere Apellido- C W)uare(XM 1i=ecordset C 1i,omando.E5ecute &er% el ejemplo completo al final del cap+tulo. A!ora# tras la e5plicaci n informal de c mo se crea una cone5i 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.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -9

ADO. El Objeto ,onnection


On objeto C nnecti n representa una cone5i 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 O8Aet &ec !dset 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 e5ista previamente un objeto ,onnection. Esta es una de las propiedades de los objetos ADO0 no necesita cumplir estrictamente con la jerar"u+a. El O8Aet C 00and 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 C lecci@n E!! !s 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 4nicamente 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 E!! $! piedades del O8Aet C nnecti n /!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. 3o todos se comportan de igual forma# por lo "ue cada propiedad debe condicionarse a si el proveedor es capa( de ofrecerla. $! piedad Att!i8utes Es un Long. Acepta dos valores o la suma de los dos0 adXactC 00it&etainin, adXactA8 !t&etainin, Estos atributos condicionan el modo de operaci n de la cone5i n con los mtodos ,ommit<rans $ =ollBack<rans. $! piedad C 00andTi0e ut ?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 BH. $! piedad C nnecti nTi0e ut ?ndica# en segundos# el intervalo de espera para establecer una cone5i n antes de "ue finalice el intento $ se genere un error. Es un Long $ el valor predeterminado es -P.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -B

$! piedad C nnecti n+t!in, (?1/O=<A3<E) Es una cadena de caracteres "ue contiene la informaci n "ue se utili(a para establecer una cone5i n a un origen de datos. (&ea la e5plicaci n amplia m%s atr%s) La cadena de cone5i 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# 7ile 3ame# =emote /rovider $ =emote )erver. Los dem%s argumentos los pasa al proveedor para "ue el los procese (Osuario# /assDord# etc) )i al emplear el mtodo Open se utili(a el par%metro ,onnection )tring# este par%metro utili(ado en el mtodo Open sustituir% a cual"uier otro e5istente anteriormente. Ona ve( abierta la cone5i n# esta propiedad no se puede cambiar puesto "ue es solamente de lectura. Los argumentos File Name $ Provider son e5clu$entes. $! piedad Cu!s !* cati n (?1/O=<A3<E)

Establece o devuelve la posici n de un servicio de cursores. Es un Long# $ acepta las siguientes constantes0 Ad.se( ne 3o se usan servicios de cursor. (Esta constante es obsoleta $ aparece 4nicamente por compatibilidad con versiones anteriores.) Ad.seClient Osa cursores del lado del cliente. Ad.se+e!-e! /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. )e 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. ()@L )erver 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 )@L. Al recibirla el servidor# gestionar% la obtenci n de los resultados $ una ve( "ue los !a$a conseguido viene su primera duda0 ED nde los almacenoF /uede almacenarlos en el servidor# $ cada ve( "ue necesitemos un nuevo registro# por ejemplo al ejecutar la sentencia 1i=ecordset.1ove3e5t# 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. 3os 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 cone5i n le cree todos los cursores de lado cliente basta ejecutar la instrucci n0 1i,one5ion.,ursorLocation C adOse,lient

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -.

)i desea !acer transacciones# deber% crear cursores del lado servidor# $a "ue los de lado cliente no las admiten. ,omprender% seg4n va$a programando $ encontr%ndose con problemas# "ue esta propiedad es absolutamente importante. Este valor debe establecerlo antes de crear la cone5i n. De esta forma# todos los cursores creados con esa cone5i n ser%n de lado cliente o lado servidor# seg4n !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 cone5i n# sino al recordset. El n4mero 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. $! piedad 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 cone5i n. )olamente es v%lida con a"uellos proveedores "ue permiten varias bases de datos por cone5i n. Is lati n*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. $! piedad 3 deJ Establece los permisos disponibles para modificar datos en un objeto ,onnection. Los valores aceptados son0 Ad3 de.nEn /n Ad3 Ad3 Ad3 Ad3 Ad3 /redeterminada. ?ndica "ue los permisos no se !an establecido a4n o "ue no se pueden determinar. de&ead ?ndica "ue son permisos de s lo lectura. deD!ite ?ndica "ue son permisos de s lo escritura. de&eadD!ite ?ndica "ue son permisos de lectura2escritura. de+Ga!eDen%&ead ?mpide "ue otros abran una cone5i n con permisos de lectura. de+Ga!eDen%D!ite ?mpide "ue otros abran una cone5i n con permisos de escritura. ?mpide "ue otros abran una cone5i n. ?mpide "ue otros abran una cone5i n con cual"uier tipo de permiso.

Ad3 de+Ga!eE?clusi-e Ad3 de+Ga!eDen%( ne

) lo puede establecer la propiedad 3 de cuando el objeto C nnecti n est% cerrado. ,uando se usa en un objeto C nnecti n del lado del cliente# la propiedad 3 de s lo se puede establecer a ad3 de.nEn /n. $! piedad $! -ide! Es un string "ue indica el nombre del proveedor de un objeto ,onnection. )i no se especifica ning4n proveedor# la propiedad tendr% el valor predeterminado 1)DA)@L (/roveedor de 1icrosoft OLE DB para ODB,).

$! piedad +tate Devuelve el estado del objeto ,onnection0 abierto (ad)tateOpen C -) o cerrado (ad)tate,losed C H).

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -P

$! piedad Ve!si n Devuelve el n4mero de versi n de ADO. Es un )tring.

3Ct d s del O8Aet C nnecti n


3Ct d s Be,inT!ansJ C 00itT!ans % & ll8acET!ans Estos mtodos de transacci n administran el proceso de la transacci n dentro de un objeto ,onnection de la forma siguiente0 Be,inT!ans0 inicia una nueva transacci n. C 00itT!ans0 guarda las modificaciones $ termina la transacci n actual. <ambin puede iniciar una nueva transacci n. & ll8acET!ans0 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,inT!ans# el proveedor $a no aplicar% inmediatamente las modificaciones !asta "ue invo"ue C 00itT!ans o & ll8acET!ans para terminar la transacci n. Los mtodos Be,inT!ans# C 00itT!ans $ & ll8acET!ans no est%n disponibles en los objetos C nnecti n del lado del cliente.

3Ct d Cancel ,ancela la ejecuci n de una llamada as+ncrona pendiente a un mtodo E?ecute u Open. )inta5is 3ombre,onection.Cancel

El mtodo Cancel se utili(a para terminar la ejecuci n de una llamada as+ncrona a un mtodo E?ecute o Open (es decir# el mtodo fue invocado con la opci n adAs%ncC nnect# adAs%ncE?ecute o adAs%nc#etcG). Cancel devolver% un error de ejecuci n si no se utili( adAs%ncE?ecute en el mtodo "ue "uiere terminar. Cl seJ 0Ct d ,ierra el objeto ,onnection. )inta5is NombredelOb.eto&onnection.Cl se

El cierre de un objeto C nnecti n mientras !a$ objetos &ec !dset abiertos en la cone5i n cancela las modificaciones pendientes en todos los objetos &ec !dset. El cierre e5pl+cito de un objeto C nnecti n (llamando a su mtodo Cl se) mientras una transacci n est% en progreso genera un error. )i un objeto C nnecti n 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. )et NombredelOb.eto&onnection C 3ot!ing 3Ct d E?ecute (&ea tambin 1todo E5ecute para el objeto ,ommand) Ejecuta una consulta# instrucci n )@L# procedimiento almacenado especificados o te5to espec+fico del proveedor. )inta5is (/ara una cadena de comando "ue no devuelva filas)0

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -L

cone2i3n.E?ecute CommandText# RecordsAffected# Options (/ara una cadena de comando "ue de%uel%a filas1' +et Mi-ecordset C connection.E?ecute (CommandText# RecordsAffected# Options) (1i=ecordset debe ser una variable declarada tipo ADODB.=ecordset) CommandText $s un )tring "ue contiene la instrucci n )@L# el nombre de la tabla# el procedimiento almacenado o el te5to espec+fico del proveedor "ue se va a ejecutar. RecordsAffected Opcional. Ona variable Long en la "ue el p! -eed ! de-uel-e el n4mero 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. C nstante adC0dTe?t adC0dTa8le adC0dTa8leDi!ect adC0dTa8le adC0d+t !ed$! c adC0d.nEn /n adAs%ncE?ecute adAs%nc#etcG Desc!ipci@n ?ndica "ue el proveedor tiene "ue evaluar CommandText como definici n te5tual de un comando# como una instrucci n )@L. ?ndica "ue ADO tiene "ue generar una consulta )@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 )@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 E5ecute,omplete. 3Ct d Open (?1/O=<A3<E)

Abre una cone5i n a un origen de datos. )inta5is 1i,onnection.Open ConnectionSTringJ UserIDJ Pass ord! Options 1i,onnection.Open Los par%metros &onnection+=ring# ,ser6D# *ass;ord, Options puede introducirlos previamente a abrir la cone5i n# $ utili(ar la segunda sinta5is cuando desee abrirla realmente. Estos par%metros se le pasan en la cadena de cone5i n0 ,one5BD/rensa.,onnection)tring C R/roviderC1)DAO=A.-'Oser ?DC?3<=A3E<'M U T K/assDordC?3<=A3E<'Data )ourceCintranet'/ersist )ecurit$ ?nfoC7alseR Options Opcional. /uede ser una de las constantes siguientes0 Ad,onnectOnspecified Abre la cone5i n de forma sincron+a AdAs$nc,onnect Abre la cone5i n de forma as+ncrona ,uando se usa un objeto ,onnection del lado del cliente# el mtodo Open no establece realmente una cone5i n con el servidor !asta "ue se abre un =ecordset del objeto ,onnection.

C lecci nes del O8Aet C nnecti n


C lecci@n E!! !s ,ontiene todos los objetos E!! ! creados en respuesta a un 4nico fallo relacionado con el proveedor. ,ada objeto E!! ! representa un error espec+fico del proveedor# no un error ADO. Los errores ADO se e5ponen al mecanismo de control de e5cepciones en tiempo de ejecuci n. L)B &isual Basic *u+a del Estudiante ,ap+tulo -. /%gina -8

/or ejemplo# en 1icrosoft &isual Basic# cuando ocurre un error espec+fico de ADO dispara un evento On E!! ! $ aparece en el objeto E!!. ,uando otra operaci n ADO genera un error# se borra la colecci n E!! !s $ el nuevo conjunto de objetos E!! ! se coloca en la colecci n E!! !s. Las operaciones ADO "ue no generan un error no tienen ning4n efecto sobre la colecci n E!! !s. /ara borrar manualmente la colecci n E!! !s utilice el mtodo Clea!. ,ada objeto E!! ! de la colecci n# nos dar% informaci n sobre un error producido en la cone5i n. )us propiedades son las siguientes0 Desc!ipti n) ,ontiene la descripci n del error producido ()tring). (ati-eE!! !) ?ndica el error devuelto por la base de datos (Long). (u08e!) Es el c digo de error (Long). + u!ce) ?ndica el nombre del objeto o aplicaci n "ue !a generado el error ()tring). +<*+tate) ?ndica el error )@L est%ndar asociado.()tring). 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 )ub ,B,one5ionT,lick() Dim 1i,one5- As ADODB.,onnection Dim 1iError As ADODB.Error On Error *o<o =utErr )et 1i,one5- C 3eD ADODB.,onnection 1i,one5-.,onnection)tring C R/roviderC1)DAO=A.-'/assDordCtiger'Oser ?DCE+c t'Data )ourceC1AD=?D'/ersist )ecurit$ ?nfoC<rueR 1i,one5-.Open E5it )ub =utErr0 7or Eac! 1iError ?n 1i,one5-.Errors 1sgBo5 (RError &B0R U 1iError.3umber U vb,rLf T U RError Oracle0R U 1iError.3ativeError U vb,rLf T U RError )@L0R U 1iError.)@L)tate U vb,rLf T U R*enerado /or0R U 1iError.)ource U vb,rLf T U RDescripci n0R U 1iError.Description) 3e5t End )ub

,omo puede observarse# algunas de las propiedades no devuelven los valores esperados0 3ativeError vale H cuando deber+a valer [-H-8# "ue es el error asociado de Oracle. A4n as+ podemos capturar el c digo del error desde la cadena de caracteres desc!ipti n. ,on este 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

C lecci@n $! pe!ties

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -G

Es el conjunto de objetos /ropert$ O8Aet $! pe!t% On objeto $! pe!t% representa una caracter+stica din%mica de un objeto ADO "ue est% definida por el proveedor.

Los objetos ADO tienen dos tipos de propiedades0 int!nsecas $ dinK0icas. Las propiedades intr+nsecas son a"uellas propiedades implementadas en ADO e inmediatamente disponibles para cual"uier nuevo objeto# utili(ando la sinta5is O8Aet .$! piedad. 3o aparecen como objetos $! pe!t% 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 $! pe!ties 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 $! pe!t% en la colecci n $! piedades de dic!o objeto &ec !dset. A las propiedades din%micas se les puede !acer referencia s lo a travs de la colecci n# utili(ando la sinta5is Objeto.$! pe!ties(6) u Objeto.$! pe!ties(R3ameR). On objeto $! pe!t% din%mico tiene cuatro propiedades incorporadas propias0 La propiedad (a0e es una cadena "ue identifica la propiedad. La propiedad T%pe 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 Att!i8utes es un valor Long "ue indica caracter+sticas de la propiedad espec+ficas del proveedor.

El O8Aet &ec !dset de ADO


El objeto &ec !dset 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 )@L# o ejecutando un comando "ue contienen el nombre de esa tabla o la consulta. En un momento determinado# el objeto &ec !dset s lo !ace referencia a un 4nico registro dentro del conjunto de registros# llamado registro actual.

$! piedades del O8Aet &ec !dset


El recordset de ADO tiene propiedades iguales al recordset de DAO# pero tienen otras "ue no tienen el de DAO. )e van a estudiar todas# profundi(ando m%s en las "ue son particulares del recordset ADO. $! piedad A8s lute$ siti n (ADO) Especifica la posici n ordinal del registro actual de un objeto =ecordset. Esta propiedad devuelve un Long con el n4mero 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.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina -I

$! piedades BO# % EO# ?ndican si la posici n del puntero del =ecordset est% apuntando a un registro anterior al primero (BO7 C <rue) o posterior al 4ltimo (EO7 C <rue). Esta propiedad siempre la podremos mirar# independientemente si el cursor es lado cliente o lado servidor. $! piedad Acti-eC nnecti n (ADO) ?ndica a "u objeto ,onnection pertenece actualmente el objeto =ecordset especificado. Devuelve un string con el nombre del objeto ,onnection. $! piedad B E0a!E

Devuelve un marcador "ue identifica un+vocamente al registro actual de un objeto =ecordset o establece el registro actual de un objeto &ec !dset 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 +upp !ts para averiguarlo. ,uando el recordset es de lado cliente# siempre est% disponible el Bookmark. $! piedad CacGe+iIe ?ndica el n4mero 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. )i ponemos esta propiedad por ejemplo a -H# al abrir la primera ve( el objeto &ec !dset# el proveedor recupera los -H primeros registros en la memoria local. A medida "ue se despla(a por el objeto &ec !dset# el proveedor devuelve los datos desde el b4fer de memoria local. <an pronto como pasa del 4ltimo registro de la memoria cac!# el proveedor recupera los -H 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. $! piedad 3a?&ec !ds ?ndica el n4mero m%5imo de registros "ue se devuelven a un =ecordset desde una consulta. Es un Long $ el valor predeterminado es H# "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 n4mero mu$ grande de registros. Es prudente tomar medidas frente a a"uellas operaciones en las "ue el ordenador pueda meterse en un proceso e5cesivamente 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 VindoDs )i estamos frente a una base de datos con todos los datos de los afiliados a la )eguridad )ocial# no es del todo prudente crear un recordset mediante esta sentencia0 )ELE,< ; 7rom Afiliados V!ere Apellido- C W7ernande(X ?ncluso las !a$ peores0 )ELE,< ; 7rom Afiliados A nadie se le ocurrir+a# pero puede surgir involuntariamente cuando ese acceso se reali(a desde un puesto de operaci n p4blico (Acceso desde ?nternet por ejemplo). ,on la propiedad 3a?&ec !ds puede limitar el n4mero 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.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9H

$! piedad Cu!s !* cati n 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. $! piedad Cu!s !T%pe ?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 AdOpen# !/a!dOnl% /redeterminado. ?dntico a un cursor est%tico# e5cepto 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. AdOpenLe%set ,ursor de conjunto de claves. ?gual "ue un cursor din%mico# e5cepto "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. AdOpenD%na0ic ,ursor din%mico. Las incorporaciones# cambios $ eliminaciones "ue !acen otros usuarios permanecen visibles# $ se admiten todo tipo de movimientos entre registros# a e5cepci n de los marcadores si el proveedor no los admite. Es el e"uivalente en DAO al tipo D$naset AdOpen+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 )naps!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.

$! piedad * cET%pe ?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 4ltimo 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 (cone5i n v+a ?nternet# por ejemplo) Los valores de la propiedad Lock<$pe pueden ser0 Ad* cE&eadOnl% Ad* cE$essi0istic /redeterminado. ) lo lectura\no puede modificar los datos 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. Blo"ueo optimista# registro a registro0 el proveedor usa blo"ueo optimista# blo"ueando registros s lo cuando llama al mtodo Opdate.

Ad* cEOpti0istic

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9-

Ad* cEBatcGOpti0istic de

Actuali(aciones optimistas por lotes0 re"uerido para el modo actuali(aci n por lotes como contraposici n al modo de actuali(aci n inmediata.

$! piedad Edit3 de ?ndica el estado de modificaci n del registro actual. Es solamente de lectura. Devuelve uno de las siguientes constantes0 AdEdit( ne AdEditIn$! ,!ess 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 Add3eD $ "ue el registro situado actualmente en el b4fer de copia es un nuevo registro "ue no se !a guardado en la base de datos. ?ndica "ue el registro actual se !a eliminado.

$! piedad #ilte! 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 7ilter puede descartar registros "ue no cumplan una determinada condici n. En realidad lo "ue !acemos mediante 7ilter es crear un nuevo =ecordset a partir de otro =ecordset. La propiedad 7ilter se utili(a tambin para actuar sobre determinados registros en varios mtodos del recordset (=es$nc# )ave# Z) pero no se va a e5plicar en este manual la e5plicaci 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 7ilter es crear un nuevo recordset E/or "u no creamos directamente el nuevo recordset utili(ando una sentencia )@L "ue lleve impl+cito ese filtroF /ersonalmente no me gusta utili(ar la propiedad 7ilter# $ prefiero crear un nuevo recordset. ,reo "ue solamente lo !e usado para rellenar un 1)67le5*rid con parte de los datos del recordset "ue uso en una parte de la aplicaci n. &eamos un ejemplo0 (1i,one5ion es una cone5i n $a creada) Dim =s?nicial As ADODB.=ecordset Dim =s7iltrado As ADODB.=ecordset )et =s?nicial C 3eD ADODB.=ecordset )et =s7iltrado C 3eD ADODB.=ecordset =s?nicial.Open RAutoresR# 1i,one5ion# adOpenD$namic# adLockOptimistic WEste es el recordset "ue uso para muc!as cosas dentro de la aplicaci n. A!ora "uiero presentar en un 1)67le5*rid solamente los datos de los autores de nacionalidad espaJola. 7iltro el recordset anterior utili(ando un criterio de igualdad de un campo0 3acionalidad =s7iltrado C =s?nicial.7ilter (K3acionalidad C WEspaJolaXM) WA!ora $a podemos aplicar este recordset al 1)67le5*rid0 )et 1)67le5*-.=ecordset C =s7iltrado W> cuando "ueremos presentar todos los autores# basta con poner la l+nea0 )et 1)67le5*-.=ecordset C =s?nicial

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 99

Este es el 4nico ejemplo "ue puedo sacar de todas mis aplicaciones. )eguro "ue el alumno va a ver m%s aplicaciones de esta propiedad. La propiedad #ilte! puede mostrar tambin a"uellos registros "ue !an sido manipulados recientemente# mediante las constantes siguientes0 Ad#ilte!( ne Ad#ilte!$endin,&ec !ds @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 a4n al servidor. Aplicable s lo para el modo de actuali(aci n por lotes. /ermite ver s lo los registros afectados por la 4ltima llamada Delete# =es$nc# OpdateBatc! o ,ancelBatc! /ermite ver los registros de la cac! actual# es decir# los resultados de la 4ltima llamada para recuperar registros de la base de datos /ermite ver los registros "ue fallaron en el 4ltimo intento de actuali(aci n por lotes.

Ad#ilte!A''ected&ec !ds a Ad#ilte!#etcGed&ec !ds Ad#ilte!C n'lictin,&ec !ds

$! piedad Inde? ?ndica el nombre del +ndice "ue se utili(a actualmente en el =ecordset. Es un )tring 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. 3o todos los proveedores de datos aceptan la propiedad ?nde5. /uede comprobarlo mediante el mtodo )upports. $! piedad 3a!sGalOpti ns Esta propiedad se usa cuando estamos trabajando con cu!s !es lad 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 Ad3a!sGalAll Ad3a!sGal3 di'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. $! piedad $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 -H. Esta propiedad pe!0ite determinar cu%ntos registros componen una p%gina l gica de datos. Al establecer un tamaJo de p%gina# puede utili(ar la propiedad A8s lute$a,e $ se mover% al primer registro de una p%gina espec+fica. Esto es 4til en las situaciones de servidor Veb cuando se desea permitir "ue el usuario pase p%ginas de datos $ vea cierto n4mero de

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9B

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. $! piedad $a,eC unt ?ndica cu%ntas p%ginas de datos contiene el objeto =ecordset. Es solamente de lectura. Devuelve un Long. )i el objeto &ec !dset no admite esta propiedad# el valor ser% N- para indicar "ue no se puede determinar el valor de $a,eC unt. $! piedad A8s lute$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$ s.nEn /n Ad$ sBO# Ad$ sEO# El objeto &ec !dset est% vac+o# la posici n actual se desconoce o el proveedor no admite la propiedad A8s lute$a,e. El puntero del registro actual est% al comien(o del arc!ivo (es decir# la propiedad BO# tiene el valor T!ue). El puntero del registro actual est% al final del arc!ivo (es decir# la propiedad EO# tiene el valor T!ue).

$! piedad &ec !dC unt ?ndica el n4mero 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. $! piedad + u!ce Devuelve la tabla# consulta o sentencia )@L utili(ado en el mtodo Open para crear el recordset. Es un )tring. $! piedad +tate ?ndica el estado (abierto# cerrado# proceso de ejecuci n) en el "ue se encuentra el recordset. Devuelve uno de los siguientes valores0 Desc!ipci@n &alor predeterminado. ?ndica "ue el objeto est% ad+tateCl sed cerrado. ad+tateOpen ?ndica "ue el objeto est% abierto. ?ndica "ue el objeto &ec !dset se est% ad+tateC nnectin, conectando. ?ndica "ue el objeto &ec !dset est% ejecutando ad+tateE?ecutin, un comando. ?ndica "ue se est% obteniendo el conjunto de filas ad+tate#etcGin, del objeto &ec !dset. /uede tener una combinaci n de valores. /or ejemplo# si se est% ejecutando una instrucci n# esta propiedad tendr% un valor combinado de ad+tateOpen $ ad+tateE?ecutin,. $! piedad +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. 3o es una propiedad "ue se use todos los d+as. &ea la a$uda para mas detalles. C nstante

$! piedades dinK0icas del 8Aet !ec !dset

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9.

Las propiedades anteriores se refieren a propiedades del recordset "ue se refieren a unas caracter+sticas propias del recordset una ve( creado. )on estas0 .ni>ue Ta8leJ .ni>ue +cGe0a % .ni>ue Catal , .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?3 .ni>ue +cGe0a indica el nombre del propietario de la tabla .ni>ue Catal , indica el nombre de la base de datos a la "ue pertenece la tabla. Estas dos 4ltimas propiedades deben tener un valor para poder poner valor a la propiedad .ni>ue Ta8le. Estas propiedades son tipo )tring Estas propiedades din%micas se ane5an a la colecci n $! pe!ties del objeto &ec !dset al asignar el valor ad.seClient a la propiedad ,ursor Location.

3Ct d s del 8Aet &ec !dset de ADO


3ETODO +upp !ts Este mtodo es mu$ 4til 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 1ove7irst# 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$ 4til !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/ AdApp! ?$ siti n AdB E0a!E /uede usar el mtodo Add3eD 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 1ove7irst $ 1ove/revious# $ los mtodos 1ove o *et=oDs 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 e5istentes. /uede usar actuali(aci n por lotes (mtodos OpdateBatc! $ ,ancelBatc!) para transmitir grupos de cambios al proveedor. /uede utili(ar la propiedad ?nde5 para dar nombre a un +ndice. /uede utili(ar el mtodo )eek para encontrar una fila en un =ecordset.

AdDelete AdM ld&ec !ds Ad3 -e$!e-i us Ad&es%nc Ad.pdate Ad.pdateBatcG AdInde? Ad+eeE

En este eAe0pl -e0 s la sinta?is de +upp !ts) ?f =s)eg.)upports(adAppro5/osition) C <rue <!en 1sgBo5 R)?R Else 1sgBo5 R3OR 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

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9P

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 )upports 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 AdOpen# !/a!dOnl% AdOpenLe%set AdOpenD%na0ic AdOpen+tatic 3inguna adBookmark# ad6old=ecords# ad1ove/revious# ad=es$nc Ad1ove/revious adBookmark# ad6old=ecords# ad1ove/revious# ad=es$nc

3Ct d Open
Es el mtodo "ue A%RE el recordset. Este mtodo es el "ue busca los registros "ue !an de rellenar el recordset. )inta5is. Esta es la sinta5is general0 Mi-ecordset.Open So#rceJ ActiveConnectionJ 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 )@L de la cual se obtienen los registros del =ecordset. ActiveConnection /Opcional1" Es el nombre de un objeto ,onnection abierto o una cadena de cone5i 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 &ec !dset. /uede ser una de las siguientes constantes AdOpen# !/a!dOnl% (/redeterminado) Abre un cursor de tipo s lo avance. AdOpenLe%set Abre un cursor de tipo conjunto de claves. AdOpenD%na0ic Abre un cursor de tipo din%mico. (?gual "ue el D$naset de DAO) AdOpen+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 &ec !dset. ,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* cE&eadOnl% Ad* cE$essi0istic (/redeterminado) ) lo lectura. 3o puede modificar los datos. Blo"ueo pesimista# registro a registro. El proveedor !ace lo necesario para asegurar una modificaci n correcta de los registros# normalmente blo"ueando registros en el origen de datos inmediatamente antes de la modificaci n. Blo"ueo optimista# registro a registro. El proveedor usa blo"ueooptimista# blo"ueando registros s lo cuando se llama mtodo Opdate.

Ad* cEOpti0istic al

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9L

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. AdC0dTe?t ?ndica "ue el proveedor debe evaluar So#rce como una definici n te5tual de un comando. AdC0dTa8le ?ndica "ue ADO debe generar una consulta )@L para devolver todaslas filas de la tabla nombrada en So#rce. AdC0dTa8leDi!ect ?ndica "ue el proveedor debe devolver todas las filas de la tabla nombrada en So#rce. AdC0d+t !ed$! c ?ndica "ue el proveedor debe evaluar So#rce como un procedimiento almacenado AdC0d.nEn /n ?ndica "ue el tipo de comando del argumento So#rce es desconocido. AdC0d#ile ?ndica "ue el &ec !dset 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%nc#etcG ?ndica "ue# tras alcan(ar la cantidad inicial especificada en la propiedad Initial #etcG +iIe# las filas restantes deben buscarse de forma as+ncrona. )i 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%nc#etcG( nBl cEin, ?ndica "ue el subproceso principal nunca se blo"uea durante la b4s"ueda. )i 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

Ad* cEBatcGOpti0istic

3et d &e>ue!%
Actuali(a los datos de un objeto =ecordset volviendo a ejecutar la consulta utili(ada para abrirlo. )e obtiene el mismo resultado "ue si se cerrara el recordset $ se volviera a abrir. )inta5is 1i=ecordset.&e>ue!% Opciones

Optiones Opcional. 1%scara de bits "ue indica opciones "ue afectan a esta operaci n. )i 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.

3Ct d &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 e5istentes 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

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.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 98

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

Los par%metros Field&ist $ (al#es son opcionales. En caso de ponerlos# 7ieldList 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. )iempre 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 3ombreDel=ecordsetY3ombredel,ampo C &alorDel,ampo 3ombreDel=ecordset(K3ombredel,ampoM) C &alorDel,ampo Esta segunda forma es necesaria cuando el nombre del campo tiene espacios. 3unca es recomendable poner espacios en los nombres de campos# pero en caso de "ue e5istan# debe optar por utili(ar la sinta5is segunda# con los parntesis $ comillas dobles. 3o siempre se puede utili(ar el mtodo Add3eD. /uede comprobar si se puede utili(ar# usando el mtodo +upp !ts visto anteriormente. El mtodo Add3eD convierte a este registro recin creado en registro actual. /ero este registro solamente e5iste en el recordset. /ara introducir los datos en la base de datos# (> por lo tanto en el disco duro) es necesario invocar el mtodo .pdate una ve( introducidos todos los valores de los campos "ue deseamos introducir. ,on alg4n tipo de cursor es necesario tambin utili(ar el mtodo &e>ue!% para poder acceder al registro recin creado. )i 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 .pdate para guardar los cambios. &ea m%s adelante los mtodos .pdate $ .pdateBatcG.

3Ct d .pdate
*uarda los cambios reali(ados en el registro actual de un objeto =ecordset. )e utili(a tanto para KrematarM una operaci n de creaci n de un registro iniciada con Add3eD# como para guardar los nuevos datos del registro actual (=ecuerde "ue en ADO no e5iste el mtodo Edit# tal como ocurr+a en DAO) . )inta5is NombreDel-ecordset..pdate FieldsJ (al#es En esta sinta5is# 7ields $ &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 Add3eD. &uelvo a recomendar lo anterior. /ara cambiar los valores de varios campos de un registro# nos colocaremos sobre ese registro# $ sin invocar ning4n mtodo# ejecutaremos este c digo 1i=ecordsetY,ampo- C &alor1i=ecordsetY,ampo9 C &alor9 ZZZ. 1i=ecordsetY,ampo3 C &alor3 1i=ecordset..pdate /ero en ADO pasa una cosa "ue no pasaba en DAO. )i cambiamos de registro una ve( modificado el valor de un registro# ADO invoca autom%ticamente el mtodo .pdate. /or lo tanto# el c digo siguiente0 1i=ecordsetY,ampo- C &alor-

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9G

1i=ecordsetY,ampo9 C &alor9 ZZZ. 1i=ecordsetY,ampo3 C &alor3 <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. 6ace lo mismo "ue cuando tenemos unos controles enla(ados a datos mediante un control Data. )i una ve( "ue ejecutamos una l+nea tal como esta 1i=ecordsetY,ampo- C &alor@ueremos "ue ese nuevo valor no entre en la base de datos# debemos cancelarlo mediante el mtodo Cancel.pdate.

3Ct d .pdateBatcG
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 ()i el valor &oc'T$pe se !a puesto a Ad* cEBatcGOpti0istic) +inta?is 1i=ecordset..pdateBatcG Affect-ecords

AffectRecords ,onstante "ue determina a cu%ntos registros afectar% el mtodo .pdateBatcG. /uede tomar uno de los siguientes valores. AdA''ectCu!!ent AdA''ectG! up AdA''ectAll Escribe solamente los cambios pendientes en el registro actual. Escribe los cambios pendientes "ue cumplen el valor de la propiedad 7ilter. (/redeterminado) Escribe los cambios pendientes en todos los registros del objeto &ec !dset.

3Ct d Cancel
,ancela la ejecuci n del mtodo Open. +inta?is NombreDel-ecordset.Cancel

El mtodo ,ancel solamente puede usarse si el mtodo Open fue invocado con la opci n adAs%ncC nnect# adAs%ncE?ecute o adAs%nc#etcG.

3Ct d 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

3Ct d Cancel.pdate
6ab+amos visto m%s atr%s "ue el ADO no e5iste el mtodo Edit. /ara modificar un registro basta con poner una instrucci n tal como esta0 1i=ecordsetY1i,ampo C 1i3uevo&alor > a continuaci n rematar la operaci n mediante el mtodo Opdate 1i=ecordset.Opdate

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina 9I

)i 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. )inta5is 1i=ecordset.Cancel.pdate

-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.

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

3Ct d Cl ne
,rea un objeto =ecordset duplicado a partir de un objeto &ec !dset e5istente. Opcionalmente# puede especificarse "ue el nuevo recordset sea solamente de lectura +inta?is +et rstDuplicate C rstOriginal.Cl ne (!ocE= pe)

(El objeto rstDuplicate debe estar declarado previamente como objeto ADODB.=ecordset) Lock<$pe puede tomar uno de los siguientes valores0 Ad* cE.nspeci'ied Ad* cE&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.

3Ct d 3 -e
1ueve la posici n del registro actual de un objeto =ecordset . )inta5is 1i=recordset.3 -e Num-ecords# +tart N#mRecords ,n %alor Long con signo "ue especifica el n4mero 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 +t!in, o Va!iant cu$o resultado sea un marcador del tipo Bookmark. /uede utili(ar tambin una de las siguientes constantes0 AdB AdB AdB E0a!ECu!!ent (/redeterminado) ,uenta a partir del registro actual E0a!E#i!st ,uenta a partir del primer registro E0a!E*ast ,uenta a partir del 4ltimo registro

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina BH

3Ct d s 3 -e#i!stJ 3 -e*astJ 3 -e(e?t % 3 -e$!e-i us


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

3Ct d #ind
Busca el primer registro del recordset "ue satisfaga los criterios especificados en el criterio de b4s"ueda. )i se cumple el criterio de b4s"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.#ind /criterio, +Eip-o;s, searc)Direction, start1

criterio Es el criterio de b4s"ueda. /or ejemplo K/ais C 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 n4mero de registros a partir del registro actual donde debe empe(ar la b4s"ueda. searc+Direction )Opcional* On valor "ue especifica si la b4s"ueda se reali(a en direcci n al final del recordset (ad+ea!cG# !/a!d) o en direcci n !acia el principio del recordset (ad+ea!cGBacE/a!d). La b4s"ueda termina al final o al principio del recordset# dependiendo del valor de searc+Direction. start la b4s"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# RCR# R]CR # R^CR# R^]R (distinto de) o RliEeR (coincidencia parcial de cadenas). El valor de comparaci n puede ser una cadena# un n4mero en coma flotante o una fec!a. Los valores de cadena est%n delimitados con comillas sencillas (por ejemplo# R/ais C QEspaJaQR). Los valores de fec!a est%n delimitados con signos RPR $ con formato mm2dd2$$ (por ejemplo# R 'ecGa=inicial N PQRSSRTQPR). )i el operador de comparaci3n es RliEeR# el %alor de la cadena puede contener los caracteres comod+n RUR o R=R. (7uncionan de forma idntica# sustitu$endo a cual"uier sucesi n de caracteres.) 3o acepta el car%cter KFM (/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.

3Ct d +a-e
Este mtodo permite guardar el contenido de un &ec !dset en un fic!ero. /uede ser mu$ 4til cuando "ueremos e5portar ese recordset !acia otra aplicaci n. +inta?is 1i=ecordset.+a-e FileName, *ersistFormat

FileName es la ruta completa del fic!ero en el "ue se guardar% el &ec !dset. PersistFormat /Opcional). On valor "ue especifica el formato en "ue se guardar% el =ecordset. /uede ser una de las constantes siguientes. Ad$e!sistADTG (&alor predeterminado) )e guarda en un formato propietario (Advanced Data <ablegram). 3o es inteligible a simple vista# pero genera fic!eros bastante cortos. )e guarda en formato A1L. Es un formato puramente en donde pueden verse los nombres de los campos $ su

AAd$e!sistX3* A),??

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina B-

contenido. Este formato genera fic!eros m%s grandes "ue el AD< )i el recordset tienen aplicado un filtro (1ediante la propiedad 7ilter) solamente guarda los registros "ue deja ver ese filtro. )i $a e5iste el fic!ero le dar% un error. ,erci rese "ue no e5iste (1ediante la funci n Dir) $ b rrelo antes de volver a utili(ar el mtodo )ave.

3Ct d +eeE
Este mtodo busca un registro despla(%ndose por el recordset a lo largo de un +ndice o un conjunto de +ndices. La b4s"ueda mediante )eek es muc!o m%s r%pida "ue con 7ind# $a "ue la reali(a siguiendo el ordenamiento de los registros seg4n un +ndice. /ara poder usar el mtodo ?nde5 es necesario "ue el proveedor acepte +ndices en el objeto recordset. Esto !a llevado al autor a no poder presentar ning4n 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 )upports0 ?f 1i=ecordset-.)upports(ad?nde5) C <rue <!en &ea la a$uda de &B para ma$or informaci n

3Ct d (e?t&ec !dset


/ara entender este mtodo es necesario e5plicar previamente como se puede crear un recordset compuesto. On recordset compuesto es un recordset "ue se crea concatenando sentencias )ELE,<# $ 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 )ELE,<. 1ediante el mtodo (e?t&ec !dset podemos ir avan(ando a travs de los siguientes recordsets particulares. El car%cter de separaci n entre las sentencias )ELE,< es el punto $ coma ( ' ) 1i=ecordset-.Open R)elect ; 7rom =egimenes' )elect ; 7rom =egimenT)eguimiento V!ere =sTOrigen C QL)BQR# 1i,one5ionADO# 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 )ELE,<. ,uando se ejecuta esa l+nea# el recordset actual es el correspondiente a la primera selecci n. ()elect ; 7rom =egimenes). Ejecutando el mtodo 3e5t=ecordset ese recordset primero se borra $ pasa a ser recordset actual el creado con la selecci n segunda ()elect ; 7rom =egimenT)eguimiento V!ere =sTOrigen C QL)BQR) )et 1i=ecordset- C 1i=ecordset-.3e5t=ecordset /uede usar tambin este recordset para crear un nuevo recordset a partir del primero )et 1i=ecordset9 C 1i=ecordset-.3e5t=ecordset 1i=ecordset9 debe estar declarado como objeto recordset# $ creado con la instrucci n 3eD0 )et 1i=ecordset9 C 3eD ADOBD.=ecodset

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina B9

*a c lecci@n #ields de un !ec !dset ADO


,ontiene todos los objetos #ield de un objeto &ec !dset.

On objeto &ec !dset tiene una colecci n #ields "ue contiene todos los objetos #ield. ,ada objeto #ield se corresponde a una columna del &ec !dset. &amos a ver a"u+ un truco "ue nos permite ADO. /odemos crear un recordset _)in necesidad de una base de datosY ,uando estudiamos el objeto recordset vimos "ue el recordset se crea con una instrucci n como esta0 )et 1i=ecordset- C 3eD 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-.Open R)elect ; 7rom =egimenesR# 1i,one5ionADO# 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. E@u pasar+a si en ve( de abrir el recordset le vamos aJadiendo objetos 7ield a su colecci n 7ieldsF Lo !acemos mediante el mtodo Append0 1i=ecordset-.7ields.Append R1i,ampo-R# adBig?nt 1i=ecordset-.7ields.Append R1i,ampo9R# ad,!ar# 9P 1i=ecordset-.7ields.Append R1i,ampoBR# adB)<= Lo "ue ocurre es "ue el recordset $a tiene tres campos# el primero de nombre 1i,ampo-# numrico Long# el segundo# un string de 9P caracteres de nombre 1i,ampo9# $ el tercero# de nombre 1i,ampoB# 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. 3o es necesario por lo tanto "ue e5ista una tabla o consulta almacenada con esa estructura. A!ora podemos abrir el recordset0 1i=ecordset-.Open Lo abrimos sin pasarle ning4n 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-.Add3eD 1i=ecordset-Y1i,ampo- C B. 1i=ecordset-Y1i,ampo9 C R*u+a del EstudianteR 1i=ecordset-Y1i,ampoB C R6ola 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 1ove5555. A!ora podremos leer el contenido del registro actual0 Label- C 1i=ecordset-Y1i,ampoLabel9 C 1i=ecordset-Y1i,ampo9 LabelB C 1i=ecordset-Y1i,ampoB El resultado del c digo de el ejemplo se traducir% en algo como esto0

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina BB

> a!ora vienen lo mejor. E/ara "ue "ueremos un recordset "ue no tienen datos le+dos desde una base de datosF 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 7ields

3Ct d Append
Agrega un campo a una colecci n 7ields de un =ecoprdset. )inta5is 1i=ecordset.7ields.Append Name, = pe, Defined+ize, Attrib

Name On )tring con el nombre del nuevo objeto #ield# "ue tiene "ue ser 4nico dentro de la colecc n 7ields. T$pe <ipo de datos "ue va a contener ese campo. /uede tomar uno de estos valores0 )e 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 G b$tes (DB<>/ET?G). On valor binario (DB<>/ETB><E)). On valor Boolean (DB<>/ETBOOL). )e 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>=E7). Ona cadena de caracteres terminada en nulo (Onicode) (DB<>/ETB)<=). On valor de tipo +t!in, (DB<>/ET)<=). On valor de tipo Cu!!enc% (DB<>/ET,>). On valor Cu!!enc% es un n4mero de coma fija con cuatro d+gitos a la derec!a del signo decimal. )e almacena en un entero con signo de G b$tes en escala de -H.HHH. On valor de tipo Date (DB<>/ETDA<E). On valor Date se almacena como un valor de tipo D u8le' la parte entera es el n4mero de d+as transcurridos desde el BH de diciembre de -GII $ 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<?1E)<A1/). On valor numrico e5acto con una precisi n $ una escala fijas (DB<>/ETDE,?1AL). On valor de coma flotante de doble precisi n (DB<>/ET=G). 3o se !a especificado ning4n valor (DB<>/ETE1/<>). On c digo de error de B9 bits (DB<>/ETE==O=). On identificador 4nico global (*O?D) (DB<>/ET*O?D). On puntero a una interfa( IdispatcG de un objeto OLE (DB<>/ET?D?)/A<,6). On entero firmado de . b$tes (DB<>/ET?.).

adA!!a% adBi,Int adBina!% adB lean adB%&e' adB+T& adCGa! adCu!!enc%

adDate adDBDate adDBTi0e adDBTi0e+ta0p adDeci0al adD u8le adE0pt% adE!! ! adG.ID adIDispatcG adInte,e!

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina B.

adI.nEn /n ad* n,Va!Bina!% ad* n,Va!CGa! ad* n,Va!DCGa! ad(u0e!ic ad+in,le ad+0allInt adTin%Int ad.nsi,nedBi,Int ad.nsi,nedInt ad.nsi,ned+0allInt ad.nsi,nedTin%Int ad.se!De'ined adVa!Bina!% adVa!CGa! adVa!iant adVect ! adVa!DCGa! adDCGa!

On puntero a una interfa( IunEn /n de un objeto OLE (DB<>/ET?O3`3OV3). On valor binario largo (s lo para el objeto $a!a0ete!). On valor largo de tipo +t!in, (s lo para el objeto $a!a0ete!). On valor largo de tipo +t!in, terminado en nulo (s lo para el objeto $a!a0ete!). On valor numrico e5acto con una precisi n $ una escala e5actas (DB<>/ET3O1E=?,). On valor de coma flotante de simple precisi n (DB<>/ET=.). On entero con signo de 9 b$tes (DB<>/ET?9). On entero con signo de - b$te (DB<>/ET?-). On entero sin signo de G b$tes (DB<>/ETO?G). On entero sin signo de . b$tes (DB<>/ETO?.). On entero sin signo de 9 b$tes (DB<>/ETO?9). 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 $a!a0ete!). On valor de tipo +t!in, (s lo para el objeto $a!a0ete!). On tipo Va!iant de automati(aci n (DB<>/ET&A=?A3<). )e 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 $a!a0ete!). Ona cadena de caracteres Onicode terminada en nulo (DB<>/ETV)<=).

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 e5pl+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 ning4n valor significativo e5cepto la identificaci n de la fila (como por ejemplo un n4mero de registro# un identificador 4nico# etc.). ?ndica "ue el campo contiene alg4n 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 efect4an en dic!a memoria .

ad#ld3a%De'e! ad#ld.pdata8le ad#ld.nEn /n.pdata8le ad#ld#i?ed ad#ldIs(ulla8le ad#ld3a%Be(ull ad#ld* n, ad#ld& /ID ad#ld& /Ve!si n ad#ldCacGeDe'e!!ed

3Ct d Delete
<e ricamente elimina un objeto de la colecci n #ields.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina BP

)inta5is

7ields.Delete Field

Field On Va!iant "ue designa el objeto #ield "ue se va a eliminar. Este par%metro tiene "ue ser el nombre del objeto #ield' no puede ser una posici n ordinal o el propio objeto #ield. C 0enta!i s La llamada al mtodo #ields.Delete en un &ec !dset 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

3Ct d Ite0
)inta5is 1i=ecordset.7ields.Ite0 (?nde5)

Devuelve el elemento de la colecci n #ields 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 ,omboBo5 llamado ,ombo,ampos Dim 11 As )tring# ? As ?nteger 7or ? C H <o 1i=ecordset-.7ields.,ount N 11 C 1i=ecordset-.7ields.?tem(?).3ame ,ombo,ampos.Add?tem 11 3e5t ?

3Ct d &e'!esG
Aun"ue la colecci n 7ields tiene este mtodo# la verdad es "ue no tienen efectos visibles sobre esa colecci n.

$! piedades de la c lecci@n #ields $! piedad C unt


Devuelve el n4mero de campos de la colecci n #ields. Es un Long.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina BL

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina B8

El O8Aet

C 00and

On objeto C 00and 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 C 00and 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. $! piedades del O8Aet C 00and $! piedad Acti-eC nnecti n ?ndica a "u objeto ,onnection pertenece actualmente el objeto ,ommand. Es un string con el nombre de la cone5i n. $! piedad C 00andTe?t ,ontiene el te5to del comando "ue se "uiere emitir al proveedor. Es un string. )uele ser una instrucci n )@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. $! piedad C 00andTi0e ut 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 BH. $! piedad C 00andT%pe (?1/O=<A3<E)

?ndica el tipo de un objeto ,ommand. Esta propiedad se usa para optimi(ar la evaluaci n de la propiedad C 00andTe?t# $a "ue de esta forma el proveedor no tiene "ue perder tiempo e5aminando si es una instrucci n )@L# un procedimiento almacenado o un nombre de tabla. )i el valor de esta propiedad es adC0d.nEn /n (valor predeterminado)# estamos for(ando al proveedor a "ue realice esa investigaci n lo "ue provocar% probablemente un descenso en su rendimiento. )i sabe "u tipo de comando est% usando# el establecimiento de la propiedad C 00andT%pe instru$e a ADO a "ue va$a directamente al c digo relevante. )i la propiedad C 00andT%pe no coincide con el tipo de comando de la propiedad C 00andTe?t# ocurre un error cuando llama al mtodo E5ecute. &alores posibles AdC0dTe?t un AdC0dTa8le AdC0dTa8leDi!ect AdC0d+t !ed$! c AdC0d.nEn /n AdC0d#ile ?ndica "ue es una definici n te5tual 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 )@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 C 00andTe?t es desconocido. Eval4a C 00andTe?t como el nombre de arc!ivo de un valor =ecordset persistente.

AdE?ecute( &ec !ds ?ndica "ue es un comando o un procedimiento almacenado "ue no devuelve filas (por ejemplo# un comando "ue s lo inserta datos). )i se recupera alguna fila# se descarta $ no se devuelve. )iempre se combina con adC0dTe?t o adC0d+t !ed$! c.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina BG

$! piedad $!epa!ed 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<e5t 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. )i el proveedor no admite la preparaci n del comando# puede devolver un error cuando esta propiedad se estable(ca a T!ue. )i no devuelve un error# simplemente ignora la solicitud de preparar el comando $ establece la propiedad $!epa!ed a #alse. $! piedad +tate Describe el estado del objeto0 abierto o cerrado. Devuelve un Long o una constante0 ad+tateCl sed o ad+tateOpen

3Ct d s del O8Aet C 00and


3Ct d E?ecute (?1/O=<A3<E# m%s bien dir+amos# el objetivo del ,ommand)

Ejecuta la consulta# la instrucci n )@L o el procedimiento almacenado especificado en la propiedad ,ommand<e5t. Devuelve un recordset o modifica la base de datos. )inta5is /ara un C 00and "ue devuelva filas0 +et recordset C command.E?ecute(RecordsAffected# Parameters# Options* /ara un C 00and "ue no devuelva filas0 command.E?ecute RecordsAffected# Parameters# Options command es el nombre del Objeto ,ommand RecordsAffected Opcional. Ona variable * n, en la "ue el proveedor devuelve el n4mero de registros afectados por la operaci n. Parameters Opcional. Ona matri( Va!iant con los valores de los par%metros pasados con una instrucci n )@L. (Los par%metros de salida no devuelven valores correctos cuando se pasan en este argumento). Options Opcional. On valor * n, o una constante. Acepta estos valores adC0dTe?t ?ndica "ue el proveedor tiene "ue evaluar &ommand=e2t como definici n te5tual de un comando# como una instrucci n )@L. adC0dTa8le ?ndica "ue ADO tiene "ue generar una consulta )@L para devolver todas las filas de la tabla mencionada en &ommand=e2t. adC0dTa8leDi!ect ?ndica "ue el proveedor tiene "ue devolver todas las filas de la tabla mencionada en &ommand=e2t. AdC0d+t !ed$! c ?ndica "ue el proveedor tiene "ue evaluar &ommand=e2t como procedimiento almacenado. adC0d.nEn /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%nc#etcG ?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. 3Ct d Cancel ,ancela la ejecuci n de una llamada as+ncrona pendiente al mtodo E?ecute

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina BI

)inta5is

3ombredelObjeto,ommand.Cancel

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%nc#etcG). C 0and s pa!a0et!iIad s. Los objetos ,ommand pueden utili(ar par%metros. De esta forma# podemos construir una consulta utili(ando la interrogaci n (F) 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 c 00and. 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 pa!a0ete!.

EAe0pl de la utiliIaci@n de C 00and


&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 n4mero m%s alto del documento para poner al nuevo documento un n4mero igual al 4ltimo a -.0 Declaraciones Dim ,one5BD/rensa As ADODB.,onnection Dim =sBD/rensa- As ADODB.=ecordset Dim )tr?ntroducir As )tring# 3umeroDocumento as long =em )e abre un objeto ,onnection para crear sobre l el recordset )et ,one5BD/rensa C 3eD ADODB.,onnection ,one5BD/rensa.,onnection)tring C R/roviderC1)DAO=A.-'M U T KOser ?DC?3<=A3E<'/assDordC?3<=A3E<'Data )ourceCintranet'M U T K/ersist )ecurit$ ?nfoC7alseR ,one5BD/rensa.Open =em )e abre un recordset para leer el n4mero# se lee $ se vuelve a cerrar =sBD/rensa-.Open R?ntTDocumentos Order B$ ,LTDO,R# ,one5BD/rensa# adOpenD$namic# adLockOptimistic =sBD/rensa-.1oveLast 3umeroDocumento C =sBD/rensa-Y,LTDO, 3umeroDocumento C 3umeroDocumento a =sBD/rensa-.,lose (; Este es el punto donde cambia el c digo "ue ver% m%s adelante) =em )e introduce en una variable tipo )tring una instrucci n para aJadir un nuevo registro =em Esa instrucci n se va a ejecutar desde el objeto ,onnection mediante su mtodo E5ecute )tr?ntroducir C R?nsert ?nto ?3<TDO,O1E3<O) R U T R(,LTDO,#3O1TDO,#<?<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD/<TDO,#M U T K,LT<?/OTDO,#7?,6TDO,#7E,6ATE1?)?O3TDO,#OL<?1AT6O=ATDO,#M U T &?)?BLETDO,) &alues (R U 3umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U T RQ#QR U <b<itulo.<ag U RQ#-I#9#-#QR U 6=ef/rensa U R2R U <b3omb7ic!<?7 U RQ#QR U Date U RQ#H#-)R =em Observe "ue los valores tipo string introducidos (<bAAA) van entre comilla simple =em )e ejecuta esa instrucci n desde el objeto ,onnection ,one5BD/rensa

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina .H

,one5BD/rensa.E5ecute )tr?ntroducir =em )e cierra el Objeto ,onnection ,one5BD/rensa.,lose =em A"u+ termina la operaci n de crear un nuevo registro 1sgBo5 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. )e introduce un nuevo registro en la tabla ?3<TDO,O1E3<O). El resumen de prensa es un fic!ero .<iff de nombre <b3omb7ic!<?7 "ue se mete en una carpeta del servidor mediante 7</# $ 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,# 3O1TDO, <?<OLOTDO, AO<O=TDO, ,LT<E1ATDO, ,LTD/<TDO, ,LT<?/OTDO, 7?,6TDO, &alor

3umeroDocumento (Long calculado) <b<itulo ()tring contenido en <b<itulo.<e5t) <b<itulo ()tring contenido en <b<itulo.<e5t [ se repiteN) <b<itulo.<ag ()tring contenido en <b<itulo.<ag) -I (?nteger# dato fijo) 9 (?nteger# dato fijo) (?nteger# dato fijo) 6=ef/rensa U R2R U <b3omb7ic!<?7 On string "ue indica el nombre del fic!ero (<b3omb7ic!<?7.<e5t) $ su carpeta (&ariable 6ref/rensa) 7E,6ATE1?)?O3TDO, Date (7ec!a actual) OL<?1AT6O=ATDO, H (B$te# dato fijo) &?)?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. E5ige 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 Add3eD. <iene la gran ventaja de "ue la acepta cual"uier base de datos# independientemente de donde est el cursor. 6abr% 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 C 00and# (@ue pertenece al mismo objeto ,onnection sobre el "ue a!ora !emos ejecutado el E5ecute) $ vamos a ejecutar el E5ecute 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 )et 1i,omando C 3eD ADODB.,ommand 1i,omando.Active,onnection C ,one5BD/rensa 1i,omando.,ommand<e5t C R?nsert ?nto ?3<TDO,O1E3<O) R T U R(,LTDO,#3O1TDO,#<?<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD/<TDO,#,LT<?/ OTDO,#7?,6TDO,#7E,6ATE1?)?O3TDO,#OL<?1AT6O=ATDO,#&?)?BLETDO,) R T U R&alues (R T U 3umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U RQ#QR U <b<itulo.<ag U RQ#-I#9#-#QR U 6=ef/rensa U R2R U <b3omb7ic!<?7 U RQ#QR U Date U RQ#H#-)R 1i,omando.E5ecute ,one5BD/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.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina .-

EEntonces# para "ue e5isteF 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. 3o se preocupe de no ser estrictamente acadmico. Este !umilde autor nunca usa ,ommand e5cepto para e5plicarlo. ADO nos permite eso. &amos a ver a!ora c mo !ar+amos esto mismo con el mtodo Add3eD. Deberemos crear un recordset. Lo primero# lo declaramos0 Dim =sBD/rensa as ADODB.=ecodset Luego lo creamos0 )et =sBD/rensa C 3eD 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. )i el cursor est% de lado servidor es posible "ue no nos deje usar el mtodo Add3eD. (&ea 3ota -) ,one5BD/rensa.,ursorLocation C adOse,lient Abrimos el =ecordset0 =sBD/rensa.Open R?ntTDocumentosR# ,one5BD/rensa# adOpenD$namic# adLockOptimistic Ejecutamos el mtodo Add3eD =sBD/rensa.Add3eD 1etemos los datos =sBD/rensaY,LTDO, C 3umeroDocumento =sBD/rensaY3O1TDO, C <b<itulo =sBD/rensaY<?<OLOTDO, C <b<itulo =sBD/rensaYAO<O=TDO, C <b<itulo.<ag =sBD/rensaY,LT<E1ATDO, C -I =sBD/rensaY7E,6ATE1?)?O3TDO, C Date =sBD/rensaY,LTD/<TDO, C 9 =sBD/rensaY,LT<?/OTDO, C =sBD/rensaY7?,6TDO, C 6=ef/rensa U R2R U <b3omb7ic!<?7 =sBD/rensaY&?)?BLETDO, C =sBD/rensaYOL<?1AT6O=ATDO, C H =ematamos con el mtodo Opdate =sBD/rensa.Opdate ,erramos el recordset. =sBD/rensa.,lose ,erramos la cone5i n ,one5BD/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

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina .9

El VC nt! l DataW de ADO - (Ad dc ADO Data C nt! l)


Este cap+tulo parece "ue "uedaba un poco corto. 3o por el n4mero de p%ginas# sino por"ue tanto en DAO como en =DO nos e5pla$amos con el control Data# $ en ADO parece "ue solamente lo !emos visto de pasada para e5plicar c mo se compone la cadena de cone5i n. &e%moslo un poco m%s en profundidad. El control Data para ADO es el V3ic! s 't ADO data c nt! l X.6 (O*EDB)W "ue se encuentra en /ro$ecto c ,omponentes. La apariencia es similar a la del Data de DAO

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

$! piedad BO#Acti n.
Establece la forma de proceder cuando llega a la fila anterior a la primera. <oma uno de estos valores0 H [ adDo1ove7irst - [ adDo)ta$BO7 &uelve a la primera fila /ermanece en la fila BO7

$! piedad C 00andT%pe
Es idntica a la misma propiedad del objeto ,ommand. Acepta los valores0 AdC0dTe?t un AdC0dTa8le AdC0d+t !ed$! c AdC0d.nEn /n ?ndica "ue es una definici n te5tual 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 )@L generada internamente. ?ndica "ue es un nombre de procedimiento almacenado /redeterminado. El tipo de comando de la propiedad C 00andTe?t es desconocido.

$! piedad C nnecti n+t!in,


Esta propiedad $a le !emos visto m%s atr%s. Es la cadena de cone5i n con la base de datos.

$! piedad Cu!s !* cati n


Es la misma "ue la vista para el objeto =ecordset.

$! piedad Cu!s !T%pe


Es la misma "ue para el objeto =ecordset. Acepta los valores0 - [ adOpen`e$set 9 N adOpenD$namic B [ adOpen)tatic

$! piedad EO#Acti n

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina .B

Establece la forma de proceder cuando llega a la fila EO7. Acepta los valores0 H [ adDo1oveLast - [ ad)ta$EO7 9 [ adDoAdd3eD $! piedad * cET%pe <ipo de Blo"ue. ?gual a la misma propiedad del Objeto =ecordset &uelve a la 4ltima fila /ermanece en la fila EO7 AJade una nueva fila

$! piedad 3a?&ec !ds


Es similar a la del Objeto =ecordset. Establece el n4mero de filas "ue obtiene en su recordset asociado.

$! piedad 3 de.
?gual a la misma propiedad del objeto =ecordset

$! piedades $ass/ !d
Establece la contraseJa para crear la cadena de cone5i 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. )i se pretende leer da error.

$! piedad .se!(a0e
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 /assDord debe ser el asociado a este usuario.

$! piedad &ec !d+ u!ce


Es una cadena de caracteres con el nombre de una tabla o una sentencia )@L "ue devuelve filas.

3Ct d s del c nt! l Ad dc .pdateC nt! ls


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

&e'!esG
&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

#unci na0ient del Ad dc


El Adodc puede enla(ar una base de datos a los t+picos controles enla(ados (Label# <e5tBo5) 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.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina ..

,ontrol DB*rid Data*rid DataList Data,ombo DBList DB,ombo 1)7le5*rid 1)67le5*rid

ADO 3O )? )? )? )? )? 3O )?

=DO )? 3O )? )? )? )? )? 3O

DAO )? 3O )? )? )? )? )? 3O

=eferencia 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft 1icrosoft Data Bound *rid ,ontrol P.H )/B Data*rid ,ontrol L.H (OLEDB) Data List ,ontrols L.H (OLEDB) Data List ,ontrols L.H (OLEDB) Data Bound List ,ontrols L.H Data Bound List ,ontrols L.H 7le5*rid ,ontrol L.H 6ierarc!ical 7le5*rid ,ontrol L.H (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# 4sela 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 5imo cap+tulo ver% como se enla(an un cliente con el servidor )@L )erver. 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. )uerte.

Agradecimientos. En este captulo particip activamente mi alumno del CEU Csar Moreno Fernndez.

L)B

&isual Basic *u+a del Estudiante

,ap+tulo -.

/%gina .P

Das könnte Ihnen auch gefallen