Teoria de Ado Visual Basic 6.0
Teoria de Ado Visual Basic 6.0
Teoria de Ado Visual Basic 6.0
O
L
E
Bases de datos
Relacionales
D
B
A
D
O
O
D
B
C
Texto
O
D
B
C
Bases de datos
relacionales
Modelo DAO/RDO
Ing. J. Paredes C.
Pgina 1
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.
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.
Pgina 3
Ing. J. Paredes C.
Pgina 4
Ing. J. Paredes C.
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.
Ing. J. Paredes C.
Pgina 6
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.
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
Ing. J. Paredes C.
Pgina 8
Ing. J. Paredes C.
Pgina 9
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
Pgina
Ing. J. Paredes C.
11
Pgina
Ing. J. Paredes C.
12
Pgina
Ing. J. Paredes C.
13
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)
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
AdModeShareDenyNone
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.
Pgina
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
Ing. J. Paredes C.
16
Pgina
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.
(IMPORTANTE)
Ing. J. Paredes C.
17
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
Pgina
Objeto Property
Un objeto Property representa una caracterstica dinmica de un objeto ADO que est definida
por el proveedor.
Ing. J. Paredes C.
19
Pgina
Ing. J. Paredes C.
20
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
Pgina
AdEditDelete
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
Pgina
AdFilterAffectedRecords
AdFilterFetchedRecords
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
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
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
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
Pgina
AdResync
AdUpdate
AdUpdateBatch
AdIndex
AdSeek
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
Pgina
AdLockOptimistic
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
Pgina
METODO AddNew
Crea un nuevo registro en un objeto Recordset actualizable.
Sintaxis
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
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
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
Pgina
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
(El objeto rstDuplicate debe estar declarado previamente como objeto ADODB.Recordset)
LockType puede tomar uno de los siguientes valores:
AdLockUnspecified
AdLockReadOnly
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
Pgina
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
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.
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
Ing. J. Paredes C.
31
Pgina
AAdPersistXML
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 ( ; )
Pgina
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
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
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
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
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)
Mtodo Refresh
Aunque la coleccin Fields tiene este mtodo, la verdad es que no tienen efectos visibles sobre
esa coleccin.
Ing. J. Paredes C.
36
Pgina
Ing. J. Paredes C.
37
Pgina
El Objeto
Command
(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
AdCmdTable
AdCmdTableDirect
AdCmdStoredProc
AdCmdUnknown
AdCmdFile
Ing. J. Paredes C.
38
Pgina
Ing. J. Paredes C.
39
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.
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
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
Pgina
Ing. J. Paredes C.
43
Pgina
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
Propiedad CommandType
Es idntica a la misma propiedad del objeto Command. Acepta los valores:
AdCmdText
AdCmdTable
AdCmdStoredProc
AdCmdUnknown
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
Pgina
Establece la forma de proceder cuando llega a la fila EOF. Acepta los valores:
0 adDoMoveLast
1 adStayEOF
2 adDoAddNew
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.
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
Ing. J. Paredes C.
45
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
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
Pgina