Sin duda, la mejor parte de ASP es la relacionada con la facilidad que nos
permite para el acceso a bases de datos, mediante la utilización de
ActiveX Data Objects
, más conocido como ADO. Este modelo de acceso
a bases de datos se basa en la utilización de siete objetos: Connection,
Recordset, Command, Field, Parameter, Property y Error
. Sin embargo, de
estos siete objetos uno de los más importantes y más ricos en cuanto a las
posibilidades que nos brinda para el manejo de datos es el
Recordset
.
En términos sencillos, un objeto Recordset
es una tabla que
contiene los datos que manejará nuestra aplicación ASP. Esta tabla almacena el
resultado obtenido por las consultas realizadas sobre la base de datos a la que
nos encontremos conectados mediante el objeto Connection
. Un
Recordset
se encuentra formado por filas (registros) y columnas
(campos), a las que deberemos hacer referencia para poder acceder a sus datos.
Para recuperar datos, examinar resultados y modificar bases de datos, ADO nos proporciona el objeto Recordset. El objeto Recordset tiene las funciones necesarias para, dependiendo de las restricciones de las consultas, recuperar y presentar un conjunto de filas, o registros, de una base de datos. El objeto Recordset mantiene la posición de cada registro devuelto por la consulta, lo que nos permite "recorrer" los resultados de uno en uno.
Las buenas aplicaciones de base de datos emplean el objeto Connection para establecer un vínculo y el objeto Recordset para manipular los datos devueltos. Si utilizamos conjuntamente las funciones especializadas de ambos objetos podremos desarrollar aplicaciones de bases de datos que realicen casi cualquier tarea de tratamiento de datos.
Un cursor corresponde a un tipo de restricción aplicable al Recordset, y que señala la forma en que se podrá recorrer este objeto. Dependiendo de cómo se configuren las propiedades del tipo de cursor del objeto Recordset, se puede recorrer y actualizar los registros. Los cursores de la base de datos se comportan como punteros que permiten encontrar un elemento específico de un conjunto de registros. Los cursores son especialmente útiles para recuperar y examinar registros, y después realizar operaciones basadas en dichos registros. Si lo que necesitamos es recorrer el Recordset en forma secuencial, lo mejor es utilizar el cursor por defecto ya que es el que consume menos recursos, agilizando las operaciones. Por el contrario, si necesitamos recorrer el Recordset de otra forma, estos son los tipos de cursores existentes:
Tipo de Cursor |
Valor |
Descripción |
adOpenForwardOnly |
0 |
Es el cursor por defecto y nos permite recorrer el Recordset en forma secuencial. |
adOpenKeySet |
1 |
Permite movernos hacia delante y atrás. Permite observar las modificaciones en los datos del Recordset , no así si existen ingresos de nuevos registros. |
adOpenDynamic |
2 |
Permite movernos en cualquier sentido, viendo cualquier modificación, ingreso o eliminación de datos del Recordset. |
adOpenStatic |
3 |
Permite movernos en cualquier sentido, pero no se verá ningún cambio ocurrido en la tabla. |
Una de las formas de utilizar un tipo de cursor puede ser la siguiente:
rs.Open SQL, oConn, cursor
Donde rs
y oConn
corresponden a objetos
Recordset y Connection respectivamente, y SQL
corresponde a la
sentencia que contendrá la consulta a la base de datos.
Otra forma de definir el tipo de cursor de un Recordset sería utilizando la propiedad CursorType, de la siguiente forma:
rs.CursorType = cursor
Los cerrojos deben ser utilizados casi obligatoramente en Recordset que hacen referencia a bases de datos con alta concurrencia de usuarios. Mediante la utilización de estos cerrojos podremos controlar el tipo de acceso que le daremos a los demás usuarios cuando alguien ya se encuentre modificando el Recordset. Los tipos de cerrojos que podremos utilizar son los siguientes:
Tipo de Cerrojo |
Valor |
Descripción |
adLockReadOnly |
1 |
Es el cerrojo por defecto y no permite modificar los registros de la tabla. |
adLockPessimistic |
2 |
Una vez que alguien abre la tabla, ésta queda bloqueada para los demás usuarios. Con este modo se asegura la integridad de los datos. |
adLockOptimistic |
3 |
La tabla sólo será bloqueada a los demás usuarios mientras se ejecute una operación Update. De esta forma la tabla se bloqueará durante mucho menos tiempo que con el método anterior. |
adBatchOptimistic |
4 |
Los registros serán actualizados en modo batch. |
Una de las formas de utilizar un tipo de cerrojo puede ser la siguiente:
rs.Open SQL, oConn, cursor, cerrojo
Donde rs
y oConn
corresponden a objetos
Recordset y Connection respectivamente, y SQL
corresponde a la
sentencia que contendrá la consulta a la base de datos.
Otra forma de definir el tipo de cerrojo de un Recordset sería utilizando la propiedad LockType, de la siguiente forma:
rs.LockType = cerrojo
Tanto los cursores, como los cerrojos utilizados por ADO deben encontrarse definidos como constanstes en nuestras aplicaciones para poder ser usados en nuestro código.
Uno de los métodos existentes para definir estas constantes consiste en utilizar una biblioteca de tipos de componentes. Una biblioteca de tipos de componentes corresponde a un archivo que almacena todos los parámetros ADO. Para utilizar este tipo de archivos basta con agregar, al archivo .asp o al Global.asa, la siguiente línea de códigos:
<!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5
Library" TYPE="TypeLib"
UUID="{00000205-0000-0010-8000-00AA006D2EA4}"-->
Otra alternativa, mucho más simple y por ello más utilizada es la de incluir el archivo ADOVBS.INC. Este archivo se incluye en la instalación del IIS y contiene todas las constantes ADO posibles de utilizar desde ASP. Para poder utilizar este archivo se debe agregar la siguiente línea en nuestro código:
<!-- #include virtual = "adovbs.inc" -->
Una vez que hemos incluido este archivo, podremos utilizar las
constantes definidas en él, haciendo referencia a los valores declarados para
cada uno de los parámetros ADO. Por ejemplo, si queremos definir un recordset
que utilice un cursor de tipo adOpenKeySet
escribiremos el
siguiente código, haciendo referencia al valor 1 que corresponde a la constante
adOpenKeySet
:
rs.Open SQL, oConn, 1
Si quieres saber más del archivo ADOVBS.INC lee este artículo.
Teniendo claro el uso de los cursores y los cerrojos, podemos comenzar a ver los métodos y propiedades que utilizaremos para recorrer un Recordset. A través de la utilización de los métodos podremos definir el movimiento a realizar, el que será complementado con la utilización de las propiedades que nos permitirán controlar la situación del puntero, evitando que nos salgamos de los límites del Recordset.
Método |
Descripción |
Move |
Permite movernos hacia arriba si le indicamos un número
positivo, o hacia abajo si le indicamos uno negativo. Ej.: rs.Move
-2 |
MoveFirst |
Nos lleva al primer registro del Recorset. |
MoveNext |
Nos permite recorrer secuencialmente el Recordset, avanzando un registro hacia adelante. |
MoveLast |
Nos lleva al último registro del Recordset. |
MovePrevious |
Nos permite recorrer en forma inversa el Recordset, avanzando un registro hacia atrás. Nos lleva al registro anterior. |
Las propiedades relacionadas con el movimiento a través del Recordset son las siguientes:
Propiedad |
Descripción |
AbsolutePosition |
Nos indica el número del registro en el que nos
encontramos. También lo podemos utilizar para movernos a una determinada
posición. Ej.: rs.AbsolutePosition = 5 |
BOF |
Es True cuando nos encontramos al principio
del Recordset, antes del primer registro. |
EOF |
Es True cuando nos encontramos al final del
Recordset, después del último registro. |
RecordCount |
Nos señala el número de registros que contiene el objeto Recordset. |
Ahora que hemos visto los aspectos básicos de un Recordset entregaremos al lector una guía con los principales métodos asociados a este objeto, de forma que se pueda profundizar en el estudio y utilización del objeto Recordset.
Método |
Descripción |
AddNew |
Crea un nuevo registro en el Recordset. Sólo será
insertado en la tabla cuando se aplique el método Update.
Ejemplo:
|
CancelUpdate |
Cancela un proceso de actualización, ya sea de creación o de modificación de registros. |
Clone |
Crea una copia del objeto Recordset. Ejemplo: Set
rs2 = rs.Clone |
Close |
Cierra el objeto Recordset utilizado. |
Delete |
Elimina del Recordset el registro que estemos utilizando en ese momento. |
GetRows |
Crea un arreglo con el contenido del Recordset. Si quieres aprender más sobre este método visita este artículo. |
Move |
Permite movernos hacia arriba si le indicamos un número
positivo, o hacia abajo si le indicamos uno negativo. Ejemplo:
rs.Move -2 |
MoveFirst |
Nos lleva al primer registro del Recorset. |
MoveNext |
Nos permite recorrer secuencialmente el Recordset, avanzando un registro hacia adelante. |
MoveLast |
Nos lleva al último registro del Recordset. |
MovePrevious |
Nos permite recorrer en forma inversa el Recordset, avanzando un registro hacia atrás. Nos lleva al registro anterior. |
NextRecordSet |
En algunos casos una consulta SQL puede devolver más de un Recordset. Con este método borraremos el Recordset actual y avanzaremos al siguiente. |
Open |
Abre el objeto Recordset, cargando en él los resultados de
la consulta efectuada a una o varias tablas. Ejemplo: rs.Open SQL,
oConn, cursor, cerrojo |
Requery |
Con este método se puede actualizar el objeto Recordset, observándose los cambios ocurridos en los datos. |
Supports |
Mediante este método podremos validar si el objeto Recordset abierto, soporta algún método o función en particular. Este método nos presente las siguientes posibilidades:
|
Update |
Actualiza la tabla a la que hace referencia el objeto Recordset, haciendo efectivos los cambios realizados. |
Vistos los métodos, pasaremos a analizar las propiedades del objeto Recordset, con las cuales podremos conocer el estado de este objeto durante la ejecución de nuestra aplicación.
Propiedad |
Descripción |
AbsolutePage |
Cuando hayamos paginado nuestro Recordset, podremos utilizar esta propiedad para ubicarnos en una página determinada del objeto paginado. Para aprender más sobre la paginación de Recordset lee el este artículo. |
AbsolutePosition |
Nos indica el número del registro en el que nos
encontramos. También lo podemos utilizar para movernos a una determinada
posición. Ej.: rs.AbsolutePosition = 5 |
ActiveConnection |
Sirve para leer el DSN o la ruta correspondiente a la conexión relacionada con nuestro objeto Recordset. |
BOF |
Es True cuando nos encontramos al principio
del Recordset, antes del primer registro. |
Bookmark |
Devuelve o fija un identificador para el registro actual. |
CacheSize |
Define el número de registros o filas que el Recordset va a pre-almacenar en la memoria caché. |
CursorType |
Se relaciona con el tipo de cursor que utilizaremos en el objeto Recordset. Las opciones se analizaron en el apartado "Tipos de Cursor del Recordset" |
EditMode |
Señala el estado de edición de un registro. Existen tres posibilidades:
|
EOF |
Es True cuando nos encontramos al final del
Recordset, después del último registro. |
Filter |
Permite filtrar un Recordset, manteniendo sólo los
registros que superen ese filtro. Ejemplo:Filtro = "Fecha='"
& Date "'" |
LockType |
Se relaciona con el tipo de cerrojo que utilizaremos en el objeto Recordset. Las opciones se analizaron en el apartado "Tipos de Cerrojo del Recordset" |
MaxRecords |
Nos permite fijar el número máximo de registros que aceptará el objeto Recordset. El valor por defecto es 0 e indica que no existirá límite. |
PageCount |
Nos dice cuántas páginas tenemos en función del tamaño de cada página que hemos con PageSize. |
PageSize |
Define el número de registros o filas que forman una página. Por defecto son 10. |
RecordCount |
Nos señala el número de registros que contiene el objeto Recordset. |
State |
Señala el estado del objeto Recodset. Existen las siguientes posibilidades:
|
Por último, debemos referirnos a las dos colecciones que forman parte del objeto Recordset. Estas colecciones son las siguientes:
Colección |
Descripción |
Fields |
La colección Fields representa los campos o columnas del
objeto Recordset. Los objetos Field de un objeto Recordset se utilizan
para leer y establecer valores para los campos del registro activo del
objeto Recordset. Para hacer referencia a un objeto Field en una colección
por su número de orden o por su valor de propiedad Name, podemos utilizar
los siguientes formatos de sintaxis :Fields(0)
|
Properties |
Corresponde al conjunto de propiedades del objeto
Recordset, ya sean por defecto o modificadas por nosotros. Accederemos a
ellas de la siguiente
forma:rs.Propierties(propiedad)
|
El modelo de acceso a datos ADO y sus objetos asociados nos entregan una manera sumamente fácil, pero no por ello poco poderosa para el acceso a datos. En este artículo, hemos pretendido mostrar de forma sencilla y clara las características, métodos y propiedades más importantes del objeto Recordset, que constituye la base principal para el desarrollo de cualquier aplicación que implique la generación dinámica de contenido HTML, tomando como referencia información contenida en base de datos externas.