Está en la página 1de 45

Visual Basic - Gua del Estudiante

ACTIVE X DATA OBJECT (ADO)


ADO es lo ltimo de Microsoft en acceso a bases de datos. No se porqu, pero desde su inicio,
ADO est como metido en una aureola de dificultad a la que solamente pueden acceder
informticos especialmente elegidos. Quizs sea el uso de palabras de argot mu rebuscadas,
que ms que facilitar el estudio, atemorizan al principiante. !a "u#a del $studiante pretende
quitar esos %elos que ocultan la sencillez de lo cotidiano mostrar la facilidad de esta tcnica.
&on el estilo didctico que caracteriza a este libro, pasaremos de las definiciones gloriosas e
iremos a lo %erdaderamente importante' saber programar con ADO
ADO permite crear aplicaciones capaces de manipular bases de datos a travs de un
proveedor OLE DB (Object Linking and Embedding for DataBase). El objetivo de OLE DB es
poner a disposicin 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
electrnico# 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.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/
A
p
l
i
c
a
c
i

n

q
u
e

a
c
c
e
d
e

a

l
o
s

d
a
t
o
s
D
A
O
R
D
O
Modelo DAO/RDO
A
D
O
Modelo de datos ADO
O
L
E
D
B
O
D
B
C
O
D
B
C
Bases de datos
Relacionales
Texto
Bases de datos
relacionales
Las caracter.sticas generales de ADO son0
1a$or velocidad $ facilidad de uso.
1enor carga de memoria $ de espacio en el disco duro.
Las caracter.sticas espec.ficas "ue proporciona ADO para entornos de ,liente23ervidor (,23)
son0
,reacin de los objetos de forma independiente. 4o se necesita navegar por ninguna
jerar"u.a de objetos para poder crearlos. La ma$or.a de los objetos se pueden
instanciar de forma independiente. De esta forma crearemos solo los objetos "ue
necesitemos.
ADO nos permite utili(ar los procedimientos almacenados en el sistema gestor de la
base de datos (si este soporta esta funcionalidad)# pudiendo recoger los resultados
devueltos por dic!os procedimientos como par%metros de salida. Esta caracter.stica
permite mejorar el rendimiento $ la rapide( de las aplicaciones.
Diferentes tipos de cursores.
3oporte para limitar el n5mero m%6imo de registros devueltos de una sola ve( en un
recordset. Esta caracter.stica mejora el rendimiento tanto de la aplicacin como de la
red.
3oporte para recibir varios recordset como resultados devueltos de un procedimiento
almacenado.
7a$ "ue tener en cuenta "ue todas estas caracter.sticas est%n limitadas por el servidor de los
datos. Es decir# si el servidor de datos no soporta procedimientos almacenados# no podremos
utili(ar con l las caracter.sticas de ADO "ue se refieren a dic!os tipos de procedimientos.
8ig 9:./ *erar"u.a de Objetos ADO.
; <odos los objetos marcados con un asterisco contienen la coleccin +roperties con un
subconjunto de objetos +ropert$.
,omo puede verse en la figura# e6isten tres objetos principales dentro de ADO0 El objeto
,onnection# el objeto ,ommand $ el objeto recordset. Luego veremos algunas de las
caracter.sticas principales de cada uno de estos objetos.
Antes de proseguir con estos objetos vamos a e6plicar donde $ por"u se deben utili(ar
objetos ADO en ve( de objetos DAO u objetos =DO
7asta a!ora !ab.amos utili(ado bases de datos Access# $ tambin otras bases de datos
sencillas como dBase. Acceder a Access es e6tremadamente f%cil. > ello es debido a "ue
Access es una base de datos sin grandes aspiraciones en cuanto a seguridad. Es una gran
base de datos# $ tiene sus dispositivos de seguridad en cuanto a permisos de acceso (&ea El
dbEngine. &isin desde DAO $ la propiedad 3$stemDB en el ,ap.tulo /:) sin embargo estas
posibilidades se usan en mu$ pocas ocasiones# $ estos mecanismos de seguridad de Access
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:
,onnection
;
Errors Error
*
Command
*
Parameters Parameter
*
=ecordset
;
ields ield
*
Properties
Propert!
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 operacin. 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 direccin )+ del servidor.
,uando "ueremos empe(ar a tener una seguridad en los accesos# disponer de privilegios
distintos para cada usuario# trabajar en una red de %rea local con muc!os usuarios# !a$ "ue
recurrir a bases de datos tipo Oracle o 3?L3erver. >a empe(amos a tener problemas0 &isual
Basic no puede acceder directamente a abrir estas bases de datos. +odemos acceder a travs
de ODB,# pero como $a se dijo en el# cap.tulo correspondiente# ODB, se !a "uedado
obsoleto. > 1icrosoft !a sacado para ello ADO. > ADO permite abrir la base de datos usando
para ello un dispositivo intermedio "ue es el proveedor OLE DB. Este no es m%s "ue una DLL.
1ejor dic!o# un juego de DLLs "ue puede ver en la carpeta0
&'(Arc)i%os de *rograma(Arc)i%os &omunes(+stem(Ado
Estas DLLs permiten conectar con las bases de datos m%s conocidas (Oracle# 3?L3erver#
Access $ las dem%s BD controladas por el motor *et). ADO funciona de forma diferente a
ODB,. ,on ODB, se preparan cone6iones permanentes en el ordenador# $ cual"uier
programa puede acceder a la BD a travs de esas cone6iones. ,on ADO no !a$ "ue preparar
previamente ninguna cone6in. 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 cone6in $ abra la
BD. 3i !ubiese dos programas ejecut%ndose simult%neamente $ accediendo a la misma base
de datos a travs de ADO# cada programa prepara una cone6in a esa BD. En ODB,
podr.amos ver las cone6iones e6istentes en el +, a travs del +anel de Control | Fuentes de
Datos ODBC. En ADO no e6iste esa posibilidad $a "ue# como se !a dic!o# es el propio
programa "uien crea esa cone6in al ajecutarse.
+ara "ue &B pueda acceder a ADO es necesario introducir en el programa la referencia a
1icrosoft Active@ Data Objets :./ Librar$ (ro!ecto|"e#erencias)
,na particularidad de ADO frente a lo a %isto con DAO o -DO es que ADO se salta la
.erarqu#a a la )ora de crear nue%os ob.etos. $n DAO, el ob.eto DAO superior creaba al ob.eto
DAO inferior /-ecuerde aquello del .uego de ni0os1. $n ADO podemos crear cada ob.eto sin
que e2ista el ob.eto inmediatamente superior. *or e.emplo podemos crear un recordset sin que
e2ista el ob.eto &onnection. &laro que en este caso, a la )ora de crear el ob.eto recordset
deberemos indicarle, mediante los parmetros que debemos aportar en la sinta2is de creaci3n
del recordset, todos aquellos datos que le aportar#amos a la creaci3n del ob.eto &onnection.
&omo %e no tiene %enta.as. +olamente que nos desentendemos un poco de abrir cerrar el
ob.eto &onnection.
&eamos como se crea la cone6in0 1ediante el Objeto ,onnection
EL OB*E<O CO$$ECTIO$
El objeto ,onnection representa una sesin 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 funcin de este objeto es recoger toda la informacin
del proveedor de los datos "ue se va a utili(ar para crear un objeto recordset.
+ara crear un objeto ,onnection# previamente debemos declararlo como variable objeto
,onnection0
Dim 1i,one6ion as ADODB.,onnection
El sitio donde se debe declarar depende como siempre# del %mbito "ue deseamos "ue tenga
ese objeto.
+ara crear el objeto ,onnection deberemos utili(ar la siguiente sinta6is0
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
A
3et 1i,one6ion B 4eC ADODB.,onnection
$ota% $n el caso de que e.ecutemos la aplicaci3n nos salga un error diciendo que el tipo no
est definido por el usuario, es que no )emos a0adido la referencia de 4Microsoft Acti%es Data
Ob.ects !ibrar 2.25
La cone6in Dest% creadaE. 3.# pero de momento es completamente in5til $a "ue no sabe ni
si"uiera "ue base de datos debe abrir# ni con "ue usuario# ni las condiciones en las "ue debe
abrir esa base (3olo lectura# etc.) Esta informacin se la pasamos mediante la propiedad
,onnection3tring (,adena de cone6in)
&a 'ro'iedad Connection(trin)
Es la propiedad m%s importante del objeto ,onnection. 3e basa en encadenar una serie de
argumentos en una cadena de caracteres. Los diferentes argumentos son (dependiendo del
proveedor OLE DB $ de la configuracin de la red# se necesitar%n todos o parte de ellos)
ro*ider Especifica el nombre del proveedor "ue se usa en la cone6in. (Oracle#
3?L3erver# *et# etc)
Data (ource Especifica el nombre de la fuente de datos para la cone6in. (4ombre de la
base de datos a la "ue se va a acceder.
+ser Id Especifica el nombre de usuario "ue abre la cone6in. Debe ser un usuario $a
declarado en la base de datos.
ass,ord Especifica la clave utili(ada por el usuario para abrir la cone6in. Debe
coincidir con el "ue tiene ese usuario registrado en la Base de datos.
File $a-e Especifica el nombre del fic!ero espec.fico de proveedor# "ue contiene la
informacin de configuracin de la cone6in. Este fic!ero es 5til en
instalaciones en red "ue re"uieran modificaciones de cone6in frecuentes.
"e-ote ro*ider Especifica el nombre de un proveedor de datos remoto cuando se
utili(a una cone6in cliente2servidor
"e-ote (er*er Especifica el nombre del camino al servidor "ue se va a usar cuando
se establece una cone6in cliente2servidor
,omo ejemplo para la cone6in a una base de datos Oracle# con el usuario "ue esa BD tiene
por defecto (scott) $ el +assCord de este usuario (tiger) tendremos "ue especificar en el
Connection(trin) la siguiente cadena de caracteres.
.ro*ider/0(DAO"A123ass,ord/ti)er3+ser ID/scott3Data (ource/0AD"ID34
donde el valor de 3ource es la cadena de cone6in de Oracle "ue previamente tiene "ue estar
configurada con el 3?L;4et o 4etF de Oracle.
3i lo "ue "ueremos es crear una cone6in con una base de datos Access :GGG
.ro*ider/0icroso#t1Jet1O&EDB15163Data
(ource/C%7GuiadelEstudiante7rue8aADO1-d834
3i la base de datos es de Access H9 entonces tendremos "ue especificar otro provider0
.ro*ider/0icroso#t1Jet1O&EDB191:3Data (ource/C%7GuiadelEstudiante7d821-d834
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
I
+ara una base de datos 3?L3erver
;ro*ider/(<&O&EDB123ass,ord/a!udas623 +ser ID/a!udas623 Initial
Catalo)/A!udas=03 Data (ource/a!udas=s>l; (en una l.nea 5nica)
,omo puede comprobar# resulta una tanto complicado construir la cadena de cone6in $
mientras "ue seamos novatos en ADO podemos tener problemas para crear esta cadena.
D+ero es "ue no e6iste una manera m%s f%cil de construir esta cadenaE Efectivamente. 7a$
un pe"ueJo truco mediante el cual no solo podemos crearla con un asistente# sino "ue adem%s
probaremos si la cone6in es satisfactoria o no.
Truco 'ara construir la cadena de cone?i@n1
1) +rimero tenemos "ue incluir el componente K1icrosoft ADO data control L.G (OLEDB)M.
+odemos !acerlo pulsando ,trl.N< o en el men5 +ro$ecto ,omponentes.
:) 1etemos en nuestro formulario el control $ pulsamos 8I para ver sus propiedades.
A) 7acemos ,lick en la propiedad
,onnection3tring $ nos
aparecer% el botn de puntos
suspensivos. 7acemos ,lick en
el botn.
I) A!ora nos aparece el asistente
"ue nos mostrar% A opciones.
Otili(ar un D34 de arc!ivo#
utili(ar un controlador ODB, o
utili(ar una cadena de
cone6in. En todos los casos# a
la derec!a de la opcin !a$ una
opcin "ue nos permite
seleccionar o generar el origen
de los datos. Osaremos la
cadena de cone6in (opcin por
defecto) $ pulsaremos el botn
generar.
P) Al pulsar el botn generar# nos aparece otra ventana en la "ue tenemos cuatro
pestaJas aun"ue 5nicamente necesitaremos dos de ellas para crear una cadena de
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
P
cone6in correcta $ probada. El resto de las pestaJas forman parte de otro cap.tulo
e6clusivo del control data de ADO# aun"ue le invito a "ue curiosee por ellas.
3eleccionaremos el proveedor de datos "ue "ueramos utili(ar $ pulsaremos el botn
siguiente para pasar a la siguiente pestaJa.
L) En la +estaJa cone6in# tenemos "ue proporcionar los datos correspondientes al
proveedor de la base de datos a la "ue "ueremos conectar. +or ejemplo para conectar
con una base de datos de tipo 0( Access (13 *et I.G OLEDB +rovider para la
versin :GGG de Access# 13 *et A.P OLEDB +rovider para la versin H9 de Access)#
tenemos "ue decirle el nombre $ pat! de la BD. +ara ello podemos utili(ar el botn de
los puntos suspensivos# "ue abrir% una ventana "ue permitir% seleccionar el arc!ivo
.mdb . 3i utili(amos el proveedor de datos de Oracle# tendremos "ue indicarle como
nombre de servidor la cadena de cone6in utili(ada en el 3?L 4et o en el 4etF de
Oracle (la misma cadena "ue especifica cuando se conecta a travs de 3?L;+lus).
En esta pestaJa e6isten dos opciones interesantes0
K,ontraseJa en BlancoM# si la marcamos no nos permitir% teclear la
contraseJa.
K+ermitir guardar la contraseJaM# dependiendo de si est% o no seleccionada#
incluir% o no en la cadena de cone6in la clave del usuario. +ara la primera
prueba le recomiendo "ue la mar"ue. 4o obstante# !aga diferentes pruebas
con ellas para ver los resultados.
Despus de !aber dado esta informacin# pulsaremos el botn +robar cone6in. En el
caso de "ue !a$a alg5n error# el asistente nos lo indicar% con un mensaje.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
L
+rueba de cone6in (fallida) con +roveedor de datos de Oracle
+rueba satisfactoria
9) Ona ve( "ue !emos probado satisfactoriamente la cone6in# pulsaremos aceptar $
volveremos a la pantalla inicial# la de las A opciones. La diferencia es "ue a!ora
tenemos la cadena de cone6in rellenada por el asistente. A!ora podemos copiarla
con ctrl.N, $ llevarla a la parte del cdigo donde "ueremos establecer la cone6in. 4o
se olvide de "ue es una cadena $ "ue cuando se asigne a la propiedad
,onnection3tring debe ir entre comillas dobles.
F) Ona ve( "ue !emos probado "ue funciona al abrir el objeto ,onnection# 4o debemos
olvidarnos de eliminar el control data de ADO $ de "uitar el componente de nuestro
pro$ecto# salvo "ue lo va$amos a utili(ar para otra cosa.
>a conocemos el truco para formar la cadena de cone6in $ se la !emos introducido en la
propiedad Connection(trin) D>a est% creada la cone6inE 3.# pero todav.a no sirve para
obtener datos de la base de datos. +ero $a !emos avan(ado muc!o. A!ora nuestro programa
$a sabe al menos# como poder abrir esa base de datos# pues conoce su nombre# usuario "ue
la abre $ +assCord. 3olamente "ueda aplicar un mtodo del objeto ,onnection0 el mtodo
O'en con una sinta6is "ue no es e6cesivamente dif.cil0
1icone6in.Open
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
9
!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 cdigo utili(ado
para crear la cone6in. En el ejemplo usamos una base de datos Access (4o es la mejor para
demostrar como funciona ADO# pero es la "ue los alumnos van a tener con ma$or facilidad.
Ona base Oracle o 3?L no se instala f%cilmente en un ordenador personal)
3et 1i,one6ion B 4eC ADODB.,onnection
Q1i,one6ion.,onnection3tring B R+roviderB1icrosoft.*et.OLEDB.I.G'Data
3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR
Q1i,one6ion.Open
A!ora nuestro programa $a est% en contacto con la base de datos. Lo "ue falta $a lo puede
suponer0 crear un recordset.
A"u. vamos a ver la primera diferencia con DAO. El recordset no lo crea el objeto ,onnection.
3e crea l a s. mismo. +ara "ue pueda e6istir un objeto =ecordset primero !a$ "ue declararlo0
Dim 1i=ecordset As ADODB.=ecordset (7a$ "ue declararlo en el sitio adecuado
dependiendo del %mbito "ue necesite)
En el procedimiento donde se va$a a crear el recordset# para crearlo utili(aremos la siguiente
sinta6is0
3et 1i=ecordset B 4eC ADODB.=ecordset (>a est% creado. +ero no est% abierto# a!ora
!a$ "ue abrirlo)
1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic
>a tenemos abierto el recordset. En este caso el recordset est% formado por todos los registros
con todos sus campos de la tabla Alumnos# "ue est% en la base de datos definida en la
cone6in 1i,one6ion# es del tipo D$namic $ el blo"ueo de escritura es optimista.
+odr.amos elegir ciertos registros# $ solamente unos campos. Otili(ar.amos una sentencia 3?L
1i=ecordset.O'en R3elect AlumnoT4ombre# AlumnoTApe/# AlumnoTApe: 8rom Alumnos R T
U KV!ere AlumnoT4ombre B WLuisXM# 1i,one6ion# adOpenD$namic# adLockOptimistic
3i no !ubisemos creado previamente el objeto ,onnection# podr.amos crear $ abrir
igualmente este objeto recordset# pero# en ve( de pasarle el nombre de la cone6in
(1i,one6ion) le pasar.amos la cadena de cone6in usada para crear ese objeto ,onnection.
3et 1i=ecordset B 4eC ADODB.=ecordset
1i=ecordset.Open RAlumnosR# R+roviderB1icrosoft.*et.OLEDB.I.G'Data
3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR#
adOpenD$namic# adLockOptimistic
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
F
/$s solamente una l#nea. 9a sido :ord quien la )a troceado1
A!ora $a podemos presentar los campos del recordset# usando la sinta6is "ue $a conocemos
de DAO
<b4ombre B KM U 1i=ecordsetYAlumnoT4ombre
<bApe/ B KM U 1i=ecordsetYAlumnoTApe/
<bApe: B KM U 1i=ecordsetYAlumnoTApe:
7agamos una pe"ueJa pausa. Observe "ue !a$ diferencias de trabajar con ADO o !acerlo con
DAO.
Con DAO1
Declarar 1i3esion# 1iBase $ 1i=ecordset
Dim 1i3esion as Vorkspace
Dim 1iBase As DataBase
Dim 1i=ecordset as =ecordset
,rear el objeto Vorkspace# el objeto DataBase $ el objeto =ecordset
3et 1i3esion B Vorkspaces(G)
3et 1iBase B 1i3esion.OpenDatabase (K,0S-uiadelEstudianteSAlumnos.1dbM)
3et 1i=ecordset B 1iBase.Open=ecordset (KAlumnos# dbOpenD$naset)
Con ADO (Creando el o8Aeto Connection)
Declarar 1i,one6ion $ 1i=ecordset
Dim 1i,one6ion As ADODB.,onnection
Dim 1i=ecordset As ADODB.=ecordset
,rear la cone6in $ ponerle la cadena de cone6in en su propiedad ,onnection3tring
3et 1i,one6ion B 4eC ADODB.,onnection
1i,one6ion.,onnection3tring B R+roviderB1icrosoft.*et.OLEDB.I.G'Data
3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR
Abrir el objeto ,onnection
1i,one6ion.Open
,rear el objeto recordset
3et 1i=ecordset B 4eC ADODB.=ecordset
Abrir el objeto =ecordset
1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic
Con ADO ((in crear el o8Aeto Connection)
Declarar 1i=ecordset
Dim 1i=ecordset As ADODB.=ecordset
,rear el =ecordset
3et 1i=ecordset B 4eC ADODB.=ecordset
Abrir el =ecordset
1i=ecordset.Open RAlumnosR# R+roviderB1icrosoft.*et.OLEDB.I.G'Data
3ourceB,0S-uiaDelEstudianteSADOS+ruebaADO.mdb'+ersist 3ecurit$ )nfoB8alseR#
adOpenD$namic# adLockOptimistic
Obser%e siempre que tanto en las declaraciones del ob.eto &onnection del ob.eto -ecordset,
como en su creaci3n, debemos anteponer siempre la palabra ADOD<
<anto el objeto =ecordset como el objeto ,onnection se deber%n cerrar cuando $a no se
utilicen# o al menos# al cerrar la aplicacin. Esto es tanto m%s necesario cuanto ma$or sea la
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
H
seguridad de la base de datos "ue vamos a utili(ar. En algunas bases de datos# dejar una
sesin abierta significa dejar una aplicacin (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(acin de
ADO. +ara cerrar una sesin $ un recordset utili(aremos el mtodo ,lose
1i=ecordset.,lose
1i3esion.,lose (=ecuerde "ue debe cerrar antes el recordset "ue la cone6in)
B<uC 'asa con el e>ui*alente del DorEs'aceF
,uando resum.amos en la p%gina anterior el cdigo a usar si us%bamos DAO o ADO# parec.a
(aun"ue no fuese cierto) "ue pod.amos asimilar estos objetos
DAO ADO
=ecordset =ecordset
DataBase ,onnection
Vork3pace D
Efectivamente el Vorkspace no tiene algo "ue pudisemos decir Ke"uivalenteM en ADO. Esto
es debido a "ue ADO $a considera "ue el acceso desde los usuarios lo gestiona directamente
la base de datos. =ecuerde "ue el Vorkspace en DAO era una Ksesin de trabajoM de la base
de datos# donde pod.amos asociar un Vorkspace a cada usuario. ADO $a le pasa a la BD el
nombre del usuario $ su +assCord para "ue la propia base de datos "uien autorice a ese
usuario.
Al)unas cosas >ue le *an a ocurrir cuando !a Ga!a creado el recordset1
El empleo de bases de datos complejas en cuanto a seguridad nos va a obse"uiar con
limitaciones a los recordsets "ue vamos a abrir en ADO. > adem%s esas sorpresas van a ser
distintas si usa uno u otro tipo de base de datos. (nos centraremos solamente en Oracle $
3?L3erver. Access# con la modestia "ue le caracteri(a# no va a dar ning5n problema.)
Los recordsets abiertos mediante una consulta 3?L (a"uellos en los "ue seleccionamos parte
de los registros mediante (elect H DGere van a crearse solo de lectura.
)ndependientemente de los par%metros "ue le pasemos a la !ora de crearlos. La descripcin
del error va a ser algo as. como "ue el cursor es solamente de lectura. <ambin observar%
con frecuencia# cuando intente ir a un registro anterior al actual# 1i=ecordset.1ove8irst# p.e.)
"ue le enviar% un error diciendo "ue el cursor es solamente de avance !acia a delante. Estos
efectos los observar% tambin cuando use la instruccin 3?L Order B!. 4o !a$ "ue arrojar la
toalla solamente por esto. ,uando eso ocurra# lo "ue !a$ "ue !acer es volver a crear el
recordset de forma "ue acepte escritura $ movimiento !acia atr%s. Eso generalmente se logra
abriendo el recordset con todos los registros de la tabla# e inclu$endo en l todos los campos.
En ve( de 0
1i=ecordset.O'en R3elect AlumnoT4ombre# AlumnoTApe/# AlumnoTApe: 8rom Alumnos R T
U KV!ere AlumnoT4ombre B WLuisXM# 1i,one6ion# adOpenD$namic# adLockOptimistic
usar esta otra alternativa0
1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic
+osiblemente necesitemos crear dos recordsets en un mismo procedimiento. +or ejemplo# es
mu$ t.pico tener "ue buscar el 5ltimo registro para ver el 5ltimo n5mero de un identificador de
registro (AlumnoT)D) $ poner en este campo# al registro "ue vamos a crear# un n5mero igual a
ese m%s /. En ese caso# abrir.amos el recordset usando la sentencia Order B$ AlumnoT)D.
,uando "ueramos introducir un nuevo registro mediante0
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/G
1i=ecordset.Add4eC nos dir% "ue el cursor (el recordset# para entendernos) es
solamente de lectura. La solucin es# abrir el recordset con la sinta6is anterior# leer el n5mero
de AlunmoT)D# cerrar el recordset# crear otro recordset con el mismo nombre# usando la
sinta6is0
1i=ecordset.O'en RAlumnosR# 1i,one6ion# adOpenD$namic# adLockOptimistic
A!ora $a nos permitir% usar el mtodo Add4eC. Basta con aJadir las l.neas de cdigo
adecuado para introducir los valores en cada campo0
1irecordset.Add4eC
1i=ecordsetYAlumnoT)D B &alor numrico
1i=ecordsetYAlumnoT4ombre B &alor string
Etc.
Z.
1i=ecordset.Opdate
4o renuncie nunca a intentar !acer esto. 4o siempre funciona. +ero esto es muc!o m%s
sencillo "ue introducir los datos Ka capnM utili(ando la instruccin 3?L Insert "ue $a veremos
m%s adelante. 3?L3erver es bastante m%s dcil "ue Oracle para usar el mtodo Add4eC.
A este respecto, )a que citar la propiedad &ursor!ocation que %eremos ms adelante. +i
creamos un cursor lado cliente, seguramente nos permitir utilizar ms opciones /entre ellas
AddNe;1 que si lo establecemos de lado ser%idor. =enga en cuenta que si usa un cursor lado
cliente, el recordset no se actualiza cuando otro usuario realiza modificaciones en la base.
0odi#icar datos -ediante EDIT
En ADO no !ace falta usar Edit para modificar los datos del registro actual. Edit no existe en
ADO. +ara modificar un dato basta con poner el mismo cdigo "ue utili(%bamos en DAO# pero
sin comen(ar por la l.nea 1irecordset.Edit. ,oloc%ndonos en el registro a modificar
pondremos0
1i=ecordsetYAlumnoT4ombre B K+edroM
1i=ecordsetYAlumnoTApe/ B K+ere(M
1i=ecordset.Opdate
De cual"uier forma# esto tampoco tiene por"ue funcionar en todas las bases de datos. En ese
caso tendremos "ue recurrir# al igual "ue para un registro nuevo# a las instrucciones 3?L# "ue
en este caso ser% +'date1 +ero $a lo veremos m%s adelante. 7asta a!ora solamente !e
"uerido usar el cdigo m%s simple para "ue pueda empe(ar con ADO# $ sobre todo# para "ue
vea "ue esta es una tcnica completamente accesible# aun"ue# dadas las grandes
prestaciones "ue tiene# un poco m%s adelante se va a complicar algo.
>a !a visto "ue podemos trabajar perfectamente con recordsets# tal como lo !emos !ec!o con
el DAO de toda la vida. +ero $a lo coment%bamos al principio# parece "ue !a$ "ue adornar lo
obvio para "ue no lo pare(ca tanto. > a!. viene el Objeto ,ommand# "ue como !abr% podido
ver en la figura de la *erar"u.a de los objetos ADO# es un objeto "ue a5n no sabemos lo "ue
!ace.
El o8Aeto Co--and lo "ue va a !acer es crear un recordset. O tambin# meter 4a cap3n5 un
nuevo registro# o borrarlo# utili(ando directamente instrucciones 3?L. 7a$ "ue darse cuenta
"ue ADO trabaja con una gran diversidad de bases de datos# $ no todas trabajan igual. +or
eso# muc!as veces fallan operaciones tan sencilla como aJadir un nuevo registro con el
mtodo Add4eC del recordset
1i=ecordset.Add4eC
> !a$ "ue emplear una instruccin 3?L0 I$(E"T
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
//
En estos casos# en ADO utili(amos el mtodo E@E,O<E sobre el objeto ,onnection.
,reamos una variable# 3tr)ntroducir# con el contenido de la instruccin 3?L $ ejecut%bamos
esa instruccin mediante E6ecute
3tr)ntroducir B R)nsert )nto )4<TDO,O1E4<O3 R T
U R(,LTDO,#4O1TDO,#<)<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD+<TDO,#M T
U
KLT<)+OTDO,#8),7TDO,#8E,7ATE1)3)O4TDO,#OL<)1AT7O=ATDO,#&)3)BLETDO,)RT
U R&alues (R U 4umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U RQ#QR U <b<itulo.<ag T
U RQ#/H#:#/#QR U 7=ef+rensa U R2R U <b4omb8ic!<)8 U RQ#QR U Date U RQ#G#/)R
,one6BD+rensa.E?ecute 3tr)ntroducir
Esta l.nea (3tr)ntroducir) es el contenido de la propiedad ,ommand<e6t de un objeto
,ommand de ADO. 4i m%s ni menos "ue una instruccin "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 instruccin E@E,O<E del objeto
,onnection. Lo "ue pasa# "ue ADO lo !an !ec!o mu$ organi(ado# $ por eso tiene la categor.a
de Objeto. Es !acer lo mismo# utili(ando las mismas e6presiones# pero d%ndole m%s cuerpo.
,on la instruccin anterior# lo "ue !ac.amos era aJadir un registro. 3i lo "ue "ueremos !acer
es crear un recordset# la instruccin 3?L comen(ar.a por K3elect ; 8rom Z.M > el mtodo
E@E,O<E devolver.a un =ecordset
3tr)ntroducir B K3elect ; 8rom Alumnos V!ere Apellido/ B W3uare(XM
+odemos crear un recordset (1i=ecordset# previamente declarado como tal) con esta
instruccin
1i=ecordset B ,one6BD+rensa.E?ecute 3tr)ntroducir
O con estas otras
3et 1i,omando as 4eC ADODB.,ommand
1i,omando.Active,onnection B ,one6BD+rensa
1i,omando.,ommand<e6t B K3elect ; 8rom Alumnos V!ere Apellido/ B W3uare(XM
1i=ecordset B 1i,omando.E6ecute
&er% el ejemplo completo al final del cap.tulo.
A!ora# tras la e6plicacin informal de cmo se crea una cone6in $ un recordset en ADO# $
"ue es un ,ommand# vamos a entrar a conocer sus propiedades $ mtodos. Al final# $ con un
buen ejemplo reali(ado de varias formas# entender% perfectamente la forma de trabajar con
ADO.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/:
ADO. El Objeto ,onnection
On objeto Connection representa una cone6in 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 coleccin Errors.
El O8Aeto "ecordset es el recordset de toda la vida0 un conjunto de registros "ue contienen
datos. El Objeto =ecordset# aun"ue pertenece al objeto ,onnection# puede crearse sin "ue
e6ista previamente un objeto ,onnection. Esta es una de las propiedades de los objetos ADO0
no necesita cumplir estrictamente con la jerar"u.a.
El O8Aeto Co--and es una definicin 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
operacin "ue afecte a los registros de la base de datos (aJadir registros# borrarlos# si es "ue
no se deja !acer eso mediante recordsets)
La Colecci@n Errors es el conjunto de errores generados por el proveedor de datos ante el
fallo de una operacin de acceso. La coleccin Errors se refiere 5nicamente a los errores
generados por el proveedor# no a los fallos interceptables producidos por el programa# "ue
deben ser tratados de la forma !abitual0 mediante Err
ro'iedades del O8Aeto Connection /!ea esto de las propiedades sin complicarse
demasiado la %ida. !as realmente importantes %er que estn ad%ertidas debidamente1
Las propiedades del objeto ,onnection dependen de cada proveedor. 4o todos se comportan
de igual forma# por lo "ue cada propiedad debe condicionarse a si el proveedor es capa( de
ofrecerla.
ro'iedad Attri8utes
Es un Long. Acepta dos valores o la suma de los dos0
adXactCo--it"etainin)
adXactA8ort"etainin)
Estos atributos condicionan el modo de operacin de la cone6in con los mtodos
,ommit<rans $ =ollBack<rans.
ro'iedad Co--andTi-eout
)ndica# en segundos# el intervalo de espera para "ue se ejecute un comando (Objeto
,ommand) antes de "ue finalice el intento $ se genere un error. Es un Long. El valor
predeterminado es AG.
ro'iedad ConnectionTi-eout
)ndica# en segundos# el intervalo de espera para establecer una cone6in antes de "ue finalice
el intento $ se genere un error. Es un Long $ el valor predeterminado es /P.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/A
ro'iedad Connection(trin) ()1+O=<A4<E)
Es una cadena de caracteres "ue contiene la informacin "ue se utili(a para establecer una
cone6in a un origen de datos. (&ea la e6plicacin amplia m%s atr%s)
La cadena de cone6in tiene varios argumentos# todos ellos separados por un punto $ coma (')
de la forma
argumento> ? %alor@ argumentoA ? %alor@ argumentoB ? %alor etc.
ADO procesa solamente cuatro argumentos0 +rovider# 8ile 4ame# =emote +rovider $ =emote
3erver. Los dem%s argumentos los pasa al proveedor para "ue el los procese (Osuario#
+assCord# etc)
3i al emplear el mtodo Open se utili(a el par%metro ,onnection 3tring# este par%metro
utili(ado en el mtodo Open sustituir% a cual"uier otro e6istente anteriormente. Ona ve(
abierta la cone6in# esta propiedad no se puede cambiar puesto "ue es solamente de lectura.
Los argumentos File Name $ Provider son e6clu$entes.
ro'iedad Cursor&ocation ()1+O=<A4<E)
Establece o devuelve la posicin de un servicio de cursores. Es un Long# $ acepta las
siguientes constantes0
Ad+se$one 4o se usan servicios de cursor. (Esta constante es obsoleta $ aparece
5nicamente por compatibilidad con versiones anteriores.)
Ad+seClient Osa cursores del lado del cliente.
Ad+se(er*er +redeterminado. Osa cursores del lado servidor.
Esta propiedad parece "ue no dice nada. > es sumamente importante.
Los cursores son# por decirlo de alguna manera# los mecanismos de la base de datos donde se
crean los recordsets. 3e estar% dando cuenta "ue las bases de datos "ue tienen cursores son
$a bases de datos con mecanismos propios para la creacin de recordsets. (3?L 3erver u
Oracle# p.e.) Estas bases de datos trabajan como aplicaciones cliente [ servidor. <ienen en el
servidor# aparte de los datos# la ma$or.a de sus recursos. En el cliente tienen pr%cticamente
los recursos de conectividad# $ poco m%s. Esta conectividad permite enviar desde el cliente
una peticin a la base de datos alojada en el servidor. Esa peticin ser% el resultado por
ejemplo# de una sentencia 3?L. Al recibirla el servidor# gestionar% la obtencin de los
resultados $ una ve( "ue los !a$a conseguido viene su primera duda0 DDnde los almacenoE
+uede almacenarlos en el servidor# $ cada ve( "ue necesitemos un nuevo registro# por
ejemplo al ejecutar la sentencia 1i=ecordset.1ove4e6t# el cliente se lo indica al servidor $
este le env.a el nuevo registro. <ambin puede almacenar los datos obtenidos en el cliente# $
de esta forma el cliente puede moverse con entera libertad a lo largo de los registros del
recordset. +uede !asta contarlos $ saber en "ue posicin 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
informacin estrictamente necesaria) $ en el segundo caso# se env.a muc!a informacin de un
golpe# la correspondiente a todos los registros del recordset# independientemente de si se va a
usar en el servidor o no.
,onsiderando el tr%fico generado# parece "ue es mejor crear los cursores en el lado servidor.
+ero esto trae tambin sus dificultades. 4os priva de muc!as propiedades del recordset. Ona
propiedad mu$ usada# Absolute+osition# no la tienen los cursores de lado servidor#
circunstancia "ue no nos debe sorprender# $a "ue al no estar todos los registros en el cliente#
ste# aun"ue disponga de todos los datos guardados en todos los campos de un determinado
registro# no puede saber "ue posicin 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 decisin
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 cone6in le cree
todos los cursores de lado cliente basta ejecutar la instruccin0
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/I
1i,one6ion.,ursorLocation B adOse,lient
3i desea !acer transacciones# deber% crear cursores del lado servidor# $a "ue los de lado
cliente no las admiten. ,omprender% seg5n va$a programando $ encontr%ndose con
problemas# "ue esta propiedad es absolutamente importante.
Este valor debe establecerlo antes de crear la cone6in. De esta forma# todos los cursores
creados con esa cone6in ser%n de lado cliente o lado servidor# seg5n !a$a elegido. +ero
muc!as veces ser.a ideal "ue unos recordsets tuvieran el cursor de un tipo $ otros de otro.
Los recordsets tambin tienen esta propiedad# por lo "ue puede elegir el lado deseado para
cada recordset utili(ando esta propiedad aplicada no a la cone6in# sino al recordset.
El n5mero de registros "ue el servidor env.a al cliente# cuando el cursor es de lado servidor# se
controla mediante la propiedad CacGe(iIe del recordset. Lo ver% m%s adelante.
ro'iedad De#aultData8ase
Establece la base de datos predeterminada para un objeto ,onnection. Es un string con el
nombre de la base de datos por defecto de esa cone6in. 3olamente es v%lida con a"uellos
proveedores "ue permiten varias bases de datos por cone6in.
Isolation&e*el
Esta propiedad afecta al comportamiento de un objeto ,onnection durante una transaccin.
Ona ve( establecida esta propiedad# solamente ser% efectiva cuando se invo"ue el mtodo
Beguin<rans. &ea la a$uda para ma$or informacin de los valores posibles.
ro'iedad 0odeJ
Establece los permisos disponibles para modificar datos en un objeto ,onnection.
Los valores aceptados son0
Ad0ode+nEno,n +redeterminada. )ndica "ue los permisos no se !an establecido a5n o
"ue no se pueden determinar.
Ad0ode"ead )ndica "ue son permisos de slo lectura.
Ad0odeDrite )ndica "ue son permisos de slo escritura.
Ad0ode"eadDrite )ndica "ue son permisos de lectura2escritura.
Ad0ode(GareDen!"ead )mpide "ue otros abran una cone6in con permisos de lectura.
Ad0ode(GareDen!Drite )mpide "ue otros abran una cone6in con permisos de
escritura.
Ad0ode(GareE?clusi*e )mpide "ue otros abran una cone6in.
Ad0ode(GareDen!$one )mpide "ue otros abran una cone6in con cual"uier tipo de
permiso.
3lo puede establecer la propiedad 0ode cuando el objeto Connection est% cerrado. ,uando
se usa en un objeto Connection del lado del cliente# la propiedad 0ode slo se puede
establecer a ad0ode+nEno,n.
ro'iedad ro*ider
Es un string "ue indica el nombre del proveedor de un objeto ,onnection. 3i no se especifica
ning5n proveedor# la propiedad tendr% el valor predeterminado 13DA3?L (+roveedor de
1icrosoft OLE DB para ODB,).
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/P
ro'iedad (tate
Devuelve el estado del objeto ,onnection0 abierto (ad3tateOpen B /) o cerrado
(ad3tate,losed B G).
ro'iedad Version
Devuelve el n5mero de versin de ADO. Es un 3tring.
0Ctodos del O8Aeto Connection
0Ctodos Be)inTransJ Co--itTrans ! "oll8acETrans
Estos mtodos de transaccin administran el proceso de la transaccin dentro de un objeto
,onnection de la forma siguiente0
Be)inTrans0 inicia una nueva transaccin.
Co--itTrans0 guarda las modificaciones $ termina la transaccin actual. <ambin
puede iniciar una nueva transaccin.
"oll8acETrans0 cancela las modificaciones efectuadas durante la transaccin actual $
termina la transaccin. <ambin puede iniciar una nueva transaccin.
Despus de invocar el mtodo Be)inTrans# el proveedor $a no aplicar% inmediatamente las
modificaciones !asta "ue invo"ue Co--itTrans o "oll8acETrans para terminar la
transaccin. Los mtodos Be)inTrans# Co--itTrans $ "oll8acETrans no est%n disponibles
en los objetos Connection del lado del cliente.

0Ctodo Cancel
,ancela la ejecucin de una llamada as.ncrona pendiente a un mtodo E?ecute u O'en.
3inta6is 4ombre,onection1Cancel
El mtodo Cancel se utili(a para terminar la ejecucin de una llamada as.ncrona a un mtodo
E?ecute o O'en (es decir# el mtodo fue invocado con la opcin adAs!ncConnect#
adAs!ncE?ecute o adAs!ncFetcG). Cancel devolver% un error de ejecucin si no se utili(
adAs!ncE?ecute en el mtodo "ue "uiere terminar.
CloseJ -Ctodo
,ierra el objeto ,onnection.
3inta6is NombredelOb.eto&onnection.Close
El cierre de un objeto Connection mientras !a$ objetos "ecordset abiertos en la cone6in
cancela las modificaciones pendientes en todos los objetos "ecordset. El cierre e6pl.cito de
un objeto Connection (llamando a su mtodo Close) mientras una transaccin est% en
progreso genera un error. 3i un objeto Connection cae fuera del alcance mientras la
transaccin est% en progreso# ADO cancela autom%ticamente la transaccin.
El cierre de un objeto ,onnection no lo elimina de la memoria' puede modificar los valores de
sus propiedades $ volver a abrirlo m%s tarde. +ara eliminar completamente un objeto de la
memoria# estable(ca la variable de objeto a Not)ing.
3et NombredelOb.eto&onnection B 4ot!ing
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/L
0Ctodo E?ecute (&ea tambin 1todo E6ecute para el objeto ,ommand)
Ejecuta una consulta# instruccin 3?L# procedimiento almacenado especificados o te6to
espec.fico del proveedor.
3inta6is (+ara una cadena de comando "ue no devuelva filas)0
cone2i3n1E?ecute CommandText# RecordsAffected# Options
(+ara una cadena de comando "ue de%uel%a filas1'
(et Mi-ecordset B connection1E?ecute (CommandText# RecordsAffected# Options)
(1i=ecordset debe ser una variable declarada tipo ADODB.=ecordset)
CommandText $s un 3tring "ue contiene la instruccin 3?L# el nombre de la tabla# el
procedimiento almacenado o el te6to espec.fico del proveedor "ue se va a ejecutar.
RecordsAffected Opcional. Ona variable Long en la "ue el 'ro*eedor de*uel*e el n5mero de
registros afectados por la operacin.
Options Opcional. Ona constante o valor Long "ue indica cmo debe evaluar el proveedor el
argumento CommandText. +uede ser uno de los siguientes valores.
Constante Descri'ci@n
adC-dTe?t
)ndica "ue el proveedor tiene "ue evaluar CommandText como
definicin te6tual de un comando# como una instruccin 3?L.
adC-dTa8le
)ndica "ue ADO tiene "ue generar una consulta 3?L para devolver
todas las filas de la tabla mencionada en CommandText.
adC-dTa8leDirect
)ndica "ue el proveedor tiene "ue devolver todas las filas de la
tabla mencionada en CommandText.
adC-dTa8le
)ndica "ue ADO tiene "ue generar una consulta 3?L para devolver
todas las filas de la tabla mencionada en CommandText.
adC-d(toredroc
)ndica "ue el proveedor tiene "ue evaluar CommandText como
procedimiento almacenado.
adC-d+nEno,n )ndica "ue el tipo de comando en CommandText es desconocido.
adAs!ncE?ecute )ndica "ue el comando se tiene "ue ejecutar de forma as.ncrona.
adAs!ncFetcG
)ndica "ue el resto de las filas siguientes a la cantidad inicial
especificada en la propiedad CacGe(iIe tiene "ue ser recuperada
de forma as.ncrona.
,uando esta operacin termina se genera el evento E6ecute,omplete.
0Ctodo O'en ()1+O=<A4<E)
Abre una cone6in a un origen de datos.
3inta6is 1i,onnection1O'en ConnectionSTringJ UserIDJ Passord! Options
1i,onnection1O'en
Los par%metros &onnection+=ring# ,ser6D# *ass;ord, Options puede introducirlos
previamente a abrir la cone6in# $ utili(ar la segunda sinta6is cuando desee abrirla realmente.
Estos par%metros se le pasan en la cadena de cone6in0
,one6BD+rensa.,onnection3tring B R+roviderB13DAO=A./'Oser )DB)4<=A4E<'M U T
K+assCordB)4<=A4E<'Data 3ourceBintranet'+ersist 3ecurit$ )nfoB8alseR
Options Opcional. +uede ser una de las constantes siguientes0
Ad,onnectOnspecified Abre la cone6in de forma sincron.a
AdAs$nc,onnect Abre la cone6in de forma as.ncrona
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/9
,uando se usa un objeto ,onnection del lado del cliente# el mtodo Open no establece
realmente una cone6in con el servidor !asta "ue se abre un =ecordset del objeto ,onnection.
Colecciones del O8Aeto Connection
Colecci@n Errors
,ontiene todos los objetos Error creados en respuesta a un 5nico fallo relacionado con el
proveedor. ,ada objeto Error representa un error espec.fico del proveedor# no un error ADO.
Los errores ADO se e6ponen al mecanismo de control de e6cepciones en tiempo de ejecucin.
+or ejemplo# en 1icrosoft &isual Basic# cuando ocurre un error espec.fico de ADO dispara un
evento On Error $ aparece en el objeto Err.
,uando otra operacin ADO genera un error# se borra la coleccin Errors $ el nuevo conjunto
de objetos Error se coloca en la coleccin Errors. Las operaciones ADO "ue no generan un
error no tienen ning5n efecto sobre la coleccin Errors. +ara borrar manualmente la coleccin
Errors utilice el mtodo Clear.
,ada objeto Error de la coleccin# nos dar% informacin sobre un error producido en la
cone6in. 3us propiedades son las siguientes0
Descri'tion% ,ontiene la descripcin del error producido (3tring).
$ati*eError% )ndica el error devuelto por la base de datos (Long).
$u-8er% Es el cdigo de error (Long).
(ource% )ndica el nombre del objeto o aplicacin "ue !a generado el error (3tring).
(<&(tate% )ndica el error 3?L est%ndar asociado.(3tring).
Debido a "ue este objeto ser% de gran utilidad a continuacin se inclu$e un ejemplo de su uso.
Ejemplo del tratamiento de errores0
El resultado de la ejecucin es el siguiente0
,omo puede observarse# algunas de las propiedades no devuelven los valores esperados0
4ativeError vale G cuando deber.a valer [/G/9# "ue es el error asociado de Oracle. A5n as.
podemos capturar el cdigo del error desde la cadena de caracteres descri'tion. ,on este
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/F
+rivate 3ub ,B,one6ionT,lick()
Dim 1i,one6/ As ADODB.,onnection
Dim 1iError As ADODB.Error
On Error -o<o =utErr
3et 1i,one6/ B 4eC ADODB.,onnection
1i,one6/.,onnection3tring B R+roviderB13DAO=A./'+assCordBtiger'Oser
)DBE(cot'Data 3ourceB1AD=)D'+ersist 3ecurit$ )nfoB<rueR
1i,one6/.Open
E6it 3ub
=utErr0
8or Eac! 1iError )n 1i,one6/.Errors
1sgBo6 (RError &B0R U 1iError.4umber U vb,rLf T
U RError Oracle0R U 1iError.4ativeError U vb,rLf T
U RError 3?L0R U 1iError.3?L3tate U vb,rLf T
U R-enerado +or0R U 1iError.3ource U vb,rLf T
U RDescripcin0R U 1iError.Description)
4e6t
End 3ub
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 $ dnde nos
devuelve los cdigos.
Observese en el cdigo "ue la declaracin de 1iError se !ace con ADODB.Error
Colecci@n ro'erties
Es el conjunto de objetos +ropert$
O8Aeto ro'ert!
On objeto ro'ert! representa una caracter.stica din%mica de un objeto ADO "ue est%
definida por el proveedor.
Los objetos ADO tienen dos tipos de propiedades0 intrnsecas $ dinK-icas.
Las propiedades intr.nsecas son a"uellas propiedades implementadas en ADO e
inmediatamente disponibles para cual"uier nuevo objeto# utili(ando la sinta6is
O8Aeto.ro'iedad. 4o aparecen como objetos ro'ert! en la coleccin +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
coleccin ro'erties del objeto ADO apropiado. +or ejemplo# una propiedad espec.fica del
proveedor puede indicar si un objeto =ecordset acepta transacciones o actuali(aciones. Estas
propiedades adicionales aparecer%n como objetos ro'ert! en la coleccin ro'iedades de
dic!o objeto "ecordset. A las propiedades din%micas se les puede !acer referencia slo a
travs de la coleccin# utili(ando la sinta6is Objeto.Properties(0) u
Objeto.Properties("Name").
On objeto ro'ert! din%mico tiene cuatro propiedades incorporadas propias0
La propiedad $a-e es una cadena "ue identifica la propiedad.
La propiedad T!'e es un entero "ue especifica el tipo de datos de la propiedad.
La propiedad Value es un variant "ue contiene el valor de la propiedad.
La propiedad Attri8utes es un valor Long "ue indica caracter.sticas de la propiedad
espec.ficas del proveedor.
El O8Aeto "ecordset de ADO
El objeto "ecordset representa un conjunto de registros. El recordset en ADO puede crearse
abrindolo# tomando todos los registros de una tabla o seleccion%ndolos con una consulta
3?L# o ejecutando un comando "ue contienen el nombre de esa tabla o la consulta. En un
momento determinado# el objeto "ecordset slo !ace referencia a un 5nico registro dentro del
conjunto de registros# llamado registro actual.
ro'iedades del O8Aeto "ecordset
El recordset de ADO tiene propiedades iguales al recordset de DAO# pero tienen otras "ue no
tienen el de DAO. 3e van a estudiar todas# profundi(ando m%s en las "ue son particulares del
recordset ADO.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
/H
ro'iedad A8soluteosition (ADO)
Especifica la posicin ordinal del registro actual de un objeto =ecordset. Esta propiedad
devuelve un Long con el n5mero de orden del registro. Es posible "ue el recordset no acepte
esta propiedad# dependiendo del proveedor de datos# $ del tipo de cursor (lado cliente o lado
servidor. El cursor tipo lado servidor no permite esta propiedad) Esta propiedad devolver% /
cuando el registro actual sea el primer registro del recordset.
ro'iedades BOF ! EOF
)ndican si la posicin del puntero del =ecordset est% apuntando a un registro anterior al
primero (BO8 B <rue) o posterior al 5ltimo (EO8 B <rue). Esta propiedad siempre la podremos
mirar# independientemente si el cursor es lado cliente o lado servidor.
ro'iedad Acti*eConnection (ADO)
)ndica a "u objeto ,onnection pertenece actualmente el objeto =ecordset especificado.
Devuelve un string con el nombre del objeto ,onnection.
ro'iedad BooE-arE
Devuelve un marcador "ue identifica un.vocamente al registro actual de un objeto =ecordset o
establece el registro actual de un objeto "ecordset al registro identificado por un marcador
v%lido. El valor del Bookmark !a$ "ue introducirlo en una variable tipo &ariant.
La propiedad Bookmark solo podr% establecerse cuando el proveedor lo permita. +uede
utili(arse el mtodo (u''orts para averiguarlo. ,uando el recordset es de lado cliente#
siempre est% disponible el Bookmark.
ro'iedad CacGe(iIe
)ndica el n5mero de registros del objeto =ecordset "ue est%n en la memoria cac! local. Es un
Long de lectura $ escritura. El valor predeterminado es /.
Esta propiedad nos permite conocer cuantos registros est%n en la memoria local. 3i ponemos
esta propiedad por ejemplo a /G# al abrir la primera ve( el objeto "ecordset# el proveedor
recupera los /G primeros registros en la memoria local. A medida "ue se despla(a por el objeto
"ecordset# el proveedor devuelve los datos desde el b5fer de memoria local. <an pronto
como pasa del 5ltimo registro de la memoria cac!# el proveedor recupera los /G registros
siguientes desde el origen de datos $ los carga en la memoria cac!.
Los registros recuperados desde la memoria cac! no reflejan los cambios concurrentes "ue
!agan otros usuarios en el origen de datos. +ara for(ar una actuali(acin de todos los datos en
la memoria cac!# debe usarse el mtodo "es!nc.
ro'iedad 0a?"ecords
)ndica el n5mero m%6imo de registros "ue se devuelven a un =ecordset desde una consulta.
Es un Long $ el valor predeterminado es G# "ue significa sin l.mite (Obtienen todos los
registros). Esta propiedad es de lectura $ escritura cuando el recordset est% cerrado# $
solamente de lectura cuando est% abierto.
Esta propiedad debe usarse solamente cuando se prev "ue se pueden obtener un n5mero
mu$ grande de registros. Es prudente tomar medidas frente a a"uellas operaciones en las "ue
el ordenador pueda meterse en un proceso e6cesivamente largo o "ue ocupe m%s recursos de
los disponibles. Estas cosas son las "ue suelen KcolgarM al ordenador $ en las "ue es mu$
frecuente ec!arle luego la culpa a VindoCs 3i estamos frente a una base de datos con todos
los datos de los afiliados a la 3eguridad 3ocial# no es del todo prudente crear un recordset
mediante esta sentencia0
3ELE,< ; 8rom Afiliados V!ere Apellido/ B W8ernande(X
)ncluso las !a$ peores0
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:G
3ELE,< ; 8rom Afiliados
A nadie se le ocurrir.a# pero puede surgir involuntariamente cuando ese acceso se reali(a
desde un puesto de operacin p5blico (Acceso desde )nternet por ejemplo). ,on la propiedad
0a?"ecords puede limitar el n5mero de registros obtenidos. +osiblemente no llegue a obtener
el dato deseado# $ se vea en la obligacin de reali(ar la misma consulta sucesivas veces !asta
encontrarlo.
ro'iedad Cursor&ocation
Establece o devuelve la posicin de un servicio de cursores. Es idntica a la propiedad del
mismo nombre vista m%s atr%s con todo detalle para el objeto ,onnection.
ro'iedad CursorT!'e
)ndica el tipo de cursor "ue se usa en un objeto =ecordset. Es de lectura $ escritura si el
recordset est% cerrado# $ solo de lectura si est% abierto. +uede tomar uno de los siguientes
valores0
AdO'enFor,ardOnl! +redeterminado. )dntico a un cursor est%tico# e6cepto slo
permite despla(arse !acia delante en los registros. Esto mejora el rendimiento en
situaciones en las "ue slo se "uiere pasar una ve( por cada registro.
En muc!as ocasiones es necesario moverse por el recordset !acia delante $ !acia
atr%s. Este tipo de cursor solamente permite moverse !acia delante. <enga presente
"ue este es el tipo predeterminado.
AdO'enLe!set ,ursor de conjunto de claves. )gual "ue un cursor din%mico# e6cepto
"ue no se pueden ver los registros "ue agregan otros usuarios# aun"ue los registros
"ue otros usuarios eliminan son inaccesibles desde su conjunto de registros. Los
cambios "ue otros usuarios !acen en los datos permanecen visibles.
AdO'enD!na-ic ,ursor din%mico. Las incorporaciones# cambios $ eliminaciones
"ue !acen otros usuarios permanecen visibles# $ se admiten todo tipo de movimientos
entre registros# a e6cepcin de los marcadores si el proveedor no los admite. Es el
e"uivalente en DAO al tipo D$naset
AdO'en(tatic ,ursor est%tico. Ona copia est%tica de un conjunto de registros "ue
se puede usar para buscar datos o generar informes. Las incorporaciones# cambios o
eliminaciones "ue !acen otros usuarios no son visibles. Es el e"uivalente en DAO al
tipo 3naps!ot
NOTA" +i un pro%eedor no admite el tipo de cursor solicitado, el pro%eedor puede que
de%uel%a otro tipo de cursor. !a propiedad C#rsorT$pe cambiar para coincidir con el tipo de
cursor en uso cuando el ob.eto Recordset se abra. *ara comprobar la funcionalidad espec#fica
del cursor de%uelto, use el mtodo +upports. &uando cierre el Recordset, la propiedad
C#rsorT$pe %ol%er a su configuraci3n original.
ro'iedad &ocET!'e
)ndica el tipo de blo"ueo "ue se pone en los registros durante el proceso de edicin. Establece
tambin si el recordset se actuali(a registro a registro o por lotes. Este 5ltimo sistema permite
reali(ar varios cambios en el recordset $ mantenerlos en la cac! durante cierto tiempo# $
proceder a la actuali(acin de todos los cambios pendientes en una sola operacin. Esto es
mu$ importante cuando se est% trabajando con una base de datos situada en un servidor con
un acceso lento (cone6in v.a )nternet# por ejemplo)
Los valores de la propiedad Lock<$pe pueden ser0
Ad&ocE"eadOnl! +redeterminado. 3lo lectura\no puede modificar los datos
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:/
Ad&ocEessi-istic Blo"ueo pesimista# registro a registro0 el proveedor !ace lo necesario
para asegurar la modificacin correcta de los registros# generalmente
blo"ueando registros en el origen de datos durante todo el proceso de
modificacin. Este valor solamente es v%lido si el cursor (+ropiedad
,ursorLocation) esta establecido a lado servidor.
Ad&ocEO'ti-istic Blo"ueo optimista# registro a registro0 el proveedor usa blo"ueo
optimista# blo"ueando registros slo cuando llama al mtodo Opdate.
Ad&ocEBatcGO'ti-istic Actuali(aciones optimistas por lotes0 re"uerido para el modo
de actuali(acin por lotes como contraposicin al modo de
actuali(acin inmediata.
ro'iedad Edit0ode
)ndica el estado de modificacin del registro actual. Es solamente de lectura. Devuelve uno de
las siguientes constantes0
AdEdit$one )ndica "ue no !a$ ninguna operacin de modificacin en ejecucin.
AdEditInro)ress )ndica "ue los datos del registro actual se !an modificado pero "ue no
se !an guardado.
AdEditAdd )ndica "ue se !a invocado el mtodo Add4eC $ "ue el registro situado
actualmente en el b5fer de copia es un nuevo registro "ue no se !a
guardado en la base de datos.
AdEditDelete )ndica "ue el registro actual se !a eliminado.
ro'iedad Filter
Esta propiedad solamente la tienen los recordset ADO. > es "ue ADO presupone "ue est%
obteniendo datos de una base de datos alojada en un servidor $ "ue la comunicacin entre
servidor $ cliente puede ser especialmente lenta. 1ediante 8ilter puede descartar registros "ue
no cumplan una determinada condicin. En realidad lo "ue !acemos mediante 8ilter es crear
un nuevo =ecordset a partir de otro =ecordset.
La propiedad 8ilter se utili(a tambin para actuar sobre determinados registros en varios
mtodos del recordset (=es$nc# 3ave# Z) pero no se va a e6plicar en este manual la
e6plicacin de la utili(acin de esta propiedad en esos mtodos# $a "ue el nivel del
programador "ue utili(a esos recursos debe ser elevado. Le reservamos por tanto la
posibilidad de conocerlo directamente desde la a$uda de &isual Basic# "ue en este caso es
bastante buena.
De momento lo "ue vamos a !acer con 8ilter es crear un nuevo recordset D+or "u no
creamos directamente el nuevo recordset utili(ando una sentencia 3?L "ue lleve impl.cito ese
filtroE
+ersonalmente no me gusta utili(ar la propiedad 8ilter# $ prefiero crear un nuevo recordset.
,reo "ue solamente lo !e usado para rellenar un 1378le6-rid con parte de los datos del
recordset "ue uso en una parte de la aplicacin. &eamos un ejemplo0
(1i,one6ion es una cone6in $a creada)
Dim =s)nicial As ADODB.=ecordset
Dim =s8iltrado As ADODB.=ecordset
3et =s)nicial B 4eC ADODB.=ecordset
3et =s8iltrado B 4eC ADODB.=ecordset
=s)nicial.Open RAutoresR# 1i,one6ion# adOpenD$namic# adLockOptimistic
WEste es el recordset "ue uso para muc!as cosas dentro de la aplicacin. A!ora "uiero
presentar en un 1378le6-rid solamente los datos de los autores de nacionalidad espaJola.
8iltro el recordset anterior utili(ando un criterio de igualdad de un campo0 4acionalidad
=s8iltrado B =s)nicial.8ilter (K4acionalidad B WEspaJolaXM)
WA!ora $a podemos aplicar este recordset al 1378le6-rid0
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
::
3et 1378le6-/.=ecordset B =s8iltrado
W> cuando "ueremos presentar todos los autores# basta con poner la l.nea0
3et 1378le6-/.=ecordset B =s)nicial
Este es el 5nico ejemplo "ue puedo sacar de todas mis aplicaciones. 3eguro "ue el alumno va
a ver m%s aplicaciones de esta propiedad.
La propiedad Filter puede mostrar tambin a"uellos registros "ue !an sido manipulados
recientemente# mediante las constantes siguientes0
AdFilter$one ?uita el filtro actual $ vuelve a poner todos los registros a la
vista.
AdFilterendin)"ecords +ermite ver slo los registros "ue !an cambiado# pero "ue no
!an sido enviados a5n al servidor. Aplicable slo para el modo
de actuali(acin por lotes.
AdFilterA##ected"ecords +ermite ver slo los registros afectados por la 5ltima llamada
a Delete# =es$nc# OpdateBatc! o ,ancelBatc!
AdFilterFetcGed"ecords +ermite ver los registros de la cac! actual# es decir# los
resultados de la 5ltima llamada para recuperar registros de la
base de datos
AdFilterCon#lictin)"ecords +ermite ver los registros "ue fallaron en el 5ltimo intento de
actuali(acin por lotes.
ro'iedad Inde?
)ndica el nombre del .ndice "ue se utili(a actualmente en el =ecordset. Es un 3tring con el
nombre del .ndice.
El .ndice se utili(a para moverse a lo largo del recordset mediante el mtodo 1ove. El .ndice
$a debe estar creado en la tabla de la base de datos.
Al utili(ar un .ndice# el orden de los registros se cambia al orden establecido en ese .ndice. +or
lo tanto# los valores obtenidos anteriormente por la propiedad Absolute+osition cambiar%n
completamente.
4o todos los proveedores de datos aceptan la propiedad )nde6. +uede comprobarlo mediante
el mtodo 3upports.
ro'iedad 0arsGalO'tions
Esta propiedad se usa cuando estamos trabajando con cursores lado cliente. En este caso#
como vimos m%s atr%s# los registros del recordset est%n en el e"uipo cliente. <odas las
operaciones reali(adas sobre el recordset se reali(an en el cliente# por lo tanto llegar% el
momento en "ue !abr% "ue actuali(ar en el servidor los datos "ue !a$amos modificado en el
recordset "ue est% en el e"uipo cliente. 1ediante esta propiedad podemos !acer "ue se
env.en al servidor todos los registros (filas) o solamente los "ue !an cambiado. Acepta estas
dos constantes0
Ad0arsGalAll +redeterminada. )ndica "ue todos los registros se devuelven al
servidor.
Ad0arsGal0odi#iedOnl! )ndica "ue slo los registros modificados se devuelven al
servidor.
Esta propiedad puede mejorar el rendimiento de la aplicacin para a"uellos casos en los "ue
se use un canal de comunicacin lento.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:A
ro'iedad a)e(iIe
)ndica cu%ntos registros constitu$en una p%gina del objeto =ecordset. Es de lectura $ escritura.
Devuelve un Long $ su valor predeterminado es /G.
Esta propiedad 'er-ite determinar cu%ntos registros componen una p%gina lgica de datos. Al
establecer un tamaJo de p%gina# puede utili(ar la propiedad A8solutea)e $ se mover% al
primer registro de una p%gina espec.fica. Esto es 5til en las situaciones de servidor Veb
cuando se desea permitir "ue el usuario pase p%ginas de datos $ vea cierto n5mero de
registros al mismo tiempo. Esta propiedad se puede establecer en cual"uier momento $ su
valor se utili(ar% para calcular la ubicacin del primer registro de una p%gina espec.fica.
ro'iedad a)eCount
)ndica cu%ntas p%ginas de datos contiene el objeto =ecordset. Es solamente de lectura.
Devuelve un Long. 3i el objeto "ecordset no admite esta propiedad# el valor ser% N/ para
indicar "ue no se puede determinar el valor de a)eCount.

ro'iedad A8solutea)e
Especifica en "u p%gina reside el registro actual. Es de lectura $ escritura. Devuelve un Long
o una de las siguientes constantes0
Ados+nEno,n El objeto "ecordset est% vac.o# la posicin actual se desconoce o el
proveedor no admite la propiedad A8solutea)e.
AdosBOF El puntero del registro actual est% al comien(o del arc!ivo (es decir# la
propiedad BOF tiene el valor True).
AdosEOF El puntero del registro actual est% al final del arc!ivo (es decir# la
propiedad EOF tiene el valor True).
ro'iedad "ecordCount
)ndica el n5mero actual de registros de un objeto =ecordset. Devuelve un Long
Es posible "ue esta propiedad no la permita el proveedor de datos# o "ue no pueda llegar a
averiguarse# $a "ue dependiendo del tipo de cursor utili(ado puede "ue no suministre ese
dato.
ro'iedad (ource
Devuelve la tabla# consulta o sentencia 3?L utili(ado en el mtodo Open para crear el
recordset. Es un 3tring.
ro'iedad (tate
)ndica el estado (abierto# cerrado# proceso de ejecucin) en el "ue se encuentra el recordset.
Devuelve uno de los siguientes valores0
Constante Descri'ci@n
ad(tateClosed
&alor predeterminado. )ndica "ue el objeto est%
cerrado.
ad(tateO'en )ndica "ue el objeto est% abierto.
ad(tateConnectin)
)ndica "ue el objeto "ecordset se est%
conectando.
ad(tateE?ecutin)
)ndica "ue el objeto "ecordset est% ejecutando
un comando.
ad(tateFetcGin)
)ndica "ue se est% obteniendo el conjunto de filas
del objeto "ecordset.
+uede tener una combinacin de valores. +or ejemplo# si se est% ejecutando una instruccin#
esta propiedad tendr% un valor combinado de ad(tateO'en $ ad(tateE?ecutin).
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:I
ro'iedad (tatus
Esta propiedad se refiere al registro actual. )ndica el estado de este registro respecto a las
operaciones de actuali(acin por lotes u otras operaciones masivas. 4o es una propiedad "ue
se use todos los d.as. &ea la a$uda para mas detalles.
ro'iedades dinK-icas del o8Aeto recordset
Las propiedades anteriores se refieren a propiedades del recordset "ue se refieren a unas
caracter.sticas propias del recordset una ve( creado. 3on estas0
+ni>ue Ta8leJ +ni>ue (cGe-a ! +ni>ue Catalo)
+ni>ue Ta8le especifica la tabla sobre la "ue se permite reali(ar modificaciones de datos
()nsertar o actuali(ar)# en el caso de "ue el recordset se !a$a creado mediante una operacin
*O)4
+ni>ue (cGe-a indica el nombre del propietario de la tabla
+ni>ue Catalo) indica el nombre de la base de datos a la "ue pertenece la tabla. Estas dos
5ltimas propiedades deben tener un valor para poder poner valor a la propiedad +ni>ue
Ta8le. Estas propiedades son tipo 3tring
Estas propiedades din%micas se ane6an a la coleccin ro'erties del objeto "ecordset al
asignar el valor ad+seClient a la propiedad ,ursor Location.
0Ctodos del o8Aeto "ecordset de ADO
0ETODO (u''orts
Este mtodo es mu$ 5til para ver si un recordset acepta una determinada funcionalidad.
Devuelve un Booleano $ es solamente de lectura. De esta forma puede consultar si un
recordset admite el mtodo 1ove8irst# la propiedad Absolute+osition# Bookmark# etc.# antes
de invocar ese mtodo o leer esa propiedad# $ evitar de esta forma un error en la ejecucin.
Esto es mu$ 5til !abida cuenta "ue no todos los proveedores funcionan de la misma forma. Es
por lo tanto mu$ prudente consultar si el =ecordset soporta una funcionalidad antes de
ped.rsela.
Estas funcionalidades se le pasan como par%metro mediante una de las siguientes constantes0
AdAdd$e, +uede usar el mtodo Add4eC para agregar nuevos registros.
AdA''ro?osition +uede leer $ establecer las propiedades Absolute+osition $
Absolute+age.
AdBooE-arE +uede usar la propiedad Bookmark para tener acceso a registros
espec.ficos
AdDelete +uede usar el mtodo Delete para eliminar registros.
AdMold"ecords +uede recuperar m%s registros o cambiar la posicin de recuperacin
siguiente sin efectuar todos los cambios pendientes.
Ad0o*ere*ious +uede usar los mtodos 1ove8irst $ 1ove+revious# $ los mtodos
1ove o -et=oCs para despla(ar !acia atr%s la posicin del registro
actual sin "ue se re"uiera marcadores.
Ad"es!nc +uede usar el mtodo =es$nc para actuali(ar el cursor con los datos
visibles en la base de datos sub$acente.
Ad+'date +uede usar el mtodo Opdate para modificar datos e6istentes.
Ad+'dateBatcG +uede usar actuali(acin por lotes (mtodos OpdateBatc! $
,ancelBatc!) para transmitir grupos de cambios al proveedor.
AdInde? +uede utili(ar la propiedad )nde6 para dar nombre a un .ndice.
Ad(eeE +uede utili(ar el mtodo 3eek para encontrar una fila en un =ecordset.
En este eAe-'lo *e-os la sinta?is de (u''orts%
)f =s3eg.3upports(adAppro6+osition) B <rue <!en
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:P
1sgBo6 R3)R
Else
1sgBo6 R4OR
End )f
Nota Aunque el mtodo S#pports puede de%ol%er Tr#e para una funcionalidad determinada,
eso no garantiza que el pro%eedor pueda )acer que la caracter#stica est disponible ba.o
cualquier circunstancia. $l mtodo S#pports de%uel%e simplemente si el pro%eedor puede
admitir la funcionalidad especificada, dando por supuesto que se renen determinadas
condiciones. *or e.emplo, el mtodo S#pports puede indicar que un ob.eto Recordset admite
actualizaciones aunque el cursor se base en una uni3n de mltiples tablas, de las que algunas
columnas no son actualizables.
El valor devuelto por el mtodo 3upports depender% del tipo de recordset elegido. En la
siguiente tabla puede ver el tipo de recordset $ las constantes para las "ue va a devolver <rue0
AdO'enFor,ardOnl! 4inguna
AdO'enLe!set adBookmark# ad7old=ecords# ad1ove+revious# ad=es$nc
AdO'enD!na-ic Ad1ove+revious
AdO'en(tatic adBookmark# ad7old=ecords# ad1ove+revious# ad=es$nc
0Ctodo O'en
Es el mtodo "ue A%RE el recordset. Este mtodo es el "ue busca los registros "ue !an de
rellenar el recordset.
3inta6is. Esta es la sinta6is general0
Mi-ecordset1O'en So#rceJ 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 3?L de la cual se obtienen
los registros del =ecordset.
ActiveConnection /Opcional1" Es el nombre de un objeto ,onnection abierto o una cadena de
cone6in v%lida. Esta cadena es la misma "ue la "ue emplear.amos para abrir el objeto
,onnection.
C#rsorT$pe /Opcional1. On valor "ue determina el tipo de cursor "ue el proveedor debe usar
al abrir el "ecordset. +uede ser una de las siguientes constantes
AdO'enFor,ardOnl! (+redeterminado) Abre un cursor de tipo slo avance.
AdO'enLe!set Abre un cursor de tipo conjunto de claves.
AdO'enD!na-ic Abre un cursor de tipo din%mico. ()gual "ue el D$naset de
DAO)
AdO'en(tatic Abre un cursor de tipo est%tico.
&oc'T$pe /Opcional1. On valor "ue determina el tipo de blo"ueo "ue debe usar el proveedor
al abrir el "ecordset. ,on este par%metro se le indica tambin si debe !acer las
actuali(aciones registro a registro o en blo"ue. +uede ser una de las siguientes constantes
Ad&ocE"eadOnl! (+redeterminado) 3lo lectura. 4o puede modificar los datos.
Ad&ocEessi-istic Blo"ueo pesimista# registro a registro. El proveedor !ace lo
necesario para asegurar una modificacin correcta de los
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:L
registros# normalmente blo"ueando registros en el origen de
datos inmediatamente antes de la modificacin.
Ad&ocEO'ti-istic Blo"ueo optimista# registro a registro. El proveedor usa
blo"ueooptimista# blo"ueando registros slo cuando se llama
al mtodo Opdate.
Ad&ocEBatcGO'ti-istic Actuali(aciones optimistas por lotes. =e"ueridas en el
modo de actuali(acin por lotes en oposicin al modo
de actuali(acin inmediata. (Actuali(acin en blo"ue)
Options /Opcional1. ,onstante "ue determina como va a evaluar el proveedor de datos el
argumento So#rce. +uede ser una de las siguientes constantes de esta lista.
AdC-dTe?t )ndica "ue el proveedor debe evaluar So#rce como una definicin
te6tual de un comando.
AdC-dTa8le )ndica "ue ADO debe generar una consulta 3?L para devolver
todaslas filas de la tabla nombrada en So#rce.
AdC-dTa8leDirect )ndica "ue el proveedor debe devolver todas las filas de la
tabla nombrada en So#rce.
AdC-d(toredroc )ndica "ue el proveedor debe evaluar So#rce como un
procedimiento almacenado
AdC-d+nEno,n )ndica "ue el tipo de comando del argumento So#rce es
desconocido.
AdC-dFile )ndica "ue el "ecordset guardado se debe restaurar desde el
arc!ivo nombrado en So#rce.
AdAs!ncE?ecute )ndica "ue So#rce se debe ejecutar de forma as.ncrona.
AdAs!ncFetcG )ndica "ue# tras alcan(ar la cantidad inicial especificada en la
propiedad Initial FetcG (iIe# las filas restantes deben
buscarse de forma as.ncrona. 3i se re"uiere una fila "ue no se
!a encontrado# se blo"uear% el subproceso principal !asta "ue
se disponga de la fila solicitada.
AdAs!ncFetcG$onBlocEin) )ndica "ue el subproceso principal nunca se blo"uea
durante la b5s"ueda. 3i no se encuentra la fila
solicitada# la fila actual se despla(a autom%ticamente
al final del arc!ivo.
9abr obser%ado que )emos remarcado que el mtodo Open A<-$ un recordset. No lo crea.
$l recordset debe estar creado pre%iamente. CQu cuando se creaD Mediante la instrucci3n'
+et Mi-ecordset ? Ne; ADOD<.-ecordset
0etodo "e>uer!
Actuali(a los datos de un objeto =ecordset volviendo a ejecutar la consulta utili(ada para
abrirlo. 3e obtiene el mismo resultado "ue si se cerrara el recordset $ se volviera a abrir.
3inta6is 1i=ecordset."e>uer! Opciones
Optiones Opcional. 1%scara de bits "ue indica opciones "ue afectan a esta operacin. 3i el
valor de este par%metro est% establecido a adAs!ncE?ecute# esta operacin se ejecutar% de
forma as.ncrona $ se emitir% un evento =ecordset,!ange,omplete cuando conclu$a.
0Ctodo "es!nc
Actuali(a los datos del objeto =ecordset actual. Este mtodo# a diferencia del mtodo
=e"uer$# no vuelve a ejecutar el comando de creacin del recordset# sino "ue lee los registros
e6istentes en el recordset para actuali(ar su valor# pero no presenta a"uellos registros "ue
!ubieran sido creados con posterioridad a la apertura del recordset. Es m%s r%pido "ue el
mtodo =e"uer$# $ en muc!os casos solamente nos interesa actuali(ar los registros sobre los
"ue estamos trabajando.
(inta?is 1i=ecordset."es!nc Affect=ecords# =es$nc&alues
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:9
Los par%metros AffectRecords $ Res$nc(al#es determinan "ue registros se van a volver a
leer $ sobreescribir. &ea la a$uda para mas detalles.
0ETODO Add$e,
,rea un nuevo registro en un objeto =ecordset actuali(able.
3inta6is NombreDel-ecordset"Add$e, Field&istJ (al#es
Los par%metros Field&ist $ (al#es son opcionales. En caso de ponerlos# 8ieldList ser%n los
nombres de los campos a los "ue se les va a poner un valor# $ &alues son los valores de cada
uno de estos campos. El orden nombre N valor debe mantenerse estrictamente.
3iempre recomendar "ue# en ve( de meter los datos mediante estos par%metros# se metan
posteriormente linera a l.nea# tal como se !i(o siempre con los recordsets
4ombreDel=ecordsetY4ombredel,ampo B &alorDel,ampo

4ombreDel=ecordset(K4ombredel,ampoM) B &alorDel,ampo
Esta segunda forma es necesaria cuando el nombre del campo tiene espacios. 4unca es
recomendable poner espacios en los nombres de campos# pero en caso de "ue e6istan# debe
optar por utili(ar la sinta6is segunda# con los parntesis $ comillas dobles.
4o siempre se puede utili(ar el mtodo Add4eC. +uede comprobar si se puede utili(ar# usando
el mtodo (u''orts visto anteriormente.
El mtodo Add4eC convierte a este registro recin creado en registro actual. +ero este registro
solamente e6iste en el recordset. +ara introducir los datos en la base de datos# (> por lo tanto
en el disco duro) es necesario invocar el mtodo +'date una ve( introducidos todos los
valores de los campos "ue deseamos introducir. ,on alg5n tipo de cursor es necesario
tambin utili(ar el mtodo "e>uer! para poder acceder al registro recin creado.
3i se invoca el mtodo Add$e, mientras se est% editando el registro actual# o durante otra
operacin Add$e,# ADO invoca autom%ticamente el mtodo +'date para guardar los
cambios. &ea m%s adelante los mtodos +'date $ +'dateBatcG.
0Ctodo +'date
-uarda los cambios reali(ados en el registro actual de un objeto =ecordset. 3e utili(a tanto
para KrematarM una operacin de creacin de un registro iniciada con Add4eC# como para
guardar los nuevos datos del registro actual (=ecuerde "ue en ADO no e6iste el mtodo Edit#
tal como ocurr.a en DAO)
.
3inta6is NombreDel-ecordset1+'date FieldsJ (al#es
En esta sinta6is# 8ields $ &alues son opcionales# $ solamente tienen aplicacin cuando se trata
de cambiar los valores del registro actual# no de terminar una operacin de creacin de un
nuevo registro mediante Add4eC.
&uelvo a recomendar lo anterior. +ara cambiar los valores de varios campos de un registro#
nos colocaremos sobre ese registro# $ sin invocar ning5n mtodo# ejecutaremos este cdigo
1i=ecordsetY,ampo/ B &alor/
1i=ecordsetY,ampo: B &alor:
ZZZ.
1i=ecordsetY,ampo4 B &alor4
1i=ecordset.+'date
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:F
+ero en ADO pasa una cosa "ue no pasaba en DAO. 3i cambiamos de registro una ve(
modificado el valor de un registro# ADO invoca autom%ticamente el mtodo +'date. +or lo
tanto# el cdigo siguiente0
1i=ecordsetY,ampo/ B &alor/
1i=ecordsetY,ampo: B &alor:
ZZZ.
1i=ecordsetY,ampo4 B &alor4
<endr% el mismo resultado "ue el anterior cuando cambiemos de registro actual. Esto puede
ser bueno a malo# pero personalmente pienso "ue no es pr%ctico por"ue implica tener muc!o
m%s cuidado "ue en DAO. 7ace lo mismo "ue cuando tenemos unos controles enla(ados a
datos mediante un control Data.
3i una ve( "ue ejecutamos una l.nea tal como esta
1i=ecordsetY,ampo/ B &alor/
?ueremos "ue ese nuevo valor no entre en la base de datos# debemos cancelarlo mediante el
mtodo Cancel+'date.
0Ctodo +'dateBatcG
Escribe en disco todas las actuali(aciones pendientes de proceso por lotes. En ADO un
recordset puede actuali(arse registro a registro o por lotes. <odo depender% de cmo se !a
abierto (3i el valor &oc'T$pe se !a puesto a Ad&ocEBatcGO'ti-istic)
(inta?is 1i=ecordset1+'dateBatcG Affect-ecords
AffectRecords ,onstante "ue determina a cu%ntos registros afectar% el mtodo
+'dateBatcG. +uede tomar uno de los siguientes valores.
AdA##ectCurrent Escribe solamente los cambios pendientes en el
registro actual.
AdA##ectGrou' Escribe los cambios pendientes "ue cumplen el valor
de la propiedad 8ilter.
AdA##ectAll (+redeterminado) Escribe los cambios pendientes en
todos los registros del objeto "ecordset.
0Ctodo Cancel
,ancela la ejecucin del mtodo O'en.
(inta?is NombreDel-ecordset1Cancel
El mtodo ,ancel solamente puede usarse si el mtodo Open fue invocado con la opcin
adAs!ncConnect# adAs!ncE?ecute o adAs!ncFetcG.
0Ctodo Delete
Elimina el registro actual o un grupo de registros. +or defecto elimina solamente el registro
actual. &ea la a$uda para ampliar los detalles respecto al par%metro opcional AffectRecords
(inta?is 1i=ecordset.Delete Affect-ecords
0Ctodo Cancel+'date
7ab.amos visto m%s atr%s "ue el ADO no e6iste el mtodo Edit. +ara modificar un registro
basta con poner una instruccin tal como esta0
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
:H
1i=ecordsetY1i,ampo B 1i4uevo&alor
> a continuacin rematar la operacin mediante el mtodo Opdate
1i=ecordset.Opdate
3i por cual"uier circunstancia se !a ejecutado la primera instruccin# $ luego "ueremos
volvernos atr%s# antes de ejecutar el mtodo Opdate debemos des!acer el cambio con el
mtodo ,ancelOpdate# con lo "ue el registro afectado recuperar% nuevamente su valor
original.
3inta6is 1i=ecordset.Cancel+'date
-ecuerde que ADO funciona de forma distinta a DAO con estos mtodos de modificaci3n de
los registros. -ecuerde que si est en proceso de modificaci3n de un registro /9a e.ecutado la
primera l#nea del e.emplo anterior1 cambia de registro, por el )ec)o de cambiar de registro,
ADO in%oca automticamente el mtodo ,pdate.
0Ctodo CancelBatcG
,ancela una actuali(acin por lotes pendiente. Es similar a la anterior# pero para actuali(acin
por lotes.
3inta6is 1i=ecordset.CancelBatcG Affect-ecords
0Ctodo Clone
,rea un objeto =ecordset duplicado a partir de un objeto "ecordset e6istente. Opcionalmente#
puede especificarse "ue el nuevo recordset sea solamente de lectura
(inta?is (et rstDuplicate B rstOriginal.Clone (!ocE=pe)
(El objeto rstDuplicate debe estar declarado previamente como objeto ADODB.=ecordset)
Lock<$pe puede tomar uno de los siguientes valores0
Ad&ocE+ns'eci#ied (+redeterminado) El recordset resultante tendr% el mismo tipo de
blo"ueo "ue el original.
Ad&ocE"eadOnl! El recordset creado es solamente de lectura.
El recordset resultante del mtodo ,lone# aun"ue igual al original en el momento de su
creacin# es completamente independiente de este a partir de ese momento# por lo "ue las
actuali(aciones efectuadas en el original no afectan al clonado.
0Ctodo 0o*e
1ueve la posicin del registro actual de un objeto =ecordset
.
3inta6is 1i=recordset10o*e Num-ecords# +tart
N#mRecords ,n %alor Long con signo "ue especifica el n5mero de registros "ue debe
moverse a partir de la posicin del registro actual o del registro especificado en el par%metro
Start# si es "ue se especifica.
Start Opcional. On (trin) o Variant cu$o resultado sea un marcador del tipo Bookmark.
+uede utili(ar tambin una de las siguientes constantes0
AdBooE-arECurrent (+redeterminado) ,uenta a partir del registro actual
AdBooE-arEFirst ,uenta a partir del primer registro
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AG
AdBooE-arE&ast ,uenta a partir del 5ltimo registro
0Ctodos 0o*eFirstJ 0o*e&astJ 0o*e$e?t ! 0o*ere*ious
+asa al primer# 5ltimo# siguiente o anterior registro de un objeto =ecordset especificado $ lo
convierte en el registro actual. 8unciona igual "ue en DAO
<enga en cuenta a la !ora de usar los mtodos 1ove "ue pueden e6istir =ecordsets "ue no
permiten el movimiento !acia atr%s.
0Ctodo Find
Busca el primer registro del recordset "ue satisfaga los criterios especificados en el criterio de
b5s"ueda. 3i se cumple el criterio de b5s"ueda# la posicin del recordset se establece en el
primer registro encontrado' si no# la posicin se establece al final del recordset.
(inta?is 1i=ecordset.Find /criterio, +Eip-o;s, searc)Direction, start1
criterio Es el criterio de b5s"ueda. +or ejemplo K+ais B EspaJaM siendo +ais el
nombre del campo en el cual buscamos el valor EspaJa
S'ipRos )Opciopnal* Es un Long# cu$o valor predeterminado es cero# "ue especifica el
n5mero de registros a partir del registro actual donde debe empe(ar la b5s"ueda.
searc+Direction )Opcional* On valor "ue especifica si la b5s"ueda se reali(a en direccin al
final del recordset (ad(earcGFor,ard) o en direccin !acia el principio del recordset
(ad(earcGBacE,ard). La b5s"ueda termina al final o al principio del recordset# dependiendo
del valor de searc+Direction.
start )Opcional* On marcador tipo Book1ark "ue se utili(a como posicin inicial de
la b5s"ueda.
El operador de comparaci3n de criterio puede ser RNR# ROR# RBR# R]BR # R^BR# R^]R (distinto de) o
RliEeR (coincidencia parcial de cadenas). El valor de comparacin puede ser una cadena# un
n5mero en coma flotante o una fec!a. Los valores de cadena est%n delimitados con comillas
sencillas (por ejemplo# R+ais B QEspaJaQR). Los valores de fec!a est%n delimitados con signos
RPR $ con formato mm2dd2$$ (por ejemplo# R#ecGa=inicial N PQRSSRTQPR). 3i el operador de
comparaci3n es RliEeR# el %alor de la cadena puede contener los caracteres comod.n RUR o R=R.
(8uncionan de forma idntica# sustitu$endo a cual"uier sucesin de caracteres.) 4o acepta el
car%cter KEM (+or ejemplo# R+ais like WEsTXR o K+ais Like WEs;X encuentra EspaJa $ Estonia)
ADO no tiene los mtodos FindFirst, FindNe2t, Find*re%ious Find!ast. Deber emplear el
mtodo Find de forma inteligente para implementar estos otros.
0Ctodo (a*e
Este mtodo permite guardar el contenido de un "ecordset en un fic!ero. +uede ser mu$ 5til
cuando "ueremos e6portar ese recordset !acia otra aplicacin.
(inta?is 1i=ecordset1(a*e FileName, *ersistFormat
FileName es la ruta completa del fic!ero en el "ue se guardar% el "ecordset.
PersistFormat /Opcional). On valor "ue especifica el formato en "ue se guardar% el
=ecordset. +uede ser una de las constantes siguientes.
AdersistADTG (&alor predeterminado) 3e guarda en un formato propietario
(Advanced Data <ablegram). 4o es inteligible a simple vista#
pero genera fic!eros bastante cortos.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
A/
AAdersistX0& 3e guarda en formato @1L. Es un formato puramente en
A3,)) donde pueden verse los nombres de los campos $ su
contenido. Este formato genera fic!eros m%s grandes "ue el
AD<
3i el recordset tienen aplicado un filtro (1ediante la propiedad 8ilter) solamente guarda los
registros "ue deja ver ese filtro.
3i $a e6iste el fic!ero le dar% un error. ,ercirese "ue no e6iste (1ediante la funcin Dir) $
brrelo antes de volver a utili(ar el mtodo 3ave.
0Ctodo (eeE
Este mtodo busca un registro despla(%ndose por el recordset a lo largo de un .ndice o un
conjunto de .ndices. La b5s"ueda mediante 3eek es muc!o m%s r%pida "ue con 8ind# $a "ue
la reali(a siguiendo el ordenamiento de los registros seg5n un .ndice.
+ara poder usar el mtodo )nde6 es necesario "ue el proveedor acepte .ndices en el objeto
recordset. Esto !a llevado al autor a no poder presentar ning5n ejemplo de este mtodo# $a
"ue todas las bases de datos ensa$adas no permit.an .ndices. +uede ver si acepta .ndices
mediante el mtodo 3upports0
)f 1i=ecordset/.3upports(ad)nde6) B <rue <!en
&ea la a$uda de &B para ma$or informacin
0Ctodo $e?t"ecordset
+ara entender este mtodo es necesario e6plicar previamente como se puede crear un
recordset compuesto.
On recordset compuesto es un recordset "ue se crea concatenando sentencias 3ELE,<# $
cada una de ellas crear%# dentro del mismo =ecordset# un recordset particular. Al crear el
recordset# el recordset particular "ue va a estar activo es el correspondiente a la primera
sentencia 3ELE,<. 1ediante el mtodo $e?t"ecordset podemos ir avan(ando a travs de
los siguientes recordsets particulares. El car%cter de separacin entre las sentencias 3ELE,<
es el punto $ coma ( ' )
1i=ecordset/.Open R3elect ; 8rom =egimenes' 3elect ; 8rom =egimenT3eguimiento V!ere
=sTOrigen B QL3BQR# 1i,one6ionADO# adOpenD$namic# adLockOptimistic
(La instruccin 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 condicin distinta en la 3ELE,<.
,uando se ejecuta esa l.nea# el recordset actual es el correspondiente a la primera seleccin.
(3elect ; 8rom =egimenes). Ejecutando el mtodo 4e6t=ecordset ese recordset primero se
borra $ pasa a ser recordset actual el creado con la seleccin segunda (3elect ; 8rom
=egimenT3eguimiento V!ere =sTOrigen B QL3BQR)
3et 1i=ecordset/ B 1i=ecordset/.4e6t=ecordset
+uede usar tambin este recordset para crear un nuevo recordset a partir del primero
3et 1i=ecordset: B 1i=ecordset/.4e6t=ecordset
1i=ecordset: debe estar declarado como objeto recordset# $ creado con la instruccin 4eC0
3et 1i=ecordset: B 4eC ADOBD.=ecodset
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
A:
&a colecci@n Fields de un recordset ADO
,ontiene todos los objetos Field de un objeto "ecordset.
On objeto "ecordset tiene una coleccin Fields "ue contiene todos los objetos Field. ,ada
objeto Field se corresponde a una columna del "ecordset.
&amos a ver a"u. un truco "ue nos permite ADO. +odemos crear un recordset _3in necesidad
de una base de datosY
,uando estudiamos el objeto recordset vimos "ue el recordset se crea con una instruccin
como esta0
3et 1i=ecordset/ B 4eC ADODB.=ecordset
A!ora $a podemos abrir el recordset le$endo los datos desde una base de datos. Otili(amos
para ello el mtodo Open del recordset0
1i=ecordset/.O'en R3elect ; 8rom =egimenesR# 1i,one6ionADO# adOpenD$namic# adLockOptimistic
1ediante el mtodo Open lo "ue !ace el recordset es conocer su estructura (?ue campos
tiene# propiedades de estos campos# etc) $ el valor de cada uno de los campos de sus
registros. D?u pasar.a si en ve( de abrir el recordset le vamos aJadiendo objetos 8ield a su
coleccin 8ieldsE Lo !acemos mediante el mtodo Append0
1i=ecordset/.8ields.Append R1i,ampo/R# adBig)nt
1i=ecordset/.8ields.Append R1i,ampo:R# ad,!ar# :P
1i=ecordset/.8ields.Append R1i,ampoAR# adB3<=
Lo "ue ocurre es "ue el recordset $a tiene tres campos# el primero de nombre 1i,ampo/#
numrico Long# el segundo# un string de :P caracteres de nombre 1i,ampo:# $ el tercero# de
nombre 1i,ampoA# una cadena de caracteres de longitud indefinida# terminada en un car%cter
nulo. >a tenemos una estructura de un recordset sin necesidad de !aber le.do la base de
datos. 4o es necesario por lo tanto "ue e6ista una tabla o consulta almacenada con esa
estructura. A!ora podemos abrir el recordset0
1i=ecordset/.Open
Lo abrimos sin pasarle ning5n par%metro. A!ora $a est% abierto $ podemos trabajar con el
como con un recordset cual"uiera. =ecuerde "ue al principio est% vac.o.
1i=ecordset/.Add4eC
1i=ecordset/Y1i,ampo/ B AI
1i=ecordset/Y1i,ampo: B R-u.a del EstudianteR
1i=ecordset/Y1i,ampoA B R7ola mi amorR U vb,rLf U R>o so$ tu loboR
1i=ecordset/.Opdate
>a tenemos un registro dentro del recordset. +odemos introducirle tantos registros como
"ueramos# $ luego movernos por el recordset mediante los mtodos 1ove6666. A!ora
podremos leer el contenido del registro actual0
Label/ B 1i=ecordset/Y1i,ampo/
Label: B 1i=ecordset/Y1i,ampo:
LabelA B 1i=ecordset/Y1i,ampoA
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AA
El resultado del cdigo de el ejemplo se traducir% en algo como esto0
> a!ora vienen lo mejor. D+ara "ue "ueremos un recordset "ue no tienen datos le.dos desde
una base de datosE Las aplicaciones de esto solamente est% limitadas por la imaginacin.
+ienso# por ejemplo# en introducir en un recordset todos los datos le.dos de un fic!ero de
configuracin# $ as. tener todos esos datos disponibles durante toda la aplicacin# 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 cmodo $ m%s inteligible su cdigo.
&eamos los mtodos de la coleccin 8ields
0Ctodo A''end
Agrega un campo a una coleccin 8ields de un =ecoprdset.
3inta6is 1i=ecordset.8ields.A''end Name, =pe, Defined+ize, Attrib
Name On 3tring con el nombre del nuevo objeto Field# "ue tiene "ue ser 5nico dentro de la
coleccn 8ields.
T$pe <ipo de datos "ue va a contener ese campo. +uede tomar uno de estos valores0
adArra!
3e une en una instruccin O" lgica con otro tipo para indicar "ue los
datos son una matri( segura de ese tipo (DB<>+ETA==A>).
adBi)Int On entero con signo de F b$tes (DB<>+ET)F).
adBinar! On valor binario (DB<>+ETB><E3).
adBoolean On valor Boolean (DB<>+ETBOOL).
adB!"e#
3e une en una instruccin O" lgica con otro tipo para indicar "ue los
datos son un puntero a los datos del otro tipo (DB<>+ETB>=E8).
adB(T"
Ona cadena de caracteres terminada en nulo (Onicode)
(DB<>+ETB3<=).
adCGar On valor de tipo (trin) (DB<>+ET3<=).
adCurrenc!
On valor de tipo Currenc! (DB<>+ET,>). On valor Currenc! es un
n5mero de coma fija con cuatro d.gitos a la derec!a del signo decimal.
3e almacena en un entero con signo de F b$tes en escala de /G.GGG.
adDate
On valor de tipo Date (DB<>+ETDA<E). On valor Date se almacena
como un valor de tipo Dou8le' la parte entera es el n5mero de d.as
transcurridos desde el AG de diciembre de /FHH $ la parte fraccionaria
es la fraccin de un d.a.
adDBDate On valor de fec!a (aaaammdd) (DB<>+ETDBDA<E).
adDBTi-e On valor de !ora ())mmss) (DB<>+ETDB<)1E).
adDBTi-e(ta-'
Ona marca de fec!a $ !ora (aaaammdd))mmss m%s una fraccin de
miles de millones) (DB<>+ETDB<)1E3<A1+).
adDeci-al
On valor numrico e6acto con una precisin $ una escala fijas
(DB<>+ETDE,)1AL).
adDou8le On valor de coma flotante de doble precisin (DB<>+ET=F).
adE-'t! 4o se !a especificado ning5n valor (DB<>+ETE1+<>).
adError On cdigo de error de A: bits (DB<>+ETE==O=).
adG+ID On identificador 5nico global (-O)D) (DB<>+ET-O)D).
adIDis'atcG
On puntero a una interfa( Idis'atcG de un objeto OLE
(DB<>+ET)D)3+A<,7).
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AI
adInte)er On entero firmado de I b$tes (DB<>+ET)I).
adI+nEno,n
On puntero a una interfa( IunEno,n de un objeto OLE
(DB<>+ET)O4`4OV4).
ad&on)VarBinar! On valor binario largo (slo para el objeto ara-eter).
ad&on)VarCGar On valor largo de tipo (trin) (slo para el objeto ara-eter).
ad&on)VarDCGar
On valor largo de tipo (trin) terminado en nulo (slo para el objeto
ara-eter).
ad$u-eric
On valor numrico e6acto con una precisin $ una escala e6actas
(DB<>+ET4O1E=),).
ad(in)le On valor de coma flotante de simple precisin (DB<>+ET=I).
ad(-allInt On entero con signo de : b$tes (DB<>+ET):).
adTin!Int On entero con signo de / b$te (DB<>+ET)/).
ad+nsi)nedBi)Int On entero sin signo de F b$tes (DB<>+ETO)F).
ad+nsi)nedInt On entero sin signo de I b$tes (DB<>+ETO)I).
ad+nsi)ned(-allInt On entero sin signo de : b$tes (DB<>+ETO):).
ad+nsi)nedTin!Int On entero sin signo de / b$te (DB<>+ETO)/).
ad+serDe#ined Ona variable definida por el usuario (DB<>+ETOD<).
adVarBinar! On valor binario (slo para el objeto ara-eter).
adVarCGar On valor de tipo (trin) (slo para el objeto ara-eter).
adVariant On tipo Variant de automati(acin (DB<>+ET&A=)A4<).
adVector
3e une en una instruccin O" lgica 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=).
adVarDCGar
Ona cadena de caracteres Onicode terminada en nulo (slo para el
objeto ara-eter).
adDCGar
Ona cadena de caracteres Onicode terminada en nulo
(DB<>+ETV3<=).
DefinedSi,e On Long "ue define el tamaJo del campo si fuese necesario. (+or ejemplo
para un string)
Attri- (Opcional). Especifica los atributos del campo a aJadir. +uede tomar estos
valores0
adFld0a!De#er
)ndica "ue el campo se apla(a# es decir# los valores del campo no se
recuperan del origen de datos con todo el registro# sino solamente
cuando se tiene acceso e6pl.cito a los mismos.
adFld+'data8le )ndica "ue se puede escribir en el campo.
adFld+nEno,n+'data8le
)ndica "ue el proveedor no puede determinar si se puede escribir en el
campo.
adFldFi?ed )ndica "ue el campo contiene datos de longitud fija.
adFldIs$ulla8le )ndica "ue el campo acepta valores $ull.
adFld0a!Be$ull )ndica "ue se pueden leer valores $ull del campo.
adFld&on)
)ndica "ue se trata de un campo binario largo. <ambin indica "ue se
pueden utili(ar los mtodos Append,!unk $ -et,!unk.
adFld"o,ID
)ndica "ue el campo contiene un identificador de fila persistente en el
"ue no se puede escribir $ "ue no tiene ning5n valor significativo
e6cepto la identificacin de la fila (como por ejemplo un n5mero de
registro# un identificador 5nico# etc.).
adFld"o,Version
)ndica "ue el campo contiene alg5n tipo de marca de !ora o de fec!a
"ue se utili(a para efectuar actuali(aciones.
adFldCacGeDe#erred
)ndica "ue el proveedor almacena los valores del campo en la
memoria cac! $ "ue las lecturas siguientes se efect5an en dic!a
memoria .
0Ctodo Delete
<ericamente elimina un objeto de la coleccin Fields.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AP
3inta6is 8ields.Delete Field
Field On Variant "ue designa el objeto Field "ue se va a eliminar. Este par%metro tiene
"ue ser el nombre del objeto Field' no puede ser una posicin ordinal o el propio objeto Field.
Co-entarios
La llamada al mtodo Fields1Delete en un "ecordset abierto provoca un error de ejecucin.
/&omo )a ocurrido en otras ocasiones, al autor le )a sido imposible e.ecutar este mtodo con
los resultados esperados1
0Ctodo Ite-
3inta6is 1i=ecordset.8ields.Ite- ()nde6)
Devuelve el elemento de la coleccin Fields especificado en el .ndice. Devuelve el objeto# por
lo tanto# $ sobre ese objeto# podemos obtener las propiedades "ue deseemos. En el ejemplo
siguiente# introducimos los nombres de todos los campos en un ,omboBo6 llamado
,ombo,ampos
Dim 11 As 3tring# ) As )nteger
8or ) B G <o 1i=ecordset/.8ields.,ount N /
11 B 1i=ecordset/.8ields.)tem()).4ame
,ombo,ampos.Add)tem 11
4e6t )
0Ctodo "e#resG
Aun"ue la coleccin 8ields tiene este mtodo# la verdad es "ue no tienen efectos visibles
sobre esa coleccin.
ro'iedades de la colecci@n Fields
ro'iedad Count
Devuelve el n5mero de campos de la coleccin Fields. Es un Long.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AL

)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
A9
El O8Aeto Co--and
On objeto Co--and es la definicin de un comando espec.fico "ue se piensa ejecutar contra
un origen de datos. 1ediante un objeto ,ommand podemos crear un recordset# pero recuerde
"ue un recordset lo podemos tambin crear directamente.
Otilice un objeto Co--and para consultar una base de datos $ obtener registros en un objeto
=ecordset# para aJadir o eliminar registros# ejecutar una operacin de manejo masivo de datos
o para manipular la estructura de una base de datos.
ro'iedades del O8Aeto Co--and
ro'iedad Acti*eConnection
)ndica a "u objeto ,onnection pertenece actualmente el objeto ,ommand. Es un string con el
nombre de la cone6in.
ro'iedad Co--andTe?t
,ontiene el te6to del comando "ue se "uiere emitir al proveedor. Es un string. 3uele ser una
instruccin 3?L# un nombre de tabla o un procedimiento almacenado# o cual"uier otra
instruccin "ue recono(ca el proveedor. El valor predeterminado es una cadena vac.a.
ro'iedad Co--andTi-eout
Especifica el intervalo de espera para "ue se ejecute un comando antes de "ue finalice el
intento $ se genere un error. Es un Long "ue indica en segundos ese tiempo. El valor
predeterminado es AG.
ro'iedad Co--andT!'e ()1+O=<A4<E)
)ndica el tipo de un objeto ,ommand. Esta propiedad se usa para optimi(ar la evaluacin de la
propiedad Co--andTe?t# $a "ue de esta forma el proveedor no tiene "ue perder tiempo
e6aminando si es una instruccin 3?L# un procedimiento almacenado o un nombre de tabla. 3i
el valor de esta propiedad es adC-d+nEno,n (valor predeterminado)# estamos for(ando al
proveedor a "ue realice esa investigacin lo "ue provocar% probablemente un descenso en su
rendimiento. 3i sabe "u tipo de comando est% usando# el establecimiento de la propiedad
Co--andT!'e instru$e a ADO a "ue va$a directamente al cdigo relevante. 3i la propiedad
Co--andT!'e no coincide con el tipo de comando de la propiedad Co--andTe?t# ocurre
un error cuando llama al mtodo E6ecute.
&alores posibles
AdC-dTe?t )ndica "ue es una definicin te6tual de un comando o una llamada a
un procedimiento almacenado.
AdC-dTa8le )ndica "ue es un nombre de tabla cu$as columnas se devuelven todas
mediante una consulta 3?L generada internamente.
AdC-dTa8leDirect )ndica "ue es un nombre de tabla en la "ue se devuelven todas las
columnas.
AdC-d(toredroc )ndica "ue es un nombre de procedimiento almacenado
AdC-d+nEno,n +redeterminado. El tipo de comando de la propiedad Co--andTe?t
es desconocido.
AdC-dFile Eval5a Co--andTe?t como el nombre de arc!ivo de un valor
=ecordset persistente.
AdE?ecute$o"ecords )ndica "ue es un comando o un procedimiento almacenado "ue no
devuelve filas (por ejemplo# un comando "ue slo inserta datos). 3i se recupera alguna fila# se
descarta $ no se devuelve. 3iempre se combina con adC-dTe?t o adC-d(toredroc.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AF
ro'iedad re'ared
Es un Booleano "ue indica si se debe guardar una versin compilada de un comando antes de
su ejecucin. Esta propiedad fuer(a al proveedor a guardar una versin preparada (compilada)
de la consulta especificada en la propiedad ,ommand<e6t antes de la primera ejecucin de un
objeto ,ommand. Esto puede disminuir el rendimiento de la primera ejecucin de un comando#
pero cuando el proveedor !a$a compilado el comando# utili(ar% la versin compilada del
mismo para las ejecuciones siguientes# lo cual aumentar% el rendimiento.
3i el proveedor no admite la preparacin del comando# puede devolver un error cuando esta
propiedad se estable(ca a True. 3i no devuelve un error# simplemente ignora la solicitud de
preparar el comando $ establece la propiedad re'ared a False.
ro'iedad (tate
Describe el estado del objeto0 abierto o cerrado. Devuelve un Long o una constante0
ad(tateClosed o ad(tateO'en
0Ctodos del O8Aeto Co--and
0Ctodo E?ecute ()1+O=<A4<E# m%s bien dir.amos# el objetivo del ,ommand)
Ejecuta la consulta# la instruccin 3?L o el procedimiento almacenado especificado en la
propiedad ,ommand<e6t. Devuelve un recordset o modifica la base de datos.
3inta6is
+ara un Co--and "ue devuelva filas0
(et recordset B command.E?ecute(RecordsAffected# Parameters# Options*
+ara un Co--and "ue no devuelva filas0
command.E?ecute RecordsAffected# Parameters# Options
command es el nombre del Objeto ,ommand
RecordsAffected Opcional. Ona variable &on) en la "ue el proveedor devuelve el n5mero de
registros afectados por la operacin.
Parameters Opcional. Ona matri( Variant con los valores de los par%metros pasados con una
instruccin 3?L. (Los par%metros de salida no devuelven valores correctos cuando se pasan
en este argumento).
Options Opcional. On valor &on) o una constante. Acepta estos valores
adC-dTe?t )ndica "ue el proveedor tiene "ue evaluar &ommand=e2t como
definicin te6tual de un comando# como una instruccin 3?L.
adC-dTa8le )ndica "ue ADO tiene "ue generar una consulta 3?L para devolver
todas las filas de la tabla mencionada en &ommand=e2t.
adC-dTa8leDirect )ndica "ue el proveedor tiene "ue devolver todas las filas de la tabla
mencionada en &ommand=e2t.
AdC-d(toredroc )ndica "ue el proveedor tiene "ue evaluar &ommand=e2t como
procedimiento almacenado.
adC-d+nEno,n )ndica "ue el tipo de comando en CommandText es desconocido.
adAs!ncE?ecute )ndica "ue el comando se tiene "ue ejecutar de forma as.ncrona.
adAs!ncFetcG )ndica "ue el resto de las filas siguientes a la cantidad inicial especificada en la
propiedad CacGe(iIe tiene "ue ser recuperada de forma as.ncrona.
0Ctodo Cancel
,ancela la ejecucin de una llamada as.ncrona pendiente al mtodo E?ecute
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
AH
3inta6is 4ombredelObjeto,ommand1Cancel
Otilice el mtodo Cancel para terminar la ejecucin de una llamada as.ncrona a un mtodo
E?ecute (es decir# el mtodo fue invocado con la opcin adAs!ncE?ecute o adAs!ncFetcG).
Co-andos 'ara-etriIados1
Los objetos ,ommand pueden utili(ar par%metros. De esta forma# podemos construir una
consulta utili(ando la interrogacin (E) como comod.n. As. cada ve( "ue ejecutemos el
comando# &.B. se encargar% de sustituir el comod.n por los par%metros asociados a dic!o
co--and. Adem%s podemos utili(ar los par%metros para recoger los valores devueltos por un
+rocedimiento almacenado en la base de datos. +ara entender mejor este tipo de consultas
primero veremos "u es el objeto 'ara-eter.
EAe-'lo de la utiliIaci@n de Co--and
&eamos un ejemplo de cmo usar el Objeto ,ommand. +ero previamente vamos a ver un
cdigo del "ue !emos partido para !acer ver al alumno "ue ADO permite !acer las cosas de
muc!as maneras. Este cdigo mete los datos de un documento en una base de datos Oracle#
le$endo previamente el n5mero m%s alto del documento para poner al nuevo documento un
n5mero igual al 5ltimo a /.0
Declaraciones
Dim ,one6BD+rensa As ADODB.,onnection
Dim =sBD+rensa/ As ADODB.=ecordset
Dim 3tr)ntroducir As 3tring# 4umeroDocumento as long
=em 3e abre un objeto ,onnection para crear sobre l el recordset
3et ,one6BD+rensa B 4eC ADODB.,onnection
,one6BD+rensa.,onnection3tring B R+roviderB13DAO=A./'M U T
KOser )DB)4<=A4E<'+assCordB)4<=A4E<'Data 3ourceBintranet'M U T
K+ersist 3ecurit$ )nfoB8alseR
,one6BD+rensa.Open
=em 3e abre un recordset para leer el n5mero# se lee $ se vuelve a cerrar
=sBD+rensa/.Open R)ntTDocumentos Order B$ ,LTDO,R# ,one6BD+rensa# adOpenD$namic#
adLockOptimistic
=sBD+rensa/.1oveLast
4umeroDocumento B =sBD+rensa/Y,LTDO,
4umeroDocumento B 4umeroDocumento a /
=sBD+rensa/.,lose
(; Este es el punto donde cambia el cdigo "ue ver% m%s adelante)
=em 3e introduce en una variable tipo 3tring una instruccin para aJadir un nuevo registro
=em Esa instruccin se va a ejecutar desde el objeto ,onnection mediante su mtodo
E6ecute
3tr)ntroducir B R)nsert )nto )4<TDO,O1E4<O3 R U T
R(,LTDO,#4O1TDO,#<)<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD+<TDO,#M U T
K,LT<)+OTDO,#8),7TDO,#8E,7ATE1)3)O4TDO,#OL<)1AT7O=ATDO,#M U T
&)3)BLETDO,) &alues (R U 4umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U T
RQ#QR U <b<itulo.<ag U RQ#/H#:#/#QR U 7=ef+rensa U R2R U <b4omb8ic!<)8 U RQ#QR U Date U RQ#G#/)R
=em Observe "ue los valores tipo string introducidos (<b@@@) van entre comilla simple
=em 3e ejecuta esa instruccin desde el objeto ,onnection ,one6BD+rensa
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
IG
,one6BD+rensa.E6ecute 3tr)ntroducir
=em 3e cierra el Objeto ,onnection
,one6BD+rensa.,lose
=em A"u. termina la operacin de crear un nuevo registro
1sgBo6 RDocumento enviadoR
Este es el cdigo real de una aplicacin "ue introduce los datos el resumen de prensa diario en
una base de datos. 3e introduce un nuevo registro en la tabla )4<TDO,O1E4<O3. El
resumen de prensa es un fic!ero .<iff de nombre <b4omb8ic!<)8 "ue se mete en una carpeta
del servidor mediante 8<+# $ para su loccali(acin $ presentacin 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 &alor
,LTDO,# 4umeroDocumento (Long calculado)
4O1TDO, <b<itulo (3tring contenido en <b<itulo.<e6t)
<)<OLOTDO, <b<itulo (3tring contenido en <b<itulo.<e6t [ se repiteN)
AO<O=TDO, <b<itulo.<ag (3tring contenido en <b<itulo.<ag)
,LT<E1ATDO, /H ()nteger# dato fijo)
,LTD+<TDO, : ()nteger# dato fijo)
,LT<)+OTDO, / ()nteger# dato fijo)
8),7TDO, 7=ef+rensa U R2R U <b4omb8ic!<)8 On string "ue indica el nombre
del fic!ero (<b4omb8ic!<)8.<e6t) $ su carpeta (&ariable 7ref+rensa)
8E,7ATE1)3)O4TDO, Date (8ec!a actual)
OL<)1AT7O=ATDO, G (B$te# dato fijo)
&)3)BLETDO, / (B$te# dato fijo)
Esta forma de introducir los datos# mtodo "ue los lingbistas especiali(ados en la jerga
inform%tica llaman 4a cap3n5# es la "ue nunca falla. E6ige un poco de cdigo# con muc!as
probabilidades de e"uivocarse# pero muc!as veces se prefiere esta forma de meter datos a
utili(ar el mtodo Add4eC. <iene la gran ventaja de "ue la acepta cual"uier base de datos#
independientemente de donde est el cursor. 7abr% observado "ue utili(amos el mtodo
E?ecute del objeto ,onnection. > as. funciona perfectamente. &amos a !acer lo mismo# pero
introduciendo la cadena de caracteres un objeto Co--and# (?ue pertenece al mismo objeto
,onnection sobre el "ue a!ora !emos ejecutado el E6ecute) $ vamos a ejecutar el E6ecute de
ese ,ommand. C+e da cuenta que estamos )aciendo lo mismoD El nuevo cdigo creado a
partir del anterior es el siguiente0
(; Este es el mismo punto de antes. A"u. comien(a el cambio del cdigo)
Dim 1i,omando As ADODB.,ommand
3et 1i,omando B 4eC ADODB.,ommand
1i,omando.Active,onnection B ,one6BD+rensa
1i,omando.,ommand<e6t B R)nsert )nto )4<TDO,O1E4<O3 R T
U
R(,LTDO,#4O1TDO,#<)<OLOTDO,#AO<O=TDO,#,LT<E1ATDO,#,LTD+<TDO,#,LT<)+
OTDO,#8),7TDO,#8E,7ATE1)3)O4TDO,#OL<)1AT7O=ATDO,#&)3)BLETDO,) R T
U R&alues (R T
U 4umeroDocumento U R#QR U <b<itulo U RQ#QR U <b<itulo U RQ#QR U <b<itulo.<ag U RQ#/H#:#/#QR U
7=ef+rensa U R2R U <b4omb8ic!<)8 U RQ#QR U Date U RQ#G#/)R
1i,omando.E6ecute
,one6BD+rensa.,lose
ADO le permite !acer las cosas de maneras mu$ distintas# pero siempre debe aportar la
misma informacin. En este caso !a visto "ue el objeto ,ommand no !ace falta para nada.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
I/
DEntonces# para "ue e6isteE La respuesta es sencilla0 facilita la comprensin del cdigo. +ero
"ue el objeto ,ommand no le perjudi"ue precisamente eso# la comprensin del cdigo. 4o se
preocupe de no ser estrictamente acadmico. Este !umilde autor nunca usa ,ommand
e6cepto para e6plicarlo. ADO nos permite eso.
&amos a ver a!ora cmo !ar.amos esto mismo con el mtodo Add4eC.
Deberemos crear un recordset. Lo primero# lo declaramos0
Dim =sBD+rensa as ADODB.=ecodset
Luego lo creamos0
3et =sBD+rensa B 4eC ADODB.=ecordset
Lo abrimos. +ero primero tomamos la precaucin de poner la propiedad ,ursorLocation del
Objeto ,onnection a adOse,lient (Lado cliente) $ de esta forma los cursores creados para los
recordsets abiertos sobre ese objeto connection estar%n del lado cliente. 3i el cursor est% de
lado servidor es posible "ue no nos deje usar el mtodo Add4eC. (&ea 4ota /)
,one6BD+rensa.,ursorLocation B adOse,lient
Abrimos el =ecordset0
=sBD+rensa.Open R)ntTDocumentosR# ,one6BD+rensa# adOpenD$namic# adLockOptimistic
Ejecutamos el mtodo Add4eC
=sBD+rensa.Add4eC
1etemos los datos
=sBD+rensaY,LTDO, B 4umeroDocumento
=sBD+rensaY4O1TDO, B <b<itulo
=sBD+rensaY<)<OLOTDO, B <b<itulo
=sBD+rensaYAO<O=TDO, B <b<itulo.<ag
=sBD+rensaY,LT<E1ATDO, B /H
=sBD+rensaY8E,7ATE1)3)O4TDO, B Date
=sBD+rensaY,LTD+<TDO, B :
=sBD+rensaY,LT<)+OTDO, B /
=sBD+rensaY8),7TDO, B 7=ef+rensa U R2R U <b4omb8ic!<)8
=sBD+rensaY&)3)BLETDO, B /
=sBD+rensaYOL<)1AT7O=ATDO, B G
=ematamos con el mtodo Opdate
=sBD+rensa.Opdate
,erramos el recordset.
=sBD+rensa.,lose
,erramos la cone6in
,one6BD+rensa.,lose
Nota >. H Muc)os programadores se rinden cuando %en que no les funciona los mtodos
AddNe; I ,pdate para introducir nue%os datos. &ierto es que cada base de datos se comporta
de forma distinta respecto a este mtodo. *ero antes de rendirse usar el c3digo 4a cap3n5
intente %er como tienen la propiedad &ursor!ocation, el tipo de recordset abierto el tipo de
bloque elegido /-ecuerde que por defecto es de solo lectura1. $so s#, el mtodo 4a cap3n5
funciona siempre /$2cepto que sea solo lectura1, independientemente del bloqueo del tipo de
cursor
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
I:
El VControl DataW de ADO - (Adodc ADO Data Control)
Este cap.tulo parece "ue "uedaba un poco corto. 4o por el n5mero de p%ginas# sino por"ue
tanto en DAO como en =DO nos e6pla$amos con el control Data# $ en ADO parece "ue
solamente lo !emos visto de pasada para e6plicar cmo se compone la cadena de cone6in.
&e%moslo un poco m%s en profundidad.
El control Data para ADO es el V0icroso#t ADO data control X16 (O&EDB)W "ue se encuentra
en +ro$ecto c ,omponentes. La apariencia es similar a la del Data de DAO
7agamos un repaso de sus propiedades. &eremos solamente a"uellas "ue son espec.ficas de
ADO0
ro'iedad BOFAction1
Establece la forma de proceder cuando llega a la fila anterior a la primera. <oma uno de estos
valores0
G [ adDo1ove8irst &uelve a la primera fila
/ [ adDo3ta$BO8 +ermanece en la fila BO8
ro'iedad Co--andT!'e
Es idntica a la misma propiedad del objeto ,ommand. Acepta los valores0
AdC-dTe?t )ndica "ue es una definicin te6tual de un comando o una llamada a
un procedimiento almacenado.
AdC-dTa8le )ndica "ue es un nombre de tabla cu$as columnas se devuelven todas
mediante una consulta 3?L generada internamente.
AdC-d(toredroc )ndica "ue es un nombre de procedimiento almacenado
AdC-d+nEno,n +redeterminado. El tipo de comando de la propiedad Co--andTe?t
es desconocido.
ro'iedad Connection(trin)
Esta propiedad $a le !emos visto m%s atr%s. Es la cadena de cone6in con la base de datos.
ro'iedad Cursor&ocation
Es la misma "ue la vista para el objeto =ecordset.
ro'iedad CursorT!'e
Es la misma "ue para el objeto =ecordset. Acepta los valores0
/ [ adOpen`e$set
: N adOpenD$namic
A [ adOpen3tatic
ro'iedad EOFAction
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
IA
Establece la forma de proceder cuando llega a la fila EO8. Acepta los valores0
G [ adDo1oveLast &uelve a la 5ltima fila
/ [ ad3ta$EO8 +ermanece en la fila EO8
: [ adDoAdd4eC AJade una nueva fila
ro'iedad &ocET!'e
<ipo de Blo"ue. )gual a la misma propiedad del Objeto =ecordset
ro'iedad 0a?"ecords
Es similar a la del Objeto =ecordset. Establece el n5mero de filas "ue obtiene en su recordset
asociado.
ro'iedad 0ode1
)gual a la misma propiedad del objeto =ecordset
ro'iedades ass,ord
Establece la contraseJa para crear la cadena de cone6in durante la creacin del objeto
=ecordset asociado. Esta contraseJa es la contraseJa del usuario en la base de datos.
Esta propiedad es solamente de escritura. 3i se pretende leer da error.
ro'iedad +ser$a-e
Establece el nombre del usuario. Debe ser uno de los usuarios registrados en la base de datos.
Esta propiedad es de lectura $ escritura. El valor de la propiedad +assCord debe ser el
asociado a este usuario.
ro'iedad "ecord(ource
Es una cadena de caracteres con el nombre de una tabla o una sentencia 3?L "ue devuelve
filas.
0Ctodos del control Adodc
+'dateControls
Actuali(a la informacin de los controles enla(ados a datos. 4o e6iste el mtodo
Opdate=ecords.
"e#resG
&uelve a construir el recordset. Es idntico al del control Data de DAO.
&istas $a las propiedades $ mtodos del control Adodc# vamos a ver un poco como funciona $
cuales son sus diferencias con el control data de DAO
Funciona-iento del Adodc
El Adodc puede enla(ar una base de datos a los t.picos controles enla(ados (Label# <e6tBo6)
usando la tecnolog.a ADO. Los dem%s controles enla(ados no tienen un comportamiento igual
con el Adodc# ,ontrol Data o =DOData,ontrol. En la siguiente lista puede ver "ue controles
trabajan con uno u otro control Data.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
II
,ontrol ADO =DO DAO =eferencia
DB-rid 4O 3) 3) 1icrosoft Data Bound -rid ,ontrol P.G 3+A
Data-rid 3) 4O 4O 1icrosoft Data-rid ,ontrol L.G (OLEDB)
DataList 3) 3) 3) 1icrosoft Data List ,ontrols L.G (OLEDB)
Data,ombo 3) 3) 3) 1icrosoft Data List ,ontrols L.G (OLEDB)
DBList 3) 3) 3) 1icrosoft Data Bound List ,ontrols L.G
DB,ombo 3) 3) 3) 1icrosoft Data Bound List ,ontrols L.G
138le6-rid 4O 3) 3) 1icrosoft 8le6-rid ,ontrol L.G
1378le6-rid 3) 4O 4O 1icrosoft 7ierarc!ical 8le6-rid ,ontrol L.G (OLEDB)
+or lo dem%s el funcionamiento del Adodc es similar al ,ontrol data $ al =DOData,ontrol.
,on este cap.tulo creo "ue $a tienen conocimientos suficientes para empe(ar a trabajar con
ADO# $ por la tanto# $a tiene permiso para aprender a programar con esta tecnolog.a. Le
recomiendo paciencia# $ sobre todo no tener miedo a esta tecnolog.a. > como se dijo al
principio# 5sela siempre "ue tenga "ue usar una base de datos instalada en un servidor $
conectada al usuario a travs de una red de %rea local. En el pr6imo cap.tulo ver% como se
enla(an un cliente con el servidor 3?L 3erver.
De cual"uier forma no olvide la tecnolog.a DAO para sus pe"ueJas aplicaciones# con la base
de datos en el mismo ordenador "ue la aplicacin. +ersonalmente creo "ue es muc!o m%s
r%pida $ m%s sencilla.
3uerte.
)ng. *. +aredes ,. &isual Basic -u.a del Estudiante +%gina
IP

También podría gustarte