You are on page 1of 46

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 muy rebuscadas,
que ms que facilitar el estudio, atemorizan al principiante. La Gua del Estudiante pretende
quitar esos velos que ocultan la sencillez de lo cotidiano y mostrar la facilidad de esta tcnica.
Con el estilo didctico que caracteriza a este libro, pasaremos de las definiciones gloriosas e
iremos a lo verdaderamente 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 herramienta de nivel inferior que le de acceso universal a los
datos con independencia del origen de datos, ya sea un servidor de correo electrnico, una hoja
de clculo 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 Visual Basic; para ello
utilizaremos los objetos ADO que permiten acceder a la prctica totalidad de las funciones de
OLE DB.

Aplicacin que accede a los datos

O
L
E

Bases de datos
Relacionales

D
B

A
D
O

O
D
B
C

Texto

Modelo de datos ADO


R
D
O
D
A
O

O
D
B
C

Bases de datos
relacionales

Modelo DAO/RDO

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 1

Las caractersticas generales de ADO son:


Mayor velocidad y facilidad de uso.
Menor carga de memoria y de espacio en el disco duro.
Las caractersticas especficas que proporciona ADO para entornos de Cliente/Servidor (C/S)
son:
Creacin de los objetos de forma independiente. No se necesita navegar por ninguna
jerarqua de objetos para poder crearlos. La mayora de los objetos se pueden
instanciar de forma independiente. De esta forma crearemos solo los objetos que
necesitemos.
ADO nos permite utilizar los procedimientos almacenados en el sistema gestor de la
base de datos (si este soporta esta funcionalidad), pudiendo recoger los resultados
devueltos por dichos procedimientos como parmetros de salida. Esta caracterstica
permite mejorar el rendimiento y la rapidez de las aplicaciones.
Diferentes tipos de cursores.
Soporte para limitar el nmero mximo de registros devueltos de una sola vez en un
recordset. Esta caracterstica mejora el rendimiento tanto de la aplicacin como de la
red.
Soporte para recibir varios recordset como resultados devueltos de un procedimiento
almacenado.
Hay que tener en cuenta que todas estas caractersticas estn limitadas por el servidor de los
datos. Es decir, si el servidor de datos no soporta procedimientos almacenados, no podremos
utilizar con l las caractersticas de ADO que se refieren a dichos tipos de procedimientos.
Fig 72.1 Jerarqua de Objetos ADO.
*

Connection

Error*

Errors
Command*

Parameter*

Parameters
Recordset
*

Field*

Fields

* Todos los objetos marcados con un asterisco contienen la coleccin Properties con un
subconjunto de objetos Property.
Properties
Property
Como puede verse en la figura, existen tres objetos principales dentro de ADO: El objeto
Connection, el objeto Command y el objeto recordset. Luego veremos algunas de las
caractersticas principales de cada uno de estos objetos.
Antes de proseguir con estos objetos vamos a explicar donde y porqu se deben utilizar objetos
ADO en vez de objetos DAO u objetos RDO
Hasta ahora habamos utilizado bases de datos Access, y tambin otras bases de datos
sencillas como dBase. Acceder a Access es extremadamente fcil. Y ello es debido a que
Access es una base de datos sin grandes aspiraciones en cuanto a seguridad. Es una gran
base de datos, y tiene sus dispositivos de seguridad en cuanto a permisos de acceso (Vea El
dbEngine. Visin desde DAO y la propiedad SystemDB en el Captulo 12) sin embargo estas
posibilidades se usan en muy pocas ocasiones, y estos mecanismos de seguridad de Access

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 2

tampoco son una maravilla. Por lo tanto Access se ha quedado como una gran base de datos
para aplicaciones que no pasen de algunos centenares de miles de registros y con pocos
puestos de operacin. En esta base de datos, el mtodo ideal de acceso es DAO, bien
directamente o a travs de ODBC Direct. Cuando se accede directamente, la BD se suele
buscar bien mapeando el disco del servidor como una unidad ms del puesto cliente, o bien
accediendo a travs de la direccin IP del servidor.
Cuando queremos empezar a tener una seguridad en los accesos, disponer de privilegios
distintos para cada usuario, trabajar en una red de rea local con muchos usuarios, hay que
recurrir a bases de datos tipo Oracle o SQLServer. Ya empezamos a tener problemas: Visual
Basic no puede acceder directamente a abrir estas bases de datos. Podemos acceder a travs
de ODBC, pero como ya se dijo en el, captulo correspondiente, ODBC se ha quedado obsoleto.
Y Microsoft ha sacado para ello ADO. Y ADO permite abrir la base de datos usando para ello un
dispositivo intermedio que es el proveedor OLE DB. Este no es ms que una DLL. Mejor dicho,
un juego de DLLs que puede ver en la carpeta:
C:\Archivos de Programa\Archivos Comunes\System\Ado
Estas DLLs permiten conectar con las bases de datos ms conocidas (Oracle, SQLServer,
Access y las dems BD controladas por el motor Jet). ADO funciona de forma diferente a
ODBC. Con ODBC se preparan conexiones permanentes en el ordenador, y cualquier
programa puede acceder a la BD a travs de esas conexiones. Con ADO no hay que preparar
previamente ninguna conexin. Es el propio programa el que llama al proveedor de datos OLE
DB y le pasa como parmetros los datos necesarios para que este realice la conexin y abra la
BD. Si hubiese dos programas ejecutndose simultneamente y accediendo a la misma base
de datos a travs de ADO, cada programa prepara una conexin a esa BD. En ODBC
podramos ver las conexiones existentes en el PC a travs del Panel de Control | Fuentes de
Datos ODBC. En ADO no existe esa posibilidad ya que, como se ha dicho, es el propio
programa quien crea esa conexin al ajecutarse.
Para que VB pueda acceder a ADO es necesario introducir en el programa la referencia a
Microsoft ActiveX Data Objets 2.1 Library (Proyecto|Referencias)
Una particularidad de ADO frente a lo ya visto con DAO o RDO es que ADO se salta la
jerarqua a la hora de crear nuevos objetos. En DAO, el objeto DAO superior creaba al objeto
DAO inferior (Recuerde aquello del juego de nios). En ADO podemos crear cada objeto sin
que exista el objeto inmediatamente superior. Por ejemplo podemos crear un recordset sin que
exista el objeto Connection. Claro que en este caso, a la hora de crear el objeto recordset
deberemos indicarle, mediante los parmetros que debemos aportar en la sintaxis de creacin
del recordset, todos aquellos datos que le aportaramos a la creacin del objeto Connection.
Como ve no tiene ventajas. Solamente que nos desentendemos un poco de abrir y cerrar el
objeto Connection.
Veamos como se crea la conexin: Mediante el Objeto Connection
EL OBJETO CONNECTION
El objeto Connection representa una sesin con el origen de los datos. Dependiendo de la
funcionalidad del proveedor de los datos podremos utilizar determinadas propiedades, mtodos
y colecciones de este objeto. La funcin de este objeto es recoger toda la informacin del
proveedor de los datos que se va a utilizar para crear un objeto recordset.
Para crear un objeto Connection, previamente debemos declararlo como variable objeto
Connection:
Dim MiConexion as ADODB.Connection
El sitio donde se debe declarar depende como siempre, del mbito que deseamos que tenga
ese objeto.

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 3

Para crear el objeto Connection deberemos utilizar la siguiente sintaxis:


Set MiConexion = New ADODB.Connection
Nota: En el caso de que ejecutemos la aplicacin y nos salga un error diciendo que el tipo no
est definido por el usuario, es que no hemos aadido la referencia de Microsoft Actives Data
Objects Library x.x
La conexin est creada?. S, pero de momento es completamente intil ya que no sabe ni
siquiera que base de datos debe abrir, ni con que usuario, ni las condiciones en las que debe
abrir esa base (Solo lectura, etc.) Esta informacin se la pasamos mediante la propiedad
ConnectionString (Cadena de conexin)
La propiedad ConnectionString
Es la propiedad ms importante del objeto Connection. Se basa en encadenar una serie de
argumentos en una cadena de caracteres. Los diferentes argumentos son (dependiendo del
proveedor OLE DB y de la configuracin de la red, se necesitarn todos o parte de ellos)
Provider

Especifica el nombre del proveedor que se usa en la conexin. (Oracle,


SQLServer, Jet, etc)
Data Source Especifica el nombre de la fuente de datos para la conexin. (Nombre de la
base de datos a la que se va a acceder.
User Id
Especifica el nombre de usuario que abre la conexin. Debe ser un usuario ya
declarado en la base de datos.
Password
Especifica la clave utilizada por el usuario para abrir la conexin. Debe coincidir
con el que tiene ese usuario registrado en la Base de datos.
File Name
Especifica el nombre del fichero especfico de proveedor, que contiene la
informacin de configuracin de la conexin. Este fichero es til en
instalaciones en red que requieran modificaciones de conexin frecuentes.
Remote Provider
Especifica el nombre de un proveedor de datos remoto cuando se
utiliza una conexin cliente/servidor
Remote Server
Especifica el nombre del camino al servidor que se va a usar cuando
se establece una conexin cliente/servidor
Como ejemplo para la conexin a una base de datos Oracle, con el usuario que esa BD tiene
por defecto (scott) y el Password de este usuario (tiger) tendremos que especificar en el
ConnectionString la siguiente cadena de caracteres.
Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=MADRID;
donde el valor de Source es la cadena de conexin de Oracle que previamente tiene que estar
configurada con el SQL*Net o Net8 de Oracle.
Si lo que queremos es crear una conexin con una base de datos Access 2000
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\GuiadelEstudiante\PruebaADO.mdb;
Si la base de datos es de Access 97 entonces tendremos que especificar otro provider:
Provider=Microsoft.Jet.OLEDB.3.5;Data Source=C:\GuiadelEstudiante\db1.mdb;

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 4

Para una base de datos SQLServer


"Provider=SQLOLEDB.1;Password=ayudas01; User ID=ayudas01; Initial
Catalog=Ayudas_M; Data Source=ayudas_sql" (en una lnea nica)
Como puede comprobar, resulta una tanto complicado construir la cadena de conexin y
mientras que seamos novatos en ADO podemos tener problemas para crear esta cadena.
Pero es que no existe una manera ms fcil de construir esta cadena? Efectivamente. Hay un
pequeo truco mediante el cual no solo podemos crearla con un asistente, sino que adems
probaremos si la conexin es satisfactoria o no.
Truco para construir la cadena de conexin.
1) Primero tenemos que incluir el componente Microsoft ADO data control 6.0 (OLEDB).
Podemos hacerlo pulsando Ctrl.-T o en el men Proyecto Componentes.
2) Metemos en nuestro formulario el control y pulsamos F4 para ver sus propiedades.
3) Hacemos Click en la propiedad
ConnectionString y nos
aparecer el botn de puntos
suspensivos. Hacemos Click en
el botn.
4) Ahora nos aparece el asistente
que nos mostrar 3 opciones.
Utilizar un DSN de archivo,
utilizar un controlador ODBC o
utilizar una cadena de conexin.
En todos los casos, a la
derecha de la opcin hay una
opcin
que
nos
permite
seleccionar o generar el origen
de los datos. Usaremos la
cadena de conexin (opcin por
defecto) y pulsaremos el botn
generar.

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 5

5) Al pulsar el botn generar, nos aparece otra ventana en la que tenemos cuatro
pestaas aunque nicamente necesitaremos dos de ellas para crear una cadena de
conexin correcta y probada. El resto de las pestaas forman parte de otro captulo
exclusivo del control data de ADO, aunque le invito a que curiosee por ellas.
Seleccionaremos el proveedor de datos que queramos utilizar y pulsaremos el botn
siguiente para pasar a la siguiente pestaa.

6) En la Pestaa conexin, tenemos que proporcionar los datos correspondientes al


proveedor de la base de datos a la que queremos conectar. Por ejemplo para conectar
con una base de datos de tipo MS Access (MS Jet 4.0 OLEDB Provider para la versin
2000 de Access, MS Jet 3.5 OLEDB Provider para la versin 97 de Access), tenemos
que decirle el nombre y path de la BD. Para ello podemos utilizar el botn de los puntos
suspensivos, que abrir una ventana que permitir seleccionar el archivo .mdb . Si
utilizamos el proveedor de datos de Oracle, tendremos que indicarle como nombre de
servidor la cadena de conexin utilizada en el SQL Net o en el Net8 de Oracle (la
misma cadena que especifica cuando se conecta a travs de SQL*Plus).
En esta pestaa existen dos opciones interesantes:
Contrasea en Blanco, si la marcamos no nos permitir teclear la contrasea.
Permitir guardar la contrasea, dependiendo de si est o no seleccionada,
incluir o no en la cadena de conexin la clave del usuario. Para la primera
prueba le recomiendo que la marque. No obstante, haga diferentes pruebas
con ellas para ver los resultados.
Despus de haber dado esta informacin, pulsaremos el botn Probar conexin. En el
caso de que haya algn error, el asistente nos lo indicar con un mensaje.

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 6

Prueba de conexin (fallida) con Proveedor de datos de Oracle

Prueba satisfactoria
7) Una vez que hemos probado satisfactoriamente la conexin, pulsaremos aceptar y
volveremos a la pantalla inicial, la de las 3 opciones. La diferencia es que ahora
tenemos la cadena de conexin rellenada por el asistente. Ahora podemos copiarla con
ctrl.-C y llevarla a la parte del cdigo donde queremos establecer la conexin. No se
olvide de que es una cadena y que cuando se asigne a la propiedad ConnectionString
debe ir entre comillas dobles.
8) Una vez que hemos probado que funciona al abrir el objeto Connection, No debemos
olvidarnos de eliminar el control data de ADO y de quitar el componente de nuestro
proyecto, salvo que lo vayamos a utilizar para otra cosa.
Ya conocemos el truco para formar la cadena de conexin y se la hemos introducido en la
propiedad ConnectionString Ya est creada la conexin? S, pero todava no sirve para
obtener datos de la base de datos. Pero ya hemos avanzado mucho. Ahora nuestro programa
ya sabe al menos, como poder abrir esa base de datos, pues conoce su nombre, usuario que la
abre y Password. Solamente queda aplicar un mtodo del objeto Connection: el mtodo Open
con una sintaxis que no es excesivamente difcil:
Miconexin.Open

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 7

La conexin se va a realizar a una base de datos que est en un servidor. Este servidor puede
definirse, bien por su direccin IP o por su nombre. Lo normal es definirlo por su nombre
(Server_SQL_Mae) y no por su direccin IP. Obviamente el nombre del servidor corresponder
a una direccin IP (Vamos a considerar una red IP esttica, pues si pretendemos entrar a
explicar lo que es una red con direcciones IP asignadas dinmicamente se nos complica la
explicacin). Esa direccin IP debemos indicrsela al PC en el fichero Hosts (o Lmhosts) que
estn en la carpeta Windows o en una de sus subcarpetas. En estos ficheros explica como
hacerlo. No se extrae si, una vez indicado en ese fichero, sigue sin encontrarlo. La primera
conexin con el servidor la busca mediante llamadas broadcast en la red que no siempre son
bien tratadas por los routers. En muchas ocasiones he tenido que buscar el servidor a mano
(entorno de red) y, milagros de Windows, a partir de esa operacin ya lo encuentra sin
problemas.

Para seguir un poco el ejemplo que acompaa a este captulo, vamos a ver el cdigo utilizado
para crear la conexin. En el ejemplo usamos una base de datos Access (No es la mejor para
demostrar como funciona ADO, pero es la que los alumnos van a tener con mayor facilidad.
Una base Oracle o SQL no se instala fcilmente en un ordenador personal)
Set MiConexion = New ADODB.Connection
'MiConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False"
'MiConexion.Open
Ahora nuestro programa ya est en contacto con la base de datos. Lo que falta ya lo puede
suponer: crear un recordset.
Aqu vamos a ver la primera diferencia con DAO. El recordset no lo crea el objeto Connection.
Se crea l a s mismo. Para que pueda existir un objeto Recordset primero hay que declararlo:
Dim MiRecordset As ADODB.Recordset

(Hay que declararlo en el sitio adecuado


dependiendo del mbito que necesite)

En el procedimiento donde se vaya a crear el recordset, para crearlo utilizaremos la siguiente


sintaxis:
Set MiRecordset = New ADODB.Recordset

(Ya est creado. Pero no est abierto, ahora


hay que abrirlo)

MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic


Ya tenemos abierto el recordset. En este caso el recordset est formado por todos los registros
con todos sus campos de la tabla Alumnos, que est en la base de datos definida en la
conexin MiConexion, es del tipo Dynamic y el bloqueo de escritura es optimista.
Podramos elegir ciertos registros, y solamente unos campos. Utilizaramos una sentencia SQL
MiRecordset.Open "Select Alumno_Nombre, Alumno_Ape1, Alumno_Ape2 From Alumnos " _
& Where Alumno_Nombre = Luis, MiConexion, adOpenDynamic, adLockOptimistic
Si no hubisemos creado previamente el objeto Connection, podramos crear y abrir igualmente
este objeto recordset, pero, en vez de pasarle el nombre de la conexin (MiConexion) le
pasaramos la cadena de conexin usada para crear ese objeto Connection.

Set MiRecordset = New ADODB.Recordset

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 8

MiRecordset.Open "Alumnos", "Provider=Microsoft.Jet.OLEDB.4.0;Data


Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False",
adOpenDynamic, adLockOptimistic
(Es solamente una lnea. Ha sido Word quien la ha troceado)
Ahora ya podemos presentar los campos del recordset, usando la sintaxis que ya conocemos
de DAO
TbNombre = & MiRecordset!Alumno_Nombre
TbApe1 = & MiRecordset!Alumno_Ape1
TbApe2 = & MiRecordset!Alumno_Ape2
Hagamos una pequea pausa. Observe que hay diferencias de trabajar con ADO o hacerlo con
DAO.
Con DAO.
Declarar MiSesion, MiBase y MiRecordset
Dim MiSesion as Workspace
Dim MiBase As DataBase
Dim MiRecordset as Recordset
Crear el objeto Workspace, el objeto DataBase y el objeto Recordset
Set MiSesion = Workspaces(0)
Set MiBase = MiSesion.OpenDatabase (C:\GuiadelEstudiante\Alumnos.Mdb)
Set MiRecordset = MiBase.OpenRecordset (Alumnos, dbOpenDynaset)
Con ADO (Creando el objeto Connection)
Declarar MiConexion y MiRecordset
Dim MiConexion As ADODB.Connection
Dim MiRecordset As ADODB.Recordset
Crear la conexin y ponerle la cadena de conexin en su propiedad ConnectionString
Set MiConexion = New ADODB.Connection
MiConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False"
Abrir el objeto Connection
MiConexion.Open
Crear el objeto recordset
Set MiRecordset = New ADODB.Recordset
Abrir el objeto Recordset
MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic
Con ADO (Sin crear el objeto Connection)
Declarar MiRecordset
Dim MiRecordset As ADODB.Recordset
Crear el Recordset
Set MiRecordset = New ADODB.Recordset
Abrir el Recordset
MiRecordset.Open "Alumnos", "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\GuiaDelEstudiante\ADO\PruebaADO.mdb;Persist Security Info=False",
adOpenDynamic, adLockOptimistic
Observe siempre que tanto en las declaraciones del objeto Connection y del objeto Recordset,
como en su creacin, debemos anteponer siempre la palabra ADODB

Ing. J. Paredes C.

Visual Basic Gua del Estudiante

Pgina 9

Tanto el objeto Recordset como el objeto Connection se debern cerrar cuando ya no se


utilicen, o al menos, al cerrar la aplicacin. Esto es tanto ms necesario cuanto mayor sea la
seguridad de la base de datos que vamos a utilizar. En algunas bases de datos, dejar una
sesin abierta significa dejar una aplicacin zombie ejecutndose en el servidor, que habr que
cerrar desde su propio sistema operativo. Este problema no le va a ocurrir utilizando Access,
pero como ya se dijo al principio, Access no es el mejor ejemplo de utilizacin de ADO. Para
cerrar una sesin y un recordset utilizaremos el mtodo Close
MiRecordset.Close
MiSesion.Close

(Recuerde que debe cerrar antes el recordset que la conexin)

Qu pasa con el equivalente del Workspace?


Cuando resumamos en la pgina anterior el cdigo a usar si usbamos DAO o ADO, pareca
(aunque no fuese cierto) que podamos asimilar estos objetos
DAO

ADO

Recordset
DataBase
WorkSpace

Recordset
Connection

Efectivamente el Workspace no tiene algo que pudisemos decir equivalente en ADO. Esto
es debido a que ADO ya considera que el acceso desde los usuarios lo gestiona directamente
la base de datos. Recuerde que el Workspace en DAO era una sesin de trabajo de la base
de datos, donde podamos asociar un Workspace a cada usuario. ADO ya le pasa a la BD el
nombre del usuario y su Password para que la propia base de datos quien autorice a ese
usuario.
Algunas cosas que le van a ocurrir cuando ya haya creado el recordset.
El empleo de bases de datos complejas en cuanto a seguridad nos va a obsequiar con
limitaciones a los recordsets que vamos a abrir en ADO. Y adems esas sorpresas van a ser
distintas si usa uno u otro tipo de base de datos. (nos centraremos solamente en Oracle y
SQLServer. Access, con la modestia que le caracteriza, no va a dar ningn problema.)
Los recordsets abiertos mediante una consulta SQL (aquellos en los que seleccionamos parte
de los registros mediante Select Where van a crearse solo de lectura. Independientemente
de los parmetros que le pasemos a la hora de crearlos. La descripcin del error va a ser algo
as como que el cursor es solamente de lectura. Tambin observar con frecuencia, cuando
intente ir a un registro anterior al actual, MiRecordset.MoveFirst, p.e.) que le enviar un error
diciendo que el cursor es solamente de avance hacia a delante. Estos efectos los observar
tambin cuando use la instruccin SQL Order By. No hay que arrojar la toalla solamente por
esto. Cuando eso ocurra, lo que hay que hacer es volver a crear el recordset de forma que
acepte escritura y movimiento hacia atrs. Eso generalmente se logra abriendo el recordset
con todos los registros de la tabla, e incluyendo en l todos los campos.
En vez de :
MiRecordset.Open "Select Alumno_Nombre, Alumno_Ape1, Alumno_Ape2 From Alumnos " _
& Where Alumno_Nombre = Luis, MiConexion, adOpenDynamic, adLockOptimistic
usar esta otra alternativa:
MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic
Posiblemente necesitemos crear dos recordsets en un mismo procedimiento. Por ejemplo, es
muy tpico tener que buscar el ltimo registro para ver el ltimo nmero de un identificador de
registro (Alumno_ID) y poner en este campo, al registro que vamos a crear, un nmero igual a

Ing. J. Paredes C.
10

Visual Basic Gua del Estudiante

Pgina

ese ms 1. En ese caso, abriramos el recordset usando la sentencia Order By Alumno_ID.


Cuando queramos introducir un nuevo registro mediante:
MiRecordset.AddNew
nos dir que el cursor (el recordset, para entendernos) es
solamente de lectura. La solucin es, abrir el recordset con la sintaxis anterior, leer el nmero
de Alunmo_ID, cerrar el recordset, crear otro recordset con el mismo nombre, usando la
sintaxis:
MiRecordset.Open "Alumnos", MiConexion, adOpenDynamic, adLockOptimistic
Ahora ya nos permitir usar el mtodo AddNew. Basta con aadir las lneas de cdigo
adecuado para introducir los valores en cada campo:
Mirecordset.AddNew
MiRecordset!Alumno_ID = Valor numrico
MiRecordset!Alumno_Nombre = Valor string
Etc.
.
MiRecordset.Update
No renuncie nunca a intentar hacer esto. No siempre funciona. Pero esto es mucho ms
sencillo que introducir los datos a capn utilizando la instruccin SQL Insert que ya veremos
ms adelante. SQLServer es bastante ms dcil que Oracle para usar el mtodo AddNew.
A este respecto, hay que citar la propiedad CursorLocation que veremos ms adelante. Si
creamos un cursor lado cliente, seguramente nos permitir utilizar ms opciones (entre ellas
AddNew) que si lo establecemos de lado servidor. Tenga en cuenta que si usa un cursor lado
cliente, el recordset no se actualiza cuando otro usuario realiza modificaciones en la base.
Modificar datos mediante EDIT
En ADO no hace falta usar Edit para modificar los datos del registro actual. Edit no existe en
ADO. Para modificar un dato basta con poner el mismo cdigo que utilizbamos en DAO, pero
sin comenzar por la lnea Mirecordset.Edit. Colocndonos en el registro a modificar pondremos:
MiRecordset!Alumno_Nombre = Pedro
MiRecordset!Alumno_Ape1 = Perez
MiRecordset.Update
De cualquier forma, esto tampoco tiene porque funcionar en todas las bases de datos. En ese
caso tendremos que recurrir, al igual que para un registro nuevo, a las instrucciones SQL, que
en este caso ser Update. Pero ya lo veremos ms adelante. Hasta ahora solamente he
querido usar el cdigo ms simple para que pueda empezar con ADO, y sobre todo, para que
vea que esta es una tcnica completamente accesible, aunque, dadas las grandes prestaciones
que tiene, un poco ms adelante se va a complicar algo.
Ya ha visto que podemos trabajar perfectamente con recordsets, tal como lo hemos hecho con
el DAO de toda la vida. Pero ya lo comentbamos al principio, parece que hay que adornar lo
obvio para que no lo parezca tanto. Y ah viene el Objeto Command, que como habr podido
ver en la figura de la Jerarqua de los objetos ADO, es un objeto que an no sabemos lo que
hace.
El objeto Command lo que va a hacer es crear un recordset. O tambin, meter a capn un
nuevo registro, o borrarlo, utilizando directamente instrucciones SQL. Hay que darse cuenta
que ADO trabaja con una gran diversidad de bases de datos, y no todas trabajan igual. Por eso,
muchas veces fallan operaciones tan sencilla como aadir un nuevo registro con el mtodo
AddNew del recordset
MiRecordset.AddNew

Ing. J. Paredes C.
11

Visual Basic Gua del Estudiante

Pgina

Y hay que emplear una instruccin SQL: INSERT


En estos casos, en ADO utilizamos el mtodo EXECUTE sobre el objeto Connection. Creamos
una variable, StrIntroducir, con el contenido de la instruccin SQL y ejecutbamos esa
instruccin mediante Execute
StrIntroducir = "Insert Into INT_DOCUMENTOS " _
& "(CL_DOC,NOM_DOC,TITULO_DOC,AUTOR_DOC,CL_TEMA_DOC,CL_DPT_DOC, _
& L_TIPO_DOC,FICH_DOC,FECHA_EMISION_DOC,ULTIMA_HORA_DOC,VISIBLE_DOC)"_
& "Values (" & NumeroDocumento & ",'" & TbTitulo & "','" & TbTitulo & "','" & TbTitulo.Tag _
& "',19,2,1,'" & HRefPrensa & "/" & TbNombFichTIF & "','" & Date & "',0,1)"
ConexBDPrensa.Execute StrIntroducir
Esta lnea (StrIntroducir) es el contenido de la propiedad CommandText de un objeto Command
de ADO. Ni ms ni menos que una instruccin que queremos realizar sobre la BD. Un objeto
Command tiene pocas cosas ms. Como objeto ADO que es tiene sus propiedades y mtodos.
Pero en esencia es lo que acaba de ver con la instruccin EXECUTE del objeto Connection. Lo
que pasa, que ADO lo han hecho muy organizado, y por eso tiene la categora de Objeto. Es
hacer lo mismo, utilizando las mismas expresiones, pero dndole ms cuerpo.
Con la instruccin anterior, lo que hacamos era aadir un registro. Si lo que queremos hacer
es crear un recordset, la instruccin SQL comenzara por Select * From . Y el mtodo
EXECUTE devolvera un Recordset
StrIntroducir = Select * From Alumnos Where Apellido1 = Suarez
Podemos crear un recordset (MiRecordset, previamente declarado como tal) con esta
instruccin
MiRecordset = ConexBDPrensa.Execute StrIntroducir
O con estas otras
Set MiComando as New ADODB.Command
MiComando.ActiveConnection = ConexBDPrensa
MiComando.CommandText = Select * From Alumnos Where Apellido1 = Suarez
MiRecordset = MiComando.Execute
Ver el ejemplo completo al final del captulo.
Ahora, tras la explicacin informal de cmo se crea una conexin y un recordset en ADO, y que
es un Command, vamos a entrar a conocer sus propiedades y mtodos. Al final, y con un buen
ejemplo realizado de varias formas, entender perfectamente la forma de trabajar con ADO.

Ing. J. Paredes C.
12

Visual Basic Gua del Estudiante

Pgina

ADO. El Objeto Connection


Un objeto Connection representa una conexin abierta con un origen de datos. Ya hemos visto
como crear un objeto Connection, por lo que vamos a pasar directamente
a ver sus objetos, colecciones, propiedades y mtodos.
Como puede verse en la figura, el Objeto Connection tienen los objetos
Command y Recordset, y la coleccin Errors.
El Objeto Recordset es el recordset de toda la vida: un conjunto de
registros que contienen datos. El Objeto Recordset, aunque pertenece al
objeto Connection, puede crearse sin que exista previamente un objeto Connection. Esta es
una de las propiedades de los objetos ADO: no necesita cumplir estrictamente con la jerarqua.
El Objeto Command es una definicin de un comando especfico que se piensa ejecutar contra
un origen de datos. Los objetos Command sirven para tener almacenadas operaciones de
acceso a datos y usarlas en el momento adecuado, simplemente citndolas. Lo que obtenemos
de un objeto Command es, o un recordset (ver que no merece la pena usar un objeto
Command para crear un recordset, puesto que se pueden crear directamente) o una operacin
que afecte a los registros de la base de datos (aadir registros, borrarlos, si es que no se deja
hacer eso mediante recordsets)
La Coleccin 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 nicamente a los errores
generados por el proveedor, no a los fallos interceptables producidos por el programa, que
deben ser tratados de la forma habitual: mediante Err
Propiedades del Objeto Connection
(Lea esto de las propiedades sin complicarse
demasiado la vida. Las realmente importantes ver que estn advertidas debidamente)
Las propiedades del objeto Connection dependen de cada proveedor. No todos se comportan
de igual forma, por lo que cada propiedad debe condicionarse a si el proveedor es capaz de
ofrecerla.
Propiedad Attributes
Es un Long. Acepta dos valores o la suma de los dos:
adXactCommitRetaining
adXactAbortRetaining
Estos atributos condicionan el modo de operacin de la conexin con los mtodos
CommitTrans y RollBackTrans.
Propiedad CommandTimeout
Indica, en segundos, el intervalo de espera para que se ejecute un comando (Objeto
Command) antes de que finalice el intento y se genere un error. Es un Long. El valor
predeterminado es 30.
Propiedad ConnectionTimeout
Indica, en segundos, el intervalo de espera para establecer una conexin antes de que finalice
el intento y se genere un error. Es un Long y el valor predeterminado es 15.
Propiedad ConnectionString (IMPORTANTE)
Es una cadena de caracteres que contiene la informacin que se utiliza para establecer una
conexin a un origen de datos. (Vea la explicacin amplia ms atrs)
La cadena de conexin tiene varios argumentos, todos ellos separados por un punto y coma (;)
de la forma
argumento1 = valor; argumento2 = valor; argumento3 = valor etc.

Ing. J. Paredes C.
13

Visual Basic Gua del Estudiante

Pgina

ADO procesa solamente cuatro argumentos: Provider, File Name, Remote Provider y Remote
Server. Los dems argumentos los pasa al proveedor para que el los procese (Usuario,
Password, etc)
Si al emplear el mtodo Open se utiliza el parmetro Connection String, este parmetro utilizado
en el mtodo Open sustituir a cualquier otro existente anteriormente. Una vez abierta la
conexin, esta propiedad no se puede cambiar puesto que es solamente de lectura.
Los argumentos File Name y Provider son excluyentes.
Propiedad CursorLocation

(IMPORTANTE)

Establece o devuelve la posicin de un servicio de cursores. Es un Long, y acepta las siguientes


constantes:
AdUseNone

No se usan servicios de cursor. (Esta constante es obsoleta y aparece


nicamente por compatibilidad con versiones anteriores.)
AdUseClient Usa cursores del lado del cliente.
AdUseServer Predeterminado. Usa cursores del lado servidor.
Esta propiedad parece que no dice nada. Y es sumamente importante.
Los cursores son, por decirlo de alguna manera, los mecanismos de la base de datos donde se
crean los recordsets. Se estar dando cuenta que las bases de datos que tienen cursores son
ya bases de datos con mecanismos propios para la creacin de recordsets. (SQL Server u
Oracle, p.e.) Estas bases de datos trabajan como aplicaciones cliente servidor. Tienen en el
servidor, aparte de los datos, la mayora de sus recursos. En el cliente tienen prcticamente los
recursos de conectividad, y poco ms. 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 SQL. Al recibirla el servidor, gestionar la obtencin de los resultados y una vez
que los haya conseguido viene su primera duda: Dnde los almaceno? Puede almacenarlos
en el servidor, y cada vez que necesitemos un nuevo registro, por ejemplo al ejecutar la
sentencia MiRecordset.MoveNext, el cliente se lo indica al servidor y este le enva el nuevo
registro. Tambin puede almacenar los datos obtenidos en el cliente, y de esta forma el cliente
puede moverse con entera libertad a lo largo de los registros del recordset. Puede hasta
contarlos y saber en que posicin est. La diferencia entre uno y otro sistema es que en el
primer caso el trfico por la red es mnimo (solamente se enva la informacin estrictamente
necesaria) y en el segundo caso, se enva mucha informacin de un golpe, la correspondiente a
todos los registros del recordset, independientemente de si se va a usar en el servidor o no.
Considerando el trfico generado, parece que es mejor crear los cursores en el lado servidor.
Pero esto trae tambin sus dificultades. Nos priva de muchas propiedades del recordset. Una
propiedad muy usada, AbsolutePosition, no la tienen los cursores de lado servidor,
circunstancia que no nos debe sorprender, ya que al no estar todos los registros en el cliente,
ste, aunque disponga de todos los datos guardados en todos los campos de un determinado
registro, no puede saber que posicin ocupa ese registro dentro de la totalidad de registros del
recordset. Por 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.
Recuerde que por defecto, ADO crea cursores de lado servidor. Para que la conexin le cree
todos los cursores de lado cliente basta ejecutar la instruccin:
MiConexion.CursorLocation = adUseClient
Si desea hacer transacciones, deber crear cursores del lado servidor, ya que los de lado
cliente no las admiten. Comprender segn vaya programando y encontrndose con
problemas, que esta propiedad es absolutamente importante.
Este valor debe establecerlo antes de crear la conexin. De esta forma, todos los cursores
creados con esa conexin sern de lado cliente o lado servidor, segn haya elegido. Pero
muchas veces sera ideal que unos recordsets tuvieran el cursor de un tipo y otros de otro. Los
Ing. J. Paredes C.
14

Visual Basic Gua del Estudiante

Pgina

recordsets tambin tienen esta propiedad, por lo que puede elegir el lado deseado para cada
recordset utilizando esta propiedad aplicada no a la conexin, sino al recordset.
El nmero de registros que el servidor enva al cliente, cuando el cursor es de lado servidor, se
controla mediante la propiedad CacheSize del recordset. Lo ver ms adelante.
Propiedad DefaultDatabase
Establece la base de datos predeterminada para un objeto Connection. Es un string con el
nombre de la base de datos por defecto de esa conexin. Solamente es vlida con aquellos
proveedores que permiten varias bases de datos por conexin.
IsolationLevel
Esta propiedad afecta al comportamiento de un objeto Connection durante una transaccin.
Una vez establecida esta propiedad, solamente ser efectiva cuando se invoque el mtodo
BeguinTrans. Vea la ayuda para mayor informacin de los valores posibles.
Propiedad Mode,
Establece los permisos disponibles para modificar datos en un objeto Connection.
Los valores aceptados son:
AdModeUnknown

Predeterminada. Indica que los permisos no se han establecido an o


que no se pueden determinar.
AdModeRead
Indica que son permisos de slo lectura.
AdModeWrite
Indica que son permisos de slo escritura.
AdModeReadWrite
Indica que son permisos de lectura/escritura.
AdModeShareDenyRead
Impide que otros abran una conexin con permisos de lectura.
AdModeShareDenyWrite
Impide que otros abran una conexin con permisos de
escritura.
AdModeShareExclusive

Impide que otros abran una conexin.

AdModeShareDenyNone

Impide que otros abran una conexin con cualquier tipo de


permiso.

Slo puede establecer la propiedad Mode cuando el objeto Connection est cerrado. Cuando
se usa en un objeto Connection del lado del cliente, la propiedad Mode slo se puede
establecer a adModeUnknown.
Propiedad Provider
Es un string que indica el nombre del proveedor de un objeto Connection. Si no se especifica
ningn proveedor, la propiedad tendr el valor predeterminado MSDASQL (Proveedor de
Microsoft OLE DB para ODBC).

Propiedad State
Devuelve el estado del objeto Connection: abierto (adStateOpen = 1) o cerrado (adStateClosed
= 0).
Propiedad Version
Devuelve el nmero de versin de ADO. Es un String.

Mtodos del Objeto Connection


Ing. J. Paredes C.
15

Visual Basic Gua del Estudiante

Pgina

Mtodos BeginTrans, CommitTrans y RollbackTrans


Estos mtodos de transaccin administran el proceso de la transaccin dentro de un objeto
Connection de la forma siguiente:
BeginTrans: inicia una nueva transaccin.
CommitTrans: guarda las modificaciones y termina la transaccin actual. Tambin
puede iniciar una nueva transaccin.
RollbackTrans: cancela las modificaciones efectuadas durante la transaccin actual y
termina la transaccin. Tambin puede iniciar una nueva transaccin.
Despus de invocar el mtodo BeginTrans, el proveedor ya no aplicar inmediatamente las
modificaciones hasta que invoque CommitTrans o RollbackTrans para terminar la
transaccin. Los mtodos BeginTrans, CommitTrans y RollbackTrans no estn disponibles
en los objetos Connection del lado del cliente.

Mtodo Cancel
Cancela la ejecucin de una llamada asncrona pendiente a un mtodo Execute u Open.
Sintaxis

NombreConection.Cancel

El mtodo Cancel se utiliza para terminar la ejecucin de una llamada asncrona a un mtodo
Execute o Open (es decir, el mtodo fue invocado con la opcin adAsyncConnect,
adAsyncExecute o adAsyncFetch). Cancel devolver un error de ejecucin si no se utiliz
adAsyncExecute en el mtodo que quiere terminar.
Close, mtodo
Cierra el objeto Connection.
Sintaxis

NombredelObjetoConnection.Close

El cierre de un objeto Connection mientras hay objetos Recordset abiertos en la conexin


cancela las modificaciones pendientes en todos los objetos Recordset. El cierre explcito de un
objeto Connection (llamando a su mtodo Close) mientras una transaccin est en progreso
genera un error. Si un objeto Connection cae fuera del alcance mientras la transaccin est en
progreso, ADO cancela automticamente la transaccin.
El cierre de un objeto Connection no lo elimina de la memoria; puede modificar los valores de
sus propiedades y volver a abrirlo ms tarde. Para eliminar completamente un objeto de la
memoria, establezca la variable de objeto a Nothing.
Set NombredelObjetoConnection = Nothing
Mtodo Execute (Vea tambin Mtodo Execute para el objeto Command)
Ejecuta una consulta, instruccin SQL, procedimiento almacenado especificados o texto
especfico del proveedor.
Sintaxis (Para una cadena de comando que no devuelva filas):
conexin.Execute CommandText, RecordsAffected, Options
(Para una cadena de comando que devuelva filas):
Set MiRecordset = connection.Execute (CommandText, RecordsAffected, Options)

Ing. J. Paredes C.
16

Visual Basic Gua del Estudiante

Pgina

(MiRecordset debe ser una variable declarada tipo ADODB.Recordset)


CommandText Es un String que contiene la instruccin SQL, el nombre de la tabla, el
procedimiento almacenado o el texto especfico del proveedor que se va a ejecutar.
RecordsAffected Opcional. Una variable Long en la que el proveedor devuelve el nmero de
registros afectados por la operacin.
Options Opcional. Una constante o valor Long que indica cmo debe evaluar el proveedor el
argumento CommandText. Puede ser uno de los siguientes valores.
Constante
adCmdText
adCmdTable
adCmdTableDirect
adCmdTable
adCmdStoredProc
adCmdUnknown
adAsyncExecute
adAsyncFetch

Descripcin
Indica que el proveedor tiene que evaluar CommandText como
definicin textual de un comando, como una instruccin SQL.
Indica que ADO tiene que generar una consulta SQL para devolver
todas las filas de la tabla mencionada en CommandText.
Indica que el proveedor tiene que devolver todas las filas de la tabla
mencionada en CommandText.
Indica que ADO tiene que generar una consulta SQL para devolver
todas las filas de la tabla mencionada en CommandText.
Indica que el proveedor tiene que evaluar CommandText como
procedimiento almacenado.
Indica que el tipo de comando en CommandText es desconocido.
Indica que el comando se tiene que ejecutar de forma asncrona.
Indica que el resto de las filas siguientes a la cantidad inicial
especificada en la propiedad CacheSize tiene que ser recuperada
de forma asncrona.

Cuando esta operacin termina se genera el evento ExecuteComplete.


Mtodo Open

(IMPORTANTE)

Abre una conexin a un origen de datos.


Sintaxis

MiConnection.Open ConnectionSTring, UserID, Password, Options


MiConnection.Open

Los parmetros ConnectionSTring, UserID, Password, Options puede introducirlos previamente


a abrir la conexin, y utilizar la segunda sintaxis cuando desee abrirla realmente. Estos
parmetros se le pasan en la cadena de conexin:
ConexBDPrensa.ConnectionString = "Provider=MSDAORA.1;User ID=INTRANET; & _
Password=INTRANET;Data Source=intranet;Persist Security Info=False"
Options Opcional. Puede ser una de las constantes siguientes:
AdConnectUnspecified Abre la conexin de forma sincrona
AdAsyncConnect
Abre la conexin de forma asncrona
Cuando se usa un objeto Connection del lado del cliente, el mtodo Open no establece
realmente una conexin con el servidor hasta que se abre un Recordset del objeto Connection.

Colecciones del Objeto Connection


Coleccin Errors
Contiene todos los objetos Error creados en respuesta a un nico fallo relacionado con el
proveedor. Cada objeto Error representa un error especfico del proveedor, no un error ADO.
Los errores ADO se exponen al mecanismo de control de excepciones en tiempo de ejecucin.
Por ejemplo, en Microsoft Visual Basic, cuando ocurre un error especfico de ADO dispara un
evento On Error y aparece en el objeto Err.

Ing. J. Paredes C.
17

Visual Basic Gua del Estudiante

Pgina

Cuando otra operacin ADO genera un error, se borra la coleccin Errors y el nuevo conjunto
de objetos Error se coloca en la coleccin Errors. Las operaciones ADO que no generan un
error no tienen ningn efecto sobre la coleccin Errors. Para borrar manualmente la coleccin
Errors utilice el mtodo Clear.
Cada objeto Error de la coleccin, nos dar informacin sobre un error producido en la
conexin. Sus propiedades son las siguientes:
Description: Contiene la descripcin del error producido (String).
NativeError: Indica el error devuelto por la base de datos (Long).
Number: Es el cdigo de error (Long).
Source: Indica el nombre del objeto o aplicacin que ha generado el error (String).
SQLState: Indica el error SQL estndar asociado.(String).
Debido a que este objeto ser de gran utilidad a continuacin se incluye un ejemplo de su uso.
Ejemplo del tratamiento de errores:
El resultado de la ejecucin es el siguiente:
Private Sub CBConexion_Click()
Dim MiConex1 As ADODB.Connection
Dim MiError As ADODB.Error
On Error GoTo RutErr
Set MiConex1 = New ADODB.Connection
MiConex1.ConnectionString = "Provider=MSDAORA.1;Password=tiger;User
ID=EScot;Data Source=MADRID;Persist Security Info=True"
MiConex1.Open
Exit Sub
RutErr:
For Each MiError In MiConex1.Errors
MsgBox ("Error VB:" & MiError.Number & vbCrLf _
& "Error Oracle:" & MiError.NativeError & vbCrLf _
& "Error SQL:" & MiError.SQLState & vbCrLf _
& "Generado Por:" & MiError.Source & vbCrLf _
& "Descripcin:" & MiError.Description)
Next
End Sub

Como puede observarse, algunas de las propiedades no devuelven los valores esperados:
NativeError vale 0 cuando debera valer 1017, que es el error asociado de Oracle. An as
podemos capturar el cdigo del error desde la cadena de caracteres description. Con este
comentario se pretende sugerir que se realicen pruebas con el proveedor de datos que
vayamos a utilizar para conocer su comportamiento respecto a este objeto error y dnde nos
devuelve los cdigos.
Observese en el cdigo que la declaracin de MiError se hace con ADODB.Error

Coleccin Properties
Es el conjunto de objetos Property

Ing. J. Paredes C.
18

Visual Basic Gua del Estudiante

Pgina

Objeto Property
Un objeto Property representa una caracterstica dinmica de un objeto ADO que est definida
por el proveedor.

Los objetos ADO tienen dos tipos de propiedades: intrnsecas y dinmicas.


Las propiedades intrnsecas son aquellas propiedades implementadas en ADO e
inmediatamente disponibles para cualquier nuevo objeto, utilizando la sintaxis
Objeto.Propiedad. No aparecen como objetos Property en la coleccin Properties de un
objeto, de forma que aunque puede modificar sus valores, no puede modificar sus
caractersticas.
Las propiedades dinmicas estn definidas por el proveedor de los datos y aparecen en la
coleccin Properties del objeto ADO apropiado. Por ejemplo, una propiedad especfica del
proveedor puede indicar si un objeto Recordset acepta transacciones o actualizaciones. Estas
propiedades adicionales aparecern como objetos Property en la coleccin Propiedades de
dicho objeto Recordset. A las propiedades dinmicas se les puede hacer referencia slo a
travs de la coleccin, utilizando la sintaxis Objeto.Properties(0) u Objeto.Properties("Name").
Un objeto Property dinmico tiene cuatro propiedades incorporadas propias:
La propiedad Name es una cadena que identifica la propiedad.
La propiedad Type es un entero que especifica el tipo de datos de la propiedad.
La propiedad Value es un variant que contiene el valor de la propiedad.
La propiedad Attributes es un valor Long que indica caractersticas de la propiedad
especficas del proveedor.

El Objeto Recordset de ADO


El objeto Recordset representa un conjunto de registros. El recordset en ADO puede crearse
abrindolo, tomando todos los registros de una tabla o seleccionndolos con una consulta SQL,
o ejecutando un comando que contienen el nombre de esa tabla o la consulta. En un momento
determinado, el objeto Recordset slo hace referencia a un nico registro dentro del conjunto
de registros, llamado registro actual.

Propiedades del Objeto Recordset


El recordset de ADO tiene propiedades iguales al recordset de DAO, pero tienen otras que no
tienen el de DAO. Se van a estudiar todas, profundizando ms en las que son particulares del
recordset ADO.
Propiedad AbsolutePosition (ADO)
Especifica la posicin ordinal del registro actual de un objeto Recordset. Esta propiedad
devuelve un Long con el nmero de orden del registro. Es posible que el recordset no acepte
esta propiedad, dependiendo del proveedor de datos, y del tipo de cursor (lado cliente o lado
servidor. El cursor tipo lado servidor no permite esta propiedad) Esta propiedad devolver 1
cuando el registro actual sea el primer registro del recordset.

Ing. J. Paredes C.
19

Visual Basic Gua del Estudiante

Pgina

Propiedades BOF y EOF


Indican si la posicin del puntero del Recordset est apuntando a un registro anterior al primero
(BOF = True) o posterior al ltimo (EOF = True). Esta propiedad siempre la podremos mirar,
independientemente si el cursor es lado cliente o lado servidor.
Propiedad ActiveConnection (ADO)
Indica a qu objeto Connection pertenece actualmente el objeto Recordset especificado.
Devuelve un string con el nombre del objeto Connection.
Propiedad Bookmark
Devuelve un marcador que identifica unvocamente al registro actual de un objeto Recordset o
establece el registro actual de un objeto Recordset al registro identificado por un marcador
vlido. El valor del Bookmark hay que introducirlo en una variable tipo Variant.
La propiedad Bookmark solo podr establecerse cuando el proveedor lo permita. Puede
utilizarse el mtodo Supports para averiguarlo. Cuando el recordset es de lado cliente,
siempre est disponible el Bookmark.
Propiedad CacheSize
Indica el nmero de registros del objeto Recordset que estn en la memoria cach local. Es un
Long de lectura y escritura. El valor predeterminado es 1.
Esta propiedad nos permite conocer cuantos registros estn en la memoria local. Si ponemos
esta propiedad por ejemplo a 10, al abrir la primera vez el objeto Recordset, el proveedor
recupera los 10 primeros registros en la memoria local. A medida que se desplaza por el objeto
Recordset, el proveedor devuelve los datos desde el bfer de memoria local. Tan pronto como
pasa del ltimo registro de la memoria cach, el proveedor recupera los 10 registros siguientes
desde el origen de datos y los carga en la memoria cach.
Los registros recuperados desde la memoria cach no reflejan los cambios concurrentes que
hagan otros usuarios en el origen de datos. Para forzar una actualizacin de todos los datos en
la memoria cach, debe usarse el mtodo Resync.
Propiedad MaxRecords
Indica el nmero mximo de registros que se devuelven a un Recordset desde una consulta. Es
un Long y el valor predeterminado es 0, que significa sin lmite (Obtienen todos los registros).
Esta propiedad es de lectura y escritura cuando el recordset est cerrado, y solamente de
lectura cuando est abierto.
Esta propiedad debe usarse solamente cuando se prev que se pueden obtener un nmero
muy grande de registros. Es prudente tomar medidas frente a aquellas operaciones en las que
el ordenador pueda meterse en un proceso excesivamente largo o que ocupe ms recursos de
los disponibles. Estas cosas son las que suelen colgar al ordenador y en las que es muy
frecuente echarle luego la culpa a Windows Si estamos frente a una base de datos con todos
los datos de los afiliados a la Seguridad Social, no es del todo prudente crear un recordset
mediante esta sentencia:
SELECT * From Afiliados Where Apellido1 = Fernandez
Incluso las hay peores:
SELECT * From Afiliados
A nadie se le ocurrira, pero puede surgir involuntariamente cuando ese acceso se realiza desde
un puesto de operacin pblico (Acceso desde Internet por ejemplo). Con la propiedad
MaxRecords puede limitar el nmero de registros obtenidos. Posiblemente no llegue a obtener

Ing. J. Paredes C.
20

Visual Basic Gua del Estudiante

Pgina

el dato deseado, y se vea en la obligacin de realizar la misma consulta sucesivas veces hasta
encontrarlo.
Propiedad CursorLocation
Establece o devuelve la posicin de un servicio de cursores. Es idntica a la propiedad del
mismo nombre vista ms atrs con todo detalle para el objeto Connection.
Propiedad CursorType
Indica el tipo de cursor que se usa en un objeto Recordset. Es de lectura y escritura si el
recordset est cerrado, y solo de lectura si est abierto. Puede tomar uno de los siguientes
valores:
AdOpenForwardOnly Predeterminado. Idntico a un cursor esttico, excepto slo
permite desplazarse hacia delante en los registros. Esto mejora el rendimiento en
situaciones en las que slo se quiere pasar una vez por cada registro.
En muchas ocasiones es necesario moverse por el recordset hacia delante y hacia
atrs. Este tipo de cursor solamente permite moverse hacia delante. Tenga presente
que este es el tipo predeterminado.
AdOpenKeyset Cursor de conjunto de claves. Igual que un cursor dinmico, excepto
que no se pueden ver los registros que agregan otros usuarios, aunque los registros
que otros usuarios eliminan son inaccesibles desde su conjunto de registros. Los
cambios que otros usuarios hacen en los datos permanecen visibles.
AdOpenDynamic
Cursor dinmico. Las incorporaciones, cambios y eliminaciones
que hacen otros usuarios permanecen visibles, y se admiten todo tipo de movimientos
entre registros, a excepcin de los marcadores si el proveedor no los admite. Es el
equivalente en DAO al tipo Dynaset
AdOpenStatic Cursor esttico. Una copia esttica de un conjunto de registros que se
puede usar para buscar datos o generar informes. Las incorporaciones, cambios o
eliminaciones que hacen otros usuarios no son visibles. Es el equivalente en DAO al
tipo Snapshot
NOTA. Si un proveedor no admite el tipo de cursor solicitado, el proveedor puede que devuelva
otro tipo de cursor. La propiedad CursorType cambiar para coincidir con el tipo de cursor en
uso cuando el objeto Recordset se abra. Para comprobar la funcionalidad especfica del cursor
devuelto, use el mtodo Supports. Cuando cierre el Recordset, la propiedad CursorType
volver a su configuracin original.

Propiedad LockType
Indica el tipo de bloqueo que se pone en los registros durante el proceso de edicin. Establece
tambin si el recordset se actualiza registro a registro o por lotes. Este ltimo sistema permite
realizar varios cambios en el recordset y mantenerlos en la cach durante cierto tiempo, y
proceder a la actualizacin de todos los cambios pendientes en una sola operacin. Esto es
muy importante cuando se est trabajando con una base de datos situada en un servidor con
un acceso lento (conexin va Internet, por ejemplo)
Los valores de la propiedad LockType pueden ser:
AdLockReadOnly
AdLockPessimistic

Ing. J. Paredes C.
21

Predeterminado. Slo lecturano puede modificar los datos


Bloqueo pesimista, registro a registro: el proveedor hace lo necesario
para asegurar la modificacin correcta de los registros, generalmente
bloqueando registros en el origen de datos durante todo el proceso de

Visual Basic Gua del Estudiante

Pgina

modificacin. Este valor solamente es vlido si el cursor (Propiedad


CursorLocation) esta establecido a lado servidor.
AdLockOptimistic
Bloqueo optimista, registro a registro: el proveedor usa bloqueo
optimista, bloqueando registros slo cuando llama al mtodo Update.
AdLockBatchOptimistic
Actualizaciones optimistas por lotes: requerido para el modo de
actualizacin por lotes como contraposicin al modo de
actualizacin inmediata.
Propiedad EditMode
Indica el estado de modificacin del registro actual. Es solamente de lectura. Devuelve uno de
las siguientes constantes:
AdEditNone
AdEditInProgress
AdEditAdd

AdEditDelete

Indica que no hay ninguna operacin de modificacin en ejecucin.


Indica que los datos del registro actual se han modificado pero que no
se han guardado.
Indica que se ha invocado el mtodo AddNew y que el registro situado
actualmente en el bfer de copia es un nuevo registro que no se ha
guardado en la base de datos.
Indica que el registro actual se ha eliminado.

Propiedad Filter
Esta propiedad solamente la tienen los recordset ADO. Y es que ADO presupone que est
obteniendo datos de una base de datos alojada en un servidor y que la comunicacin entre
servidor y cliente puede ser especialmente lenta. Mediante Filter puede descartar registros que
no cumplan una determinada condicin. En realidad lo que hacemos mediante Filter es crear un
nuevo Recordset a partir de otro Recordset.
La propiedad Filter se utiliza tambin para actuar sobre determinados registros en varios
mtodos del recordset (Resync, Save, ) pero no se va a explicar en este manual la
explicacin de la utilizacin de esta propiedad en esos mtodos, ya que el nivel del programador
que utiliza esos recursos debe ser elevado. Le reservamos por tanto la posibilidad de conocerlo
directamente desde la ayuda de Visual Basic, que en este caso es bastante buena.
De momento lo que vamos a hacer con Filter es crear un nuevo recordset Por qu no creamos
directamente el nuevo recordset utilizando una sentencia SQL que lleve implcito ese filtro?
Personalmente no me gusta utilizar la propiedad Filter, y prefiero crear un nuevo recordset.
Creo que solamente lo he usado para rellenar un MSHFlexGrid con parte de los datos del
recordset que uso en una parte de la aplicacin. Veamos un ejemplo:
(MiConexion es una conexin ya creada)
Dim RsInicial As ADODB.Recordset
Dim RsFiltrado As ADODB.Recordset
Set RsInicial = New ADODB.Recordset
Set RsFiltrado = New ADODB.Recordset
RsInicial.Open "Autores", MiConexion, adOpenDynamic, adLockOptimistic
Este es el recordset que uso para muchas cosas dentro de la aplicacin. Ahora quiero
presentar en un MSHFlexGrid solamente los datos de los autores de nacionalidad espaola.
Filtro el recordset anterior utilizando un criterio de igualdad de un campo: Nacionalidad
RsFiltrado = RsInicial.Filter (Nacionalidad = Espaola)
Ahora ya podemos aplicar este recordset al MSHFlexGrid:
Set MSHFlexG1.Recordset = RsFiltrado
Y cuando queremos presentar todos los autores, basta con poner la lnea:
Ing. J. Paredes C.
22

Visual Basic Gua del Estudiante

Pgina

Set MSHFlexG1.Recordset = RsInicial


Este es el nico ejemplo que puedo sacar de todas mis aplicaciones. Seguro que el alumno va
a ver ms aplicaciones de esta propiedad.
La propiedad Filter puede mostrar tambin aquellos registros que han sido manipulados
recientemente, mediante las constantes siguientes:
AdFilterNone
AdFilterPendingRecords

Quita el filtro actual y vuelve a poner todos los registros a la


vista.
Permite ver slo los registros que han cambiado, pero que no
han sido enviados an al servidor. Aplicable slo para el modo
de actualizacin por lotes.

AdFilterAffectedRecords

Permite ver slo los registros afectados por la ltima llamada a


Delete, Resync, UpdateBatch o CancelBatch

AdFilterFetchedRecords

Permite ver los registros de la cach actual, es decir, los


resultados de la ltima llamada para recuperar registros de la
base de datos
Permite ver los registros que fallaron en el ltimo intento de
actualizacin por lotes.

AdFilterConflictingRecords

Propiedad Index
Indica el nombre del ndice que se utiliza actualmente en el Recordset. Es un String con el
nombre del ndice.
El ndice se utiliza para moverse a lo largo del recordset mediante el mtodo Move. El ndice ya
debe estar creado en la tabla de la base de datos.
Al utilizar un ndice, el orden de los registros se cambia al orden establecido en ese ndice. Por
lo tanto, los valores obtenidos anteriormente por la propiedad AbsolutePosition cambiarn
completamente.
No todos los proveedores de datos aceptan la propiedad Index. Puede comprobarlo mediante el
mtodo Supports.
Propiedad MarshalOptions
Esta propiedad se usa cuando estamos trabajando con cursores lado cliente. En este caso,
como vimos ms atrs, los registros del recordset estn en el equipo cliente. Todas las
operaciones realizadas sobre el recordset se realizan en el cliente, por lo tanto llegar el
momento en que habr que actualizar en el servidor los datos que hayamos modificado en el
recordset que est en el equipo cliente. Mediante esta propiedad podemos hacer que se enven
al servidor todos los registros (filas) o solamente los que han cambiado. Acepta estas dos
constantes:
AdMarshalAll
AdMarshalModifiedOnly

Predeterminada. Indica que todos los registros se devuelven al


servidor.
Indica que slo los registros modificados se devuelven al
servidor.

Esta propiedad puede mejorar el rendimiento de la aplicacin para aquellos casos en los que se
use un canal de comunicacin lento.
Propiedad PageSize
Indica cuntos registros constituyen una pgina del objeto Recordset. Es de lectura y escritura.
Devuelve un Long y su valor predeterminado es 10.

Ing. J. Paredes C.
23

Visual Basic Gua del Estudiante

Pgina

Esta propiedad permite determinar cuntos registros componen una pgina lgica de datos. Al
establecer un tamao de pgina, puede utilizar la propiedad AbsolutePage y se mover al
primer registro de una pgina especfica. Esto es til en las situaciones de servidor Web cuando
se desea permitir que el usuario pase pginas de datos y vea cierto nmero de registros al
mismo tiempo. Esta propiedad se puede establecer en cualquier momento y su valor se utilizar
para calcular la ubicacin del primer registro de una pgina especfica.
Propiedad PageCount
Indica cuntas pginas de datos contiene el objeto Recordset. Es solamente de lectura.
Devuelve un Long. Si el objeto Recordset no admite esta propiedad, el valor ser -1 para
indicar que no se puede determinar el valor de PageCount.
Propiedad AbsolutePage
Especifica en qu pgina reside el registro actual. Es de lectura y escritura. Devuelve un Long o
una de las siguientes constantes:
AdPosUnknown

El objeto Recordset est vaco, la posicin actual se desconoce o el


proveedor no admite la propiedad AbsolutePage.

AdPosBOF

El puntero del registro actual est al comienzo del archivo (es decir, la
propiedad BOF tiene el valor True).

AdPosEOF

El puntero del registro actual est al final del archivo (es decir, la
propiedad EOF tiene el valor True).

Propiedad RecordCount
Indica el nmero actual de registros de un objeto Recordset. Devuelve un Long
Es posible que esta propiedad no la permita el proveedor de datos, o que no pueda llegar a
averiguarse, ya que dependiendo del tipo de cursor utilizado puede que no suministre ese dato.
Propiedad Source
Devuelve la tabla, consulta o sentencia SQL utilizado en el mtodo Open para crear el
recordset. Es un String.
Propiedad State
Indica el estado (abierto, cerrado, proceso de ejecucin) en el que se encuentra el recordset.
Devuelve uno de los siguientes valores:
Constante

Descripcin
Valor predeterminado. Indica que el objeto est
adStateClosed
cerrado.
Indica que el objeto est abierto.
adStateOpen
Indica que el objeto Recordset se est
adStateConnecting
conectando.
Indica que el objeto Recordset est ejecutando un
adStateExecuting
comando.
Indica que se est obteniendo el conjunto de filas
adStateFetching
del objeto Recordset.
Puede tener una combinacin de valores. Por ejemplo, si se est ejecutando una instruccin,
esta propiedad tendr un valor combinado de adStateOpen y adStateExecuting.
Propiedad Status
Esta propiedad se refiere al registro actual. Indica el estado de este registro respecto a las
operaciones de actualizacin por lotes u otras operaciones masivas. No es una propiedad que
se use todos los das. Vea la ayuda para mas detalles.
Ing. J. Paredes C.
24

Visual Basic Gua del Estudiante

Pgina

Propiedades dinmicas del objeto recordset


Las propiedades anteriores se refieren a propiedades del recordset que se refieren a unas
caractersticas propias del recordset una vez creado. Son estas:
Unique Table, Unique Schema y Unique Catalog
Unique Table especifica la tabla sobre la que se permite realizar modificaciones de datos
(Insertar o actualizar), en el caso de que el recordset se haya creado mediante una operacin
JOIN
Unique Schema indica el nombre del propietario de la tabla
Unique Catalog indica el nombre de la base de datos a la que pertenece la tabla. Estas dos
ltimas propiedades deben tener un valor para poder poner valor a la propiedad Unique Table.
Estas propiedades son tipo String
Estas propiedades dinmicas se anexan a la coleccin Properties del objeto Recordset al
asignar el valor adUseClient a la propiedad Cursor Location.

Mtodos del objeto Recordset de ADO


METODO Supports
Este mtodo es muy til para ver si un recordset acepta una determinada funcionalidad.
Devuelve un Booleano y es solamente de lectura. De esta forma puede consultar si un
recordset admite el mtodo MoveFirst, la propiedad AbsolutePosition, Bookmark, etc., antes de
invocar ese mtodo o leer esa propiedad, y evitar de esta forma un error en la ejecucin. Esto
es muy til habida cuenta que no todos los proveedores funcionan de la misma forma. Es por lo
tanto muy prudente consultar si el Recordset soporta una funcionalidad antes de pedrsela.
Estas funcionalidades se le pasan como parmetro mediante una de las siguientes constantes:
AdAddNew
AdApproxPosition
AdBookmark
AdDelete
AdHoldRecords
AdMovePrevious

AdResync
AdUpdate
AdUpdateBatch
AdIndex
AdSeek

Puede usar el mtodo AddNew para agregar nuevos registros.


Puede leer y establecer las propiedades AbsolutePosition y
AbsolutePage.
Puede usar la propiedad Bookmark para tener acceso a registros
especficos
Puede usar el mtodo Delete para eliminar registros.
Puede recuperar ms registros o cambiar la posicin de recuperacin
siguiente sin efectuar todos los cambios pendientes.
Puede usar los mtodos MoveFirst y MovePrevious, y los mtodos
Move o GetRows para desplazar hacia atrs la posicin del registro
actual sin que se requiera marcadores.
Puede usar el mtodo Resync para actualizar el cursor con los datos
visibles en la base de datos subyacente.
Puede usar el mtodo Update para modificar datos existentes.
Puede usar actualizacin por lotes (mtodos UpdateBatch y
CancelBatch) para transmitir grupos de cambios al proveedor.
Puede utilizar la propiedad Index para dar nombre a un ndice.
Puede utilizar el mtodo Seek para encontrar una fila en un Recordset.

En este ejemplo vemos la sintaxis de Supports:


If RsSeg.Supports(adApproxPosition) = True Then
MsgBox "SI"
Else
MsgBox "NO"
End If
Ing. J. Paredes C.
25

Visual Basic Gua del Estudiante

Pgina

Nota Aunque el mtodo Supports puede devolver True para una funcionalidad determinada,
eso no garantiza que el proveedor pueda hacer que la caracterstica est disponible bajo
cualquier circunstancia. El mtodo Supports devuelve simplemente si el proveedor puede
admitir la funcionalidad especificada, dando por supuesto que se renen determinadas
condiciones. Por ejemplo, el mtodo Supports puede indicar que un objeto Recordset admite
actualizaciones aunque el cursor se base en una unin de mltiples tablas, de las que algunas
columnas no son actualizables.
El valor devuelto por el mtodo Supports depender del tipo de recordset elegido. En la
siguiente tabla puede ver el tipo de recordset y las constantes para las que va a devolver True:
AdOpenForwardOnly
AdOpenKeyset
AdOpenDynamic
AdOpenStatic

Ninguna
adBookmark, adHoldRecords, adMovePrevious, adResync
AdMovePrevious
adBookmark, adHoldRecords, adMovePrevious, adResync

Mtodo Open
Es el mtodo que ABRE el recordset. Este mtodo es el que busca los registros que han de
rellenar el recordset.
Sintaxis. Esta es la sintaxis general:
MiRecordset.Open Source, ActiveConnection, CursorType, LockType, Options
Un recordset puede abrirse partiendo de una conexin ya abierta. Pero tambin puede crearse
directamente, sin abrir previamente la conexin. Al final, deber aportar todos los datos
necesarios para determinar en que base de datos se abre ese recordset. Sobre que tabla,
consulta o sentencia SQL., que tipo de cursor va a ser, etc. Lo que ocurre es que ADO es muy
flexible y nos permite hacerlo de varias formas, aunque todas ellas conducen a lo mismo.
Source (Opcional) Es el nombre de una tabla, consulta o sentencia SQL de la cual se obtienen
los registros del Recordset.
ActiveConnection (Opcional). Es el nombre de un objeto Connection abierto o una cadena de
conexin vlida. Esta cadena es la misma que la que emplearamos para abrir el objeto
Connection.
CursorType (Opcional). Un valor que determina el tipo de cursor que el proveedor debe usar al
abrir el Recordset. Puede ser una de las siguientes constantes
AdOpenForwardOnly (Predeterminado) Abre un cursor de tipo slo avance.
AdOpenKeyset
Abre un cursor de tipo conjunto de claves.
AdOpenDynamic
Abre un cursor de tipo dinmico. (Igual que el Dynaset de
DAO)
AdOpenStatic
Abre un cursor de tipo esttico.
LockType (Opcional). Un valor que determina el tipo de bloqueo que debe usar el proveedor al
abrir el Recordset. Con este parmetro se le indica tambin si debe hacer las actualizaciones
registro a registro o en bloque. Puede ser una de las siguientes constantes
AdLockReadOnly
AdLockPessimistic

Ing. J. Paredes C.
26

(Predeterminado) Slo lectura. No puede modificar los datos.


Bloqueo pesimista, registro a registro. El proveedor hace lo
necesario para asegurar una modificacin correcta de los
registros, normalmente bloqueando registros en el origen de
datos inmediatamente antes de la modificacin.

Visual Basic Gua del Estudiante

Pgina

AdLockOptimistic

Bloqueo optimista, registro a registro. El proveedor usa


bloqueooptimista, bloqueando registros slo cuando se llama al
mtodo Update.
AdLockBatchOptimistic
Actualizaciones optimistas por lotes. Requeridas en el
modo de actualizacin por lotes en oposicin al modo
de actualizacin inmediata. (Actualizacin en bloque)
Options (Opcional). Constante que determina como va a evaluar el proveedor de datos el
argumento Source. Puede ser una de las siguientes constantes de esta lista.
AdCmdText

Indica que el proveedor debe evaluar Source como una definicin


textual de un comando.
AdCmdTable Indica que ADO debe generar una consulta SQL para devolver
todaslas filas de la tabla nombrada en Source.
AdCmdTableDirect
Indica que el proveedor debe devolver todas las filas de la
tabla nombrada en Source.
AdCmdStoredProc
Indica que el proveedor debe evaluar Source como un
procedimiento almacenado
AdCmdUnknown
Indica que el tipo de comando del argumento Source es
desconocido.
AdCmdFile
Indica que el Recordset guardado se debe restaurar desde el
archivo nombrado en Source.
AdAsyncExecute
Indica que Source se debe ejecutar de forma asncrona.
AdAsyncFetch
Indica que, tras alcanzar la cantidad inicial especificada en la
propiedad Initial Fetch Size, las filas restantes deben
buscarse de forma asncrona. Si se requiere una fila que no se
ha encontrado, se bloquear el subproceso principal hasta que
se disponga de la fila solicitada.
AdAsyncFetchNonBlocking Indica que el subproceso principal nunca se bloquea
durante la bsqueda. Si no se encuentra la fila
solicitada, la fila actual se desplaza automticamente
al final del archivo.
Habr observado que hemos remarcado que el mtodo Open ABRE un recordset. No lo crea. El
recordset debe estar creado previamente. Qu cuando se crea? Mediante la instruccin:
Set MiRecordset = New ADODB.Recordset

Metodo Requery
Actualiza los datos de un objeto Recordset volviendo a ejecutar la consulta utilizada para abrirlo.
Se obtiene el mismo resultado que si se cerrara el recordset y se volviera a abrir.
Sintaxis

MiRecordset.Requery Opciones

Optiones Opcional. Mscara de bits que indica opciones que afectan a esta operacin. Si el
valor de este parmetro est establecido a adAsyncExecute, esta operacin se ejecutar de
forma asncrona y se emitir un evento RecordsetChangeComplete cuando concluya.

Mtodo Resync
Actualiza los datos del objeto Recordset actual. Este mtodo, a diferencia del mtodo Requery,
no vuelve a ejecutar el comando de creacin del recordset, sino que lee los registros existentes
en el recordset para actualizar su valor, pero no presenta aquellos registros que hubieran sido
creados con posterioridad a la apertura del recordset. Es ms rpido que el mtodo Requery, y
en muchos casos solamente nos interesa actualizar los registros sobre los que estamos
trabajando.
Sintaxis

MiRecordset.Resync AffectRecords, ResyncValues

Los parmetros AffectRecords y ResyncValues determinan que registros se van a volver a


leer y sobreescribir. Vea la ayuda para mas detalles.
Ing. J. Paredes C.
27

Visual Basic Gua del Estudiante

Pgina

METODO AddNew
Crea un nuevo registro en un objeto Recordset actualizable.
Sintaxis

NombreDelRecordset.AddNew FieldList, Values

Los parmetros FieldList y Values son opcionales. En caso de ponerlos, FieldList sern los
nombres de los campos a los que se les va a poner un valor, y Values son los valores de cada
uno de estos campos. El orden nombre - valor debe mantenerse estrictamente.
Siempre recomendar que, en vez de meter los datos mediante estos parmetros, se metan
posteriormente linera a lnea, tal como se hizo siempre con los recordsets
NombreDelRecordset!NombredelCampo = ValorDelCampo

NombreDelRecordset(NombredelCampo) = ValorDelCampo
Esta segunda forma es necesaria cuando el nombre del campo tiene espacios. Nunca es
recomendable poner espacios en los nombres de campos, pero en caso de que existan, debe
optar por utilizar la sintaxis segunda, con los parntesis y comillas dobles.
No siempre se puede utilizar el mtodo AddNew. Puede comprobar si se puede utilizar, usando
el mtodo Supports visto anteriormente.
El mtodo AddNew convierte a este registro recin creado en registro actual. Pero este registro
solamente existe en el recordset. Para introducir los datos en la base de datos, (Y por lo tanto
en el disco duro) es necesario invocar el mtodo Update una vez introducidos todos los valores
de los campos que deseamos introducir. Con algn tipo de cursor es necesario tambin utilizar
el mtodo Requery para poder acceder al registro recin creado.
Si se invoca el mtodo AddNew mientras se est editando el registro actual, o durante otra
operacin AddNew, ADO invoca automticamente el mtodo Update para guardar los
cambios. Vea ms adelante los mtodos Update y UpdateBatch.

Mtodo Update
Guarda los cambios realizados en el registro actual de un objeto Recordset. Se utiliza tanto para
rematar una operacin de creacin de un registro iniciada con AddNew, como para guardar
los nuevos datos del registro actual (Recuerde que en ADO no existe el mtodo Edit, tal como
ocurra en DAO)
.
Sintaxis
NombreDelRecordset.Update Fields, Values
En esta sintaxis, Fields y Values son opcionales, y 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 AddNew.
Vuelvo a recomendar lo anterior. Para cambiar los valores de varios campos de un registro, nos
colocaremos sobre ese registro, y sin invocar ningn mtodo, ejecutaremos este cdigo
MiRecordset!Campo1 = Valor1
MiRecordset!Campo2 = Valor2
.
MiRecordset!CampoN = ValorN
MiRecordset.Update
Pero en ADO pasa una cosa que no pasaba en DAO. Si cambiamos de registro una vez
modificado el valor de un registro, ADO invoca automticamente el mtodo Update. Por lo
tanto, el cdigo siguiente:
Ing. J. Paredes C.
28

Visual Basic Gua del Estudiante

Pgina

MiRecordset!Campo1 = Valor1
MiRecordset!Campo2 = Valor2
.
MiRecordset!CampoN = ValorN
Tendr el mismo resultado que el anterior cuando cambiemos de registro actual. Esto puede
ser bueno a malo, pero personalmente pienso que no es prctico porque implica tener mucho
ms cuidado que en DAO. Hace lo mismo que cuando tenemos unos controles enlazados a
datos mediante un control Data.
Si una vez que ejecutamos una lnea tal como esta
MiRecordset!Campo1 = Valor1
Queremos que ese nuevo valor no entre en la base de datos, debemos cancelarlo mediante el
mtodo CancelUpdate.

Mtodo UpdateBatch
Escribe en disco todas las actualizaciones pendientes de proceso por lotes. En ADO un
recordset puede actualizarse registro a registro o por lotes. Todo depender de cmo se ha
abierto (Si el valor LockType se ha puesto a AdLockBatchOptimistic)
Sintaxis

MiRecordset.UpdateBatch AffectRecords

AffectRecords Constante que determina a cuntos registros afectar el mtodo


UpdateBatch. Puede tomar uno de los siguientes valores.
AdAffectCurrent
AdAffectGroup
AdAffectAll

Escribe solamente los cambios pendientes en el


registro actual.
Escribe los cambios pendientes que cumplen el valor
de la propiedad Filter.
(Predeterminado) Escribe los cambios pendientes en
todos los registros del objeto Recordset.

Mtodo Cancel
Cancela la ejecucin del mtodo Open.
Sintaxis

NombreDelRecordset.Cancel

El mtodo Cancel solamente puede usarse si el mtodo Open fue invocado con la opcin
adAsyncConnect, adAsyncExecute o adAsyncFetch.

Mtodo Delete
Elimina el registro actual o un grupo de registros. Por defecto elimina solamente el registro
actual. Vea la ayuda para ampliar los detalles respecto al parmetro opcional AffectRecords
Sintaxis

MiRecordset.Delete AffectRecords

Mtodo CancelUpdate
Habamos visto ms atrs que el ADO no existe el mtodo Edit. Para modificar un registro
basta con poner una instruccin tal como esta:
MiRecordset!MiCampo = MiNuevoValor

Ing. J. Paredes C.
29

Visual Basic Gua del Estudiante

Pgina

Y a continuacin rematar la operacin mediante el mtodo Update


MiRecordset.Update
Si por cualquier circunstancia se ha ejecutado la primera instruccin, y luego queremos
volvernos atrs, antes de ejecutar el mtodo Update debemos deshacer el cambio con el
mtodo CancelUpdate, con lo que el registro afectado recuperar nuevamente su valor original.
Sintaxis

MiRecordset.CancelUpdate

Recuerde que ADO funciona de forma distinta a DAO con estos mtodos de modificacin de los
registros. Recuerde que si est en proceso de modificacin de un registro (Ha ejecutado la
primera lnea del ejemplo anterior) y cambia de registro, por el hecho de cambiar de registro,
ADO invoca automticamente el mtodo Update.

Mtodo CancelBatch
Cancela una actualizacin por lotes pendiente. Es similar a la anterior, pero para actualizacin
por lotes.
Sintaxis

MiRecordset.CancelBatch AffectRecords

Mtodo Clone
Crea un objeto Recordset duplicado a partir de un objeto Recordset existente. Opcionalmente,
puede especificarse que el nuevo recordset sea solamente de lectura
Sintaxis

Set rstDuplicate = rstOriginal.Clone (LockType)

(El objeto rstDuplicate debe estar declarado previamente como objeto ADODB.Recordset)
LockType puede tomar uno de los siguientes valores:
AdLockUnspecified
AdLockReadOnly

(Predeterminado) El recordset resultante tendr el mismo tipo de


bloqueo que el original.
El recordset creado es solamente de lectura.

El recordset resultante del mtodo Clone, aunque igual al original en el momento de su


creacin, es completamente independiente de este a partir de ese momento, por lo que las
actualizaciones efectuadas en el original no afectan al clonado.

Mtodo Move
Mueve la posicin del registro actual de un objeto Recordset
.
Sintaxis
MiRrecordset.Move NumRecords, Start
NumRecords Un valor Long con signo que especifica el nmero de registros que debe
moverse a partir de la posicin del registro actual o del registro especificado en el parmetro
Start, si es que se especifica.
Start Opcional. Un String o Variant cuyo resultado sea un marcador del tipo Bookmark. Puede
utilizar tambin una de las siguientes constantes:
AdBookmarkCurrent
AdBookmarkFirst
AdBookmarkLast

Ing. J. Paredes C.
30

(Predeterminado) Cuenta a partir del registro actual


Cuenta a partir del primer registro
Cuenta a partir del ltimo registro

Visual Basic Gua del Estudiante

Pgina

Mtodos MoveFirst, MoveLast, MoveNext y MovePrevious


Pasa al primer, ltimo, siguiente o anterior registro de un objeto Recordset especificado y lo
convierte en el registro actual. Funciona igual que en DAO
Tenga en cuenta a la hora de usar los mtodos Move que pueden existir Recordsets que no
permiten el movimiento hacia atrs.

Mtodo Find
Busca el primer registro del recordset que satisfaga los criterios especificados en el criterio de
bsqueda. Si se cumple el criterio de bsqueda, la posicin del recordset se establece en el
primer registro encontrado; si no, la posicin se establece al final del recordset.
Sintaxis

MiRecordset.Find (criterio, SkipRows, searchDirection, start)

criterio
Es el criterio de bsqueda. Por ejemplo Pais = Espaa siendo Pais el
nombre del campo en el cual buscamos el valor Espaa
SkipRows
(Opciopnal) Es un Long, cuyo valor predeterminado es cero, que especifica el
nmero de registros a partir del registro actual donde debe empezar la bsqueda.
searchDirection (Opcional) Un valor que especifica si la bsqueda se realiza en direccin al
final del recordset (adSearchForward) o en direccin hacia el principio del recordset
(adSearchBackward). La bsqueda termina al final o al principio del recordset, dependiendo
del valor de searchDirection.
start
la bsqueda.

(Opcional) Un marcador tipo BookMark que se utiliza como posicin inicial de

El operador de comparacin de criterio puede ser ">", "<", "=", ">=" , "<=", "<>" (distinto de) o
"like" (coincidencia parcial de cadenas). El valor de comparacin puede ser una cadena, un
nmero en coma flotante o una fecha. Los valores de cadena estn delimitados con comillas
sencillas (por ejemplo, "Pais = 'Espaa'"). Los valores de fecha estn delimitados con signos "#"
y con formato mm/dd/yy (por ejemplo, "fecha_inicial > #7/22/97#"). Si el operador de
comparacin es "like", el valor de la cadena puede contener los caracteres comodn "*" o "_".
(Funcionan de forma idntica, sustituyendo a cualquier sucesin de caracteres.) No acepta el
carcter ? (Por ejemplo, "Pais like Es_" o Pais Like Es* encuentra Espaa y Estonia)

ADO no tiene los mtodos FindFirst, FindNext, FindPrevious y FindLast. Deber emplear el
mtodo Find de forma inteligente para implementar estos otros.

Mtodo Save
Este mtodo permite guardar el contenido de un Recordset en un fichero. Puede ser muy til
cuando queremos exportar ese recordset hacia otra aplicacin.
Sintaxis

MiRecordset.Save FileName, PersistFormat

FileName es la ruta completa del fichero en el que se guardar el Recordset.


PersistFormat (Opcional). Un valor que especifica el formato en que se guardar el
Recordset. Puede ser una de las constantes siguientes.
AdPersistADTG

Ing. J. Paredes C.
31

(Valor predeterminado) Se guarda en un formato propietario


(Advanced Data Tablegram). No es inteligible a simple vista,
pero genera ficheros bastante cortos.

Visual Basic Gua del Estudiante

Pgina

AAdPersistXML

Se guarda en formato XML. Es un formato puramente en ASCII


donde pueden verse los nombres de los campos y su
contenido. Este formato genera ficheros ms grandes que el
ADT
Si el recordset tienen aplicado un filtro (Mediante la propiedad Filter) solamente guarda los
registros que deja ver ese filtro.
Si ya existe el fichero le dar un error. Cercirese que no existe (Mediante la funcin Dir) y
brrelo antes de volver a utilizar el mtodo Save.

Mtodo Seek
Este mtodo busca un registro desplazndose por el recordset a lo largo de un ndice o un
conjunto de ndices. La bsqueda mediante Seek es mucho ms rpida que con Find, ya que la
realiza siguiendo el ordenamiento de los registros segn un ndice.
Para poder usar el mtodo Index es necesario que el proveedor acepte ndices en el objeto
recordset. Esto ha llevado al autor a no poder presentar ningn ejemplo de este mtodo, ya
que todas las bases de datos ensayadas no permitan ndices. Puede ver si acepta ndices
mediante el mtodo Supports:
If MiRecordset1.Supports(adIndex) = True Then
Vea la ayuda de VB para mayor informacin

Mtodo NextRecordset
Para entender este mtodo es necesario explicar previamente como se puede crear un
recordset compuesto.
Un recordset compuesto es un recordset que se crea concatenando sentencias SELECT, y
cada una de ellas crear, dentro del mismo Recordset, un recordset particular. Al crear el
recordset, el recordset particular que va a estar activo es el correspondiente a la primera
sentencia SELECT. Mediante el mtodo NextRecordset podemos ir avanzando a travs de los
siguientes recordsets particulares. El carcter de separacin entre las sentencias SELECT es
el punto y coma ( ; )

MiRecordset1.Open "Select * From Regimenes; Select * From Regimen_Seguimiento Where


Rs_Origen = 'LSB'", MiConexionADO, adOpenDynamic, adLockOptimistic
(La instruccin anterior debe leerse como una sola lnea)
MiRecordset es un recordset compuesto. Toma datos de dos tablas distintas, pero podra
haberlo hecho solamente de una tabla con una condicin distinta en la SELECT.
Cuando se ejecuta esa lnea, el recordset actual es el correspondiente a la primera seleccin.
(Select * From Regimenes). Ejecutando el mtodo NextRecordset ese recordset primero se
borra y pasa a ser recordset actual el creado con la seleccin segunda (Select * From
Regimen_Seguimiento Where Rs_Origen = 'LSB'")
Set MiRecordset1 = MiRecordset1.NextRecordset
Puede usar tambin este recordset para crear un nuevo recordset a partir del primero
Set MiRecordset2 = MiRecordset1.NextRecordset
MiRecordset2 debe estar declarado como objeto recordset, y creado con la instruccin New:
Ing. J. Paredes C.
32

Visual Basic Gua del Estudiante

Pgina

Set MiRecordset2 = New ADOBD.Recodset

La coleccin Fields de un recordset ADO


Contiene todos los objetos Field de un objeto Recordset.

Un objeto Recordset tiene una coleccin Fields que contiene todos los objetos Field. Cada
objeto Field se corresponde a una columna del Recordset.
Vamos a ver aqu un truco que nos permite ADO. Podemos crear un recordset Sin necesidad
de una base de datos!
Cuando estudiamos el objeto recordset vimos que el recordset se crea con una instruccin
como esta:
Set MiRecordset1 = New ADODB.Recordset
Ahora ya podemos abrir el recordset leyendo los datos desde una base de datos. Utilizamos
para ello el mtodo Open del recordset:
MiRecordset1.Open "Select * From Regimenes", MiConexionADO, adOpenDynamic, adLockOptimistic

Mediante el mtodo Open lo que hace el recordset es conocer su estructura (Que campos
tiene, propiedades de estos campos, etc) y el valor de cada uno de los campos de sus registros.
Qu pasara si en vez de abrir el recordset le vamos aadiendo objetos Field a su coleccin
Fields? Lo hacemos mediante el mtodo Append:
MiRecordset1.Fields.Append "MiCampo1", adBigInt
MiRecordset1.Fields.Append "MiCampo2", adChar, 25
MiRecordset1.Fields.Append "MiCampo3", adBSTR
Lo que ocurre es que el recordset ya tiene tres campos, el primero de nombre MiCampo1,
numrico Long, el segundo, un string de 25 caracteres de nombre MiCampo2, y el tercero, de
nombre MiCampo3, una cadena de caracteres de longitud indefinida, terminada en un carcter
nulo. Ya tenemos una estructura de un recordset sin necesidad de haber ledo la base de
datos. No es necesario por lo tanto que exista una tabla o consulta almacenada con esa
estructura. Ahora podemos abrir el recordset:
MiRecordset1.Open
Lo abrimos sin pasarle ningn parmetro. Ahora ya est abierto y podemos trabajar con el
como con un recordset cualquiera. Recuerde que al principio est vaco.
MiRecordset1.AddNew
MiRecordset1!MiCampo1 = 34
MiRecordset1!MiCampo2 = "Gua del Estudiante"
MiRecordset1!MiCampo3 = "Hola mi amor" & vbCrLf & "Yo soy tu lobo"
MiRecordset1.Update
Ya tenemos un registro dentro del recordset. Podemos introducirle tantos registros como
queramos, y luego movernos por el recordset mediante los mtodos Movexxxx. Ahora
podremos leer el contenido del registro actual:
Label1 = MiRecordset1!MiCampo1
Label2 = MiRecordset1!MiCampo2
Ing. J. Paredes C.
33

Visual Basic Gua del Estudiante

Pgina

Label3 = MiRecordset1!MiCampo3
El resultado del cdigo de el ejemplo se traducir en algo como esto:

Y ahora vienen lo mejor. Para que queremos un recordset que no tienen datos ledos desde
una base de datos? Las aplicaciones de esto solamente est limitadas por la imaginacin.
Pienso, por ejemplo, en introducir en un recordset todos los datos ledos de un fichero de
configuracin, y as tener todos esos datos disponibles durante toda la aplicacin, en vez de en
variables, como
MiRecordset!MiDato1
Es una idea, pero piense que esto no regala nada. El espacio de memoria consumido ser
similar a si usa variables. Pero posiblemente estar ms cmodo y ms inteligible su cdigo.
Veamos los mtodos de la coleccin Fields

Mtodo Append
Agrega un campo a una coleccin Fields de un Recoprdset.
Sintaxis

MiRecordset.Fields.Append Name, Type, DefinedSize, Attrib

Name Un String con el nombre del nuevo objeto Field, que tiene que ser nico dentro de la
coleccn Fields.
Type

Tipo de datos que va a contener ese campo. Puede tomar uno de estos valores:

adArray
adBigInt
adBinary
adBoolean
adByRef
adBSTR
adChar
adCurrency

adDate
adDBDate
adDBTime
adDBTimeStamp
adDecimal
adDouble
adEmpty
adError
adGUID
Ing. J. Paredes C.
34

Se une en una instruccin OR lgica con otro tipo para indicar que los
datos son una matriz segura de ese tipo (DBTYPE_ARRAY).
Un entero con signo de 8 bytes (DBTYPE_I8).
Un valor binario (DBTYPE_BYTES).
Un valor Boolean (DBTYPE_BOOL).
Se une en una instruccin OR lgica con otro tipo para indicar que los
datos son un puntero a los datos del otro tipo (DBTYPE_BYREF).
Una cadena de caracteres terminada en nulo (Unicode)
(DBTYPE_BSTR).
Un valor de tipo String (DBTYPE_STR).
Un valor de tipo Currency (DBTYPE_CY). Un valor Currency es un
nmero de coma fija con cuatro dgitos a la derecha del signo decimal.
Se almacena en un entero con signo de 8 bytes en escala de 10.000.
Un valor de tipo Date (DBTYPE_DATE). Un valor Date se almacena
como un valor de tipo Double; la parte entera es el nmero de das
transcurridos desde el 30 de diciembre de 1899 y la parte fraccionaria
es la fraccin de un da.
Un valor de fecha (aaaammdd) (DBTYPE_DBDATE).
Un valor de hora (hhmmss) (DBTYPE_DBTIME).
Una marca de fecha y hora (aaaammddhhmmss ms una fraccin de
miles de millones) (DBTYPE_DBTIMESTAMP).
Un valor numrico exacto con una precisin y una escala fijas
(DBTYPE_DECIMAL).
Un valor de coma flotante de doble precisin (DBTYPE_R8).
No se ha especificado ningn valor (DBTYPE_EMPTY).
Un cdigo de error de 32 bits (DBTYPE_ERROR).
Un identificador nico global (GUID) (DBTYPE_GUID).
Visual Basic Gua del Estudiante

Pgina

adIDispatch
adInteger
adIUnknown
adLongVarBinary
adLongVarChar
adLongVarWChar
adNumeric
adSingle
adSmallInt
adTinyInt
adUnsignedBigInt
adUnsignedInt
adUnsignedSmallInt
adUnsignedTinyInt
adUserDefined
adVarBinary
adVarChar
adVariant
adVector

adVarWChar
adWChar

Un puntero a una interfaz Idispatch de un objeto OLE


(DBTYPE_IDISPATCH).
Un entero firmado de 4 bytes (DBTYPE_I4).
Un puntero a una interfaz Iunknown de un objeto OLE
(DBTYPE_IUNKNOWN).
Un valor binario largo (slo para el objeto Parameter).
Un valor largo de tipo String (slo para el objeto Parameter).
Un valor largo de tipo String terminado en nulo (slo para el objeto
Parameter).
Un valor numrico exacto con una precisin y una escala exactas
(DBTYPE_NUMERIC).
Un valor de coma flotante de simple precisin (DBTYPE_R4).
Un entero con signo de 2 bytes (DBTYPE_I2).
Un entero con signo de 1 byte (DBTYPE_I1).
Un entero sin signo de 8 bytes (DBTYPE_UI8).
Un entero sin signo de 4 bytes (DBTYPE_UI4).
Un entero sin signo de 2 bytes (DBTYPE_UI2).
Un entero sin signo de 1 byte (DBTYPE_UI1).
Una variable definida por el usuario (DBTYPE_UDT).
Un valor binario (slo para el objeto Parameter).
Un valor de tipo String (slo para el objeto Parameter).
Un tipo Variant de automatizacin (DBTYPE_VARIANT).
Se une en una instruccin OR lgica con otro tipo para indicar que los
datos son una estructura DBVECTOR, tal como est definida por OLE
DB, que contiene un contador de elementos y un puntero a los datos
del otro tipo (DBTYPE_VECTOR).
Una cadena de caracteres Unicode terminada en nulo (slo para el
objeto Parameter).
Una cadena de caracteres Unicode terminada en nulo
(DBTYPE_WSTR).

DefinedSize
un string)

Un Long que define el tamao del campo si fuese necesario. (Por ejemplo para

Attrib
valores:

(Opcional). Especifica los atributos del campo a aadir. Puede tomar estos

adFldMayDefer
adFldUpdatable
adFldUnknownUpdatable
adFldFixed
adFldIsNullable
adFldMayBeNull
adFldLong

adFldRowID

adFldRowVersion
adFldCacheDeferred

Ing. J. Paredes C.
35

Indica que el campo se aplaza, es decir, los valores del campo no se


recuperan del origen de datos con todo el registro, sino solamente
cuando se tiene acceso explcito a los mismos.
Indica que se puede escribir en el campo.
Indica que el proveedor no puede determinar si se puede escribir en el
campo.
Indica que el campo contiene datos de longitud fija.
Indica que el campo acepta valores Null.
Indica que se pueden leer valores Null del campo.
Indica que se trata de un campo binario largo. Tambin indica que se
pueden utilizar los mtodos AppendChunk y GetChunk.
Indica que el campo contiene un identificador de fila persistente en el
que no se puede escribir y que no tiene ningn valor significativo
excepto la identificacin de la fila (como por ejemplo un nmero de
registro, un identificador nico, etc.).
Indica que el campo contiene algn tipo de marca de hora o de fecha
que se utiliza para efectuar actualizaciones.
Indica que el proveedor almacena los valores del campo en la memoria
cach y que las lecturas siguientes se efectan en dicha memoria .

Visual Basic Gua del Estudiante

Pgina

Mtodo Delete
Tericamente elimina un objeto de la coleccin Fields.
Sintaxis

Fields.Delete Field

Field
Un Variant que designa el objeto Field que se va a eliminar. Este parmetro tiene
que ser el nombre del objeto Field; no puede ser una posicin ordinal o el propio objeto Field.
Comentarios
La llamada al mtodo Fields.Delete en un Recordset abierto provoca un error de ejecucin.
(Como ha ocurrido en otras ocasiones, al autor le ha sido imposible ejecutar este mtodo con
los resultados esperados)

Mtodo Item
Sintaxis

MiRecordset.Fields.Item (Index)

Devuelve el elemento de la coleccin Fields especificado en el ndice. Devuelve el objeto, por lo


tanto, y sobre ese objeto, podemos obtener las propiedades que deseemos. En el ejemplo
siguiente, introducimos los nombres de todos los campos en un ComboBox llamado
ComboCampos
Dim MM As String, I As Integer
For I = 0 To MiRecordset1.Fields.Count - 1
MM = MiRecordset1.Fields.Item(I).Name
ComboCampos.AddItem MM
Next I

Mtodo Refresh
Aunque la coleccin Fields tiene este mtodo, la verdad es que no tienen efectos visibles sobre
esa coleccin.

Propiedades de la coleccin Fields


Propiedad Count
Devuelve el nmero de campos de la coleccin Fields. Es un Long.

Ing. J. Paredes C.
36

Visual Basic Gua del Estudiante

Pgina

Ing. J. Paredes C.
37

Visual Basic Gua del Estudiante

Pgina

El Objeto

Command

Un objeto Command es la definicin de un comando especfico que se piensa ejecutar contra


un origen de datos. Mediante un objeto Command podemos crear un recordset, pero recuerde
que un recordset lo podemos tambin crear directamente.
Utilice un objeto Command para consultar una base de datos y obtener registros en un objeto
Recordset, para aadir o eliminar registros, ejecutar una operacin de manejo masivo de datos
o para manipular la estructura de una base de datos.
Propiedades del Objeto Command
Propiedad ActiveConnection
Indica a qu objeto Connection pertenece actualmente el objeto Command. Es un string con el
nombre de la conexin.
Propiedad CommandText
Contiene el texto del comando que se quiere emitir al proveedor. Es un string. Suele ser una
instruccin SQL, un nombre de tabla o un procedimiento almacenado, o cualquier otra
instruccin que reconozca el proveedor. El valor predeterminado es una cadena vaca.
Propiedad CommandTimeout
Especifica el intervalo de espera para que se ejecute un comando antes de que finalice el
intento y se genere un error. Es un Long que indica en segundos ese tiempo. El valor
predeterminado es 30.
Propiedad CommandType

(IMPORTANTE)

Indica el tipo de un objeto Command. Esta propiedad se usa para optimizar la evaluacin de la
propiedad CommandText, ya que de esta forma el proveedor no tiene que perder tiempo
examinando si es una instruccin SQL, un procedimiento almacenado o un nombre de tabla. Si
el valor de esta propiedad es adCmdUnknown (valor predeterminado), estamos forzando al
proveedor a que realice esa investigacin lo que provocar probablemente un descenso en su
rendimiento. Si sabe qu tipo de comando est usando, el establecimiento de la propiedad
CommandType instruye a ADO a que vaya directamente al cdigo relevante. Si la propiedad
CommandType no coincide con el tipo de comando de la propiedad CommandText, ocurre un
error cuando llama al mtodo Execute.
Valores posibles
AdCmdText

Indica que es una definicin textual de un comando o una llamada a un


procedimiento almacenado.

AdCmdTable

Indica que es un nombre de tabla cuyas columnas se devuelven todas


mediante una consulta SQL generada internamente.

AdCmdTableDirect

Indica que es un nombre de tabla en la que se devuelven todas las


columnas.

AdCmdStoredProc

Indica que es un nombre de procedimiento almacenado

AdCmdUnknown

Predeterminado. El tipo de comando de la propiedad CommandText


es desconocido.

AdCmdFile

Evala CommandText como el nombre de archivo de un valor


Recordset persistente.

Ing. J. Paredes C.
38

Visual Basic Gua del Estudiante

Pgina

AdExecuteNoRecords Indica que es un comando o un procedimiento almacenado que no


devuelve filas (por ejemplo, un comando que slo inserta datos). Si se recupera alguna fila, se
descarta y no se devuelve. Siempre se combina con adCmdText o adCmdStoredProc.
Propiedad Prepared
Es un Booleano que indica si se debe guardar una versin compilada de un comando antes de
su ejecucin. Esta propiedad fuerza al proveedor a guardar una versin preparada (compilada)
de la consulta especificada en la propiedad CommandText antes de la primera ejecucin de un
objeto Command. Esto puede disminuir el rendimiento de la primera ejecucin de un comando,
pero cuando el proveedor haya compilado el comando, utilizar la versin compilada del mismo
para las ejecuciones siguientes, lo cual aumentar el rendimiento.
Si el proveedor no admite la preparacin del comando, puede devolver un error cuando esta
propiedad se establezca a True. Si no devuelve un error, simplemente ignora la solicitud de
preparar el comando y establece la propiedad Prepared a False.
Propiedad State
Describe el estado del objeto: abierto o cerrado. Devuelve un Long o una constante:
adStateClosed o adStateOpen

Mtodos del Objeto Command


Mtodo Execute

(IMPORTANTE, ms bien diramos, el objetivo del Command)

Ejecuta la consulta, la instruccin SQL o el procedimiento almacenado especificado en la


propiedad CommandText. Devuelve un recordset o modifica la base de datos.
Sintaxis
Para un Command que devuelva filas:
Set recordset = command.Execute(RecordsAffected, Parameters, Options)
Para un Command que no devuelva filas:
command.Execute RecordsAffected, Parameters, Options
command es el nombre del Objeto Command
RecordsAffected Opcional. Una variable Long en la que el proveedor devuelve el nmero de
registros afectados por la operacin.
Parameters Opcional. Una matriz Variant con los valores de los parmetros pasados con una
instruccin SQL. (Los parmetros de salida no devuelven valores correctos cuando se pasan en
este argumento).
Options Opcional. Un valor Long o una constante. Acepta estos valores
adCmdText
adCmdTable
adCmdTableDirect
AdCmdStoredProc
adCmdUnknown
adAsyncExecute

Ing. J. Paredes C.
39

Indica que el proveedor tiene que evaluar CommandText como


definicin textual de un comando, como una instruccin SQL.
Indica que ADO tiene que generar una consulta SQL para devolver
todas las filas de la tabla mencionada en CommandText.
Indica que el proveedor tiene que devolver todas las filas de la tabla
mencionada en CommandText.
Indica que el proveedor tiene que evaluar CommandText como
procedimiento almacenado.
Indica que el tipo de comando en CommandText es desconocido.
Indica que el comando se tiene que ejecutar de forma asncrona.

Visual Basic Gua del Estudiante

Pgina

adAsyncFetch Indica que el resto de las filas siguientes a la cantidad inicial especificada en la
propiedad CacheSize tiene que ser recuperada de forma asncrona.
Mtodo Cancel
Cancela la ejecucin de una llamada asncrona pendiente al mtodo Execute
Sintaxis

NombredelObjetoCommand.Cancel

Utilice el mtodo Cancel para terminar la ejecucin de una llamada asncrona a un mtodo
Execute (es decir, el mtodo fue invocado con la opcin adAsyncExecute o adAsyncFetch).

Comandos parametrizados.
Los objetos Command pueden utilizar parmetros. De esta forma, podemos construir una
consulta utilizando la interrogacin (?) como comodn. As cada vez que ejecutemos el
comando, V.B. se encargar de sustituir el comodn por los parmetros asociados a dicho
command. Adems podemos utilizar los parmetros para recoger los valores devueltos por un
Procedimiento almacenado en la base de datos. Para entender mejor este tipo de consultas
primero veremos qu es el objeto parameter.

Ejemplo de la utilizacin de Command


Veamos un ejemplo de cmo usar el Objeto Command. Pero previamente vamos a ver un
cdigo del que hemos partido para hacer ver al alumno que ADO permite hacer las cosas de
muchas maneras. Este cdigo mete los datos de un documento en una base de datos Oracle,
leyendo previamente el nmero ms alto del documento para poner al nuevo documento un
nmero igual al ltimo + 1.:
Declaraciones
Dim ConexBDPrensa As ADODB.Connection
Dim RsBDPrensa1 As ADODB.Recordset
Dim StrIntroducir As String, NumeroDocumento as long
Rem Se abre un objeto Connection para crear sobre l el recordset
Set ConexBDPrensa = New ADODB.Connection
ConexBDPrensa.ConnectionString = "Provider=MSDAORA.1; & _
User ID=INTRANET;Password=INTRANET;Data Source=intranet; & _
Persist Security Info=False"
ConexBDPrensa.Open

Rem Se abre un recordset para leer el nmero, se lee y se vuelve a cerrar


RsBDPrensa1.Open "Int_Documentos Order By CL_DOC", ConexBDPrensa, adOpenDynamic,
adLockOptimistic
RsBDPrensa1.MoveLast
NumeroDocumento = RsBDPrensa1!CL_DOC
NumeroDocumento = NumeroDocumento + 1
RsBDPrensa1.Close
(* Este es el punto donde cambia el cdigo que ver ms adelante)
Rem Se introduce en una variable tipo String una instruccin para aadir un nuevo registro
Rem Esa instruccin se va a ejecutar desde el objeto Connection mediante su mtodo Execute

StrIntroducir = "Insert Into INT_DOCUMENTOS " & _


"(CL_DOC,NOM_DOC,TITULO_DOC,AUTOR_DOC,CL_TEMA_DOC,CL_DPT_DOC, & _
CL_TIPO_DOC,FICH_DOC,FECHA_EMISION_DOC,ULTIMA_HORA_DOC, & _
Ing. J. Paredes C.
40

Visual Basic Gua del Estudiante

Pgina

VISIBLE_DOC) Values (" & NumeroDocumento & ",'" & TbTitulo & "','" & TbTitulo & _
"','" & TbTitulo.Tag & "',19,2,1,'" & HRefPrensa & "/" & TbNombFichTIF & "','" & Date & "',0,1)"
Rem Observe que los valores tipo string introducidos (TbXXX) van entre comilla simple
Rem Se ejecuta esa instruccin desde el objeto Connection ConexBDPrensa
ConexBDPrensa.Execute StrIntroducir
Rem Se cierra el Objeto Connection
ConexBDPrensa.Close
Rem Aqu termina la operacin de crear un nuevo registro
MsgBox "Documento enviado"
Este es el cdigo real de una aplicacin que introduce los datos el resumen de prensa diario en
una base de datos. Se introduce un nuevo registro en la tabla INT_DOCUMENTOS. El resumen
de prensa es un fichero .Tiff de nombre TbNombFichTIF que se mete en una carpeta del
servidor mediante FTP, y para su loccalizacin y presentacin en una pgina Web es necesario
introducir su nombre y Path y otros datos en una base de datos. Los campos que se introducen
y los valores de cada uno son:
Campo

Valor

CL_DOC,
NOM_DOC
TITULO_DOC
AUTOR_DOC
CL_TEMA_DOC
CL_DPT_DOC
CL_TIPO_DOC
FICH_DOC

NumeroDocumento
(Long calculado)
TbTitulo
(String contenido en TbTitulo.Text)
TbTitulo
(String contenido en TbTitulo.Text se repite-)
TbTitulo.Tag
(String contenido en TbTitulo.Tag)
19
(Integer, dato fijo)
2
(Integer, dato fijo)
1
(Integer, dato fijo)
HRefPrensa & "/" & TbNombFichTIF Un string que indica el nombre
del fichero (TbNombFichTIF.Text) y su carpeta (Variable HrefPrensa)
FECHA_EMISION_DOC
Date
(Fecha actual)
ULTIMA_HORA_DOC 0
(Byte, dato fijo)
VISIBLE_DOC
1
(Byte, dato fijo)

Esta forma de introducir los datos, mtodo que los lingistas especializados en la jerga
informtica llaman a capn, es la que nunca falla. Exige un poco de cdigo, con muchas
probabilidades de equivocarse, pero muchas veces se prefiere esta forma de meter datos a
utilizar el mtodo AddNew. Tiene la gran ventaja de que la acepta cualquier base de datos,
independientemente de donde est el cursor. Habr observado que utilizamos el mtodo
Execute del objeto Connection. Y as funciona perfectamente. Vamos a hacer lo mismo, pero
introduciendo la cadena de caracteres un objeto Command, (Que pertenece al mismo objeto
Connection sobre el que ahora hemos ejecutado el Execute) y vamos a ejecutar el Execute de
ese Command. Se da cuenta que estamos haciendo lo mismo? El nuevo cdigo creado a
partir del anterior es el siguiente:
(* Este es el mismo punto de antes. Aqu comienza el cambio del cdigo)
Dim MiComando As ADODB.Command
Set MiComando = New ADODB.Command
MiComando.ActiveConnection = ConexBDPrensa
MiComando.CommandText = "Insert Into INT_DOCUMENTOS " _
&
"(CL_DOC,NOM_DOC,TITULO_DOC,AUTOR_DOC,CL_TEMA_DOC,CL_DPT_DOC,CL_TIPO
_DOC,FICH_DOC,FECHA_EMISION_DOC,ULTIMA_HORA_DOC,VISIBLE_DOC) " _
& "Values (" _
& NumeroDocumento & ",'" & TbTitulo & "','" & TbTitulo & "','" & TbTitulo.Tag & "',19,2,1,'" &
HRefPrensa & "/" & TbNombFichTIF & "','" & Date & "',0,1)"
Ing. J. Paredes C.
41

Visual Basic Gua del Estudiante

Pgina

MiComando.Execute
ConexBDPrensa.Close
ADO le permite hacer las cosas de maneras muy distintas, pero siempre debe aportar la misma
informacin. En este caso ha visto que el objeto Command no hace falta para nada. Entonces,
para que existe? La respuesta es sencilla: facilita la comprensin del cdigo. Pero que el
objeto Command no le perjudique precisamente eso, la comprensin del cdigo. No se
preocupe de no ser estrictamente acadmico. Este humilde autor nunca usa Command excepto
para explicarlo. ADO nos permite eso.
Vamos a ver ahora cmo haramos esto mismo con el mtodo AddNew.
Deberemos crear un recordset. Lo primero, lo declaramos:
Dim RsBDPrensa as ADODB.Recodset
Luego lo creamos:
Set RsBDPrensa = New ADODB.Recordset
Lo abrimos. Pero primero tomamos la precaucin de poner la propiedad CursorLocation del
Objeto Connection a adUseClient (Lado cliente) y de esta forma los cursores creados para los
recordsets abiertos sobre ese objeto connection estarn del lado cliente. Si el cursor est de
lado servidor es posible que no nos deje usar el mtodo AddNew. (Vea Nota 1)
ConexBDPrensa.CursorLocation = adUseClient
Abrimos el Recordset:
RsBDPrensa.Open "Int_Documentos", ConexBDPrensa, adOpenDynamic, adLockOptimistic
Ejecutamos el mtodo AddNew
RsBDPrensa.AddNew
Metemos los datos
RsBDPrensa!CL_DOC = NumeroDocumento
RsBDPrensa!NOM_DOC = TbTitulo
RsBDPrensa!TITULO_DOC = TbTitulo
RsBDPrensa!AUTOR_DOC = TbTitulo.Tag
RsBDPrensa!CL_TEMA_DOC = 19
RsBDPrensa!FECHA_EMISION_DOC = Date
RsBDPrensa!CL_DPT_DOC = 2
RsBDPrensa!CL_TIPO_DOC = 1
RsBDPrensa!FICH_DOC = HRefPrensa & "/" & TbNombFichTIF
RsBDPrensa!VISIBLE_DOC = 1
RsBDPrensa!ULTIMA_HORA_DOC = 0
Rematamos con el mtodo Update
RsBDPrensa.Update
Cerramos el recordset.
RsBDPrensa.Close
Cerramos la conexin
ConexBDPrensa.Close
Nota 1. Muchos programadores se rinden cuando ven que no les funciona los mtodos
AddNew / Update para introducir nuevos datos. Cierto es que cada base de datos se comporta
de forma distinta respecto a este mtodo. Pero antes de rendirse y usar el cdigo a capn
intente ver como tienen la propiedad CursorLocation, el tipo de recordset abierto y el tipo de
bloque elegido (Recuerde que por defecto es de solo lectura). Eso s, el mtodo a capn
funciona siempre (Excepto que sea solo lectura), independientemente del bloqueo y del tipo de
cursor
Ing. J. Paredes C.
42

Visual Basic Gua del Estudiante

Pgina

Ing. J. Paredes C.
43

Visual Basic Gua del Estudiante

Pgina

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


Este captulo parece que quedaba un poco corto. No por el nmero de pginas, sino porque
tanto en DAO como en RDO nos explayamos con el control Data, y en ADO parece que
solamente lo hemos visto de pasada para explicar cmo se compone la cadena de conexin.
Vemoslo un poco ms en profundidad.
El control Data para ADO es el Microsoft ADO data control 6.0 (OLEDB) que se encuentra
en Proyecto | Componentes. La apariencia es similar a la del Data de DAO

Hagamos un repaso de sus propiedades. Veremos solamente aquellas que son especficas de
ADO:

Propiedad BOFAction.
Establece la forma de proceder cuando llega a la fila anterior a la primera. Toma uno de estos
valores:
0 adDoMoveFirst
1 adDoStayBOF

Vuelve a la primera fila


Permanece en la fila BOF

Propiedad CommandType
Es idntica a la misma propiedad del objeto Command. Acepta los valores:
AdCmdText

Indica que es una definicin textual de un comando o una llamada a un


procedimiento almacenado.

AdCmdTable

Indica que es un nombre de tabla cuyas columnas se devuelven todas


mediante una consulta SQL generada internamente.

AdCmdStoredProc

Indica que es un nombre de procedimiento almacenado

AdCmdUnknown

Predeterminado. El tipo de comando de la propiedad CommandText


es desconocido.

Propiedad ConnectionString
Esta propiedad ya le hemos visto ms atrs. Es la cadena de conexin con la base de datos.

Propiedad CursorLocation
Es la misma que la vista para el objeto Recordset.

Propiedad CursorType
Es la misma que para el objeto Recordset. Acepta los valores:
1 adOpenKeyset
2 - adOpenDynamic
3 adOpenStatic

Propiedad EOFAction
Ing. J. Paredes C.
44

Visual Basic Gua del Estudiante

Pgina

Establece la forma de proceder cuando llega a la fila EOF. Acepta los valores:
0 adDoMoveLast
1 adStayEOF
2 adDoAddNew

Vuelve a la ltima fila


Permanece en la fila EOF
Aade una nueva fila

Propiedad LockType
Tipo de Bloque. Igual a la misma propiedad del Objeto Recordset

Propiedad MaxRecords
Es similar a la del Objeto Recordset. Establece el nmero de filas que obtiene en su recordset
asociado.

Propiedad Mode.
Igual a la misma propiedad del objeto Recordset

Propiedades Password
Establece la contrasea para crear la cadena de conexin durante la creacin del objeto
Recordset asociado. Esta contrasea es la contrasea del usuario en la base de datos.
Esta propiedad es solamente de escritura. Si se pretende leer da error.

Propiedad UserName
Establece el nombre del usuario. Debe ser uno de los usuarios registrados en la base de datos.
Esta propiedad es de lectura y escritura. El valor de la propiedad Password debe ser el
asociado a este usuario.

Propiedad RecordSource
Es una cadena de caracteres con el nombre de una tabla o una sentencia SQL que devuelve
filas.

Mtodos del control Adodc


UpdateControls
Actualiza la informacin de los controles enlazados a datos.
UpdateRecords.

No existe el mtodo

Refresh
Vuelve a construir el recordset. Es idntico al del control Data de DAO.

Vistas ya las propiedades y mtodos del control Adodc, vamos a ver un poco como funciona y
cuales son sus diferencias con el control data de DAO

Funcionamiento del Adodc


El Adodc puede enlazar una base de datos a los tpicos controles enlazados (Label, TextBox)
usando la tecnologa ADO. Los dems controles enlazados no tienen un comportamiento igual

Ing. J. Paredes C.
45

Visual Basic Gua del Estudiante

Pgina

con el Adodc, Control Data o RDODataControl. En la siguiente lista puede ver que controles
trabajan con uno u otro control Data.

Control

ADO

RDO

DAO

Referencia

DBGrid
DataGrid
DataList
DataCombo
DBList
DBCombo
MSFlexGrid
MSHFlexGrid

NO
SI
SI
SI
SI
SI
NO
SI

SI
NO
SI
SI
SI
SI
SI
NO

SI
NO
SI
SI
SI
SI
SI
NO

Microsoft Data Bound Grid Control 5.0 SP3


Microsoft DataGrid Control 6.0 (OLEDB)
Microsoft Data List Controls 6.0 (OLEDB)
Microsoft Data List Controls 6.0 (OLEDB)
Microsoft Data Bound List Controls 6.0
Microsoft Data Bound List Controls 6.0
Microsoft FlexGrid Control 6.0
Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB)

Por lo dems el funcionamiento del Adodc es similar al Control data y al RDODataControl.

Con este captulo creo que ya tienen conocimientos suficientes para empezar a trabajar con
ADO, y por la tanto, ya tiene permiso para aprender a programar con esta tecnologa. Le
recomiendo paciencia, y sobre todo no tener miedo a esta tecnologa. Y como se dijo al
principio, sela siempre que tenga que usar una base de datos instalada en un servidor y
conectada al usuario a travs de una red de rea local. En el prximo captulo ver como se
enlazan un cliente con el servidor SQL Server.
De cualquier forma no olvide la tecnologa DAO para sus pequeas aplicaciones, con la base
de datos en el mismo ordenador que la aplicacin. Personalmente creo que es mucho ms
rpida y ms sencilla.
Suerte.

Ing. J. Paredes C.
46

Visual Basic Gua del Estudiante

Pgina

You might also like