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. Definiendo el Concepto 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. Tipos de Cursor del Recordset 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 adOpenForwardOnly 0 Descripción Es el cursor por defecto y nos permite recorrer el Recordset en forma secuencial. 1 adOpenKeySet Permite movernos hacia delante y atrás. Permite observar las modificaciones en los datos del Recordset , no así si existen ingresos de nuevos registros. 2 adOpenDynamic Permite movernos en cualquier sentido, viendo cualquier modificación, ingreso o eliminación de datos del Recordset. 3 adOpenStatic 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 y rs y oConn corresponden a objetos Recordset y Connection respectivamente, 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 Tipos de Cerrojo del Recordset 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. 2 adLockPessimistic 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. 3 adLockOptimistic 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. 4 adBatchOptimistic 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 y rs y oConn corresponden a objetos Recordset y Connection respectivamente, 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 Definiendo nuestras Constantes: ADOVBS.INC o METADATA 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. Moviéndonos por el Recordset 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.: BOF Es rs.AbsolutePosition = 5 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. Métodos, propiedades y colecciones del 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 AddNew Descripción Crea un nuevo registro en el Recordset. Sólo será insertado en la tabla cuando se aplique el método Update. Ejemplo: rs.AddNew rs("Nombre") = "Rodrigo" rs("Apellido") = "Rohland" rs.Update 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: • adAddNew. El Recordset soporta el método AddNew. • adApproxPosition. Soporta las propiedades AbsolutePosition y AbsolutePage. • adDelete. Soporta el método Delete. • adMovePrevious. Soporta los métodos Move y MovePrevious. • Update adUpdate. Soporta el método 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 AbsolutePage Descripción 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.: ActiveConnection rs.AbsolutePosition = 5 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: • adEditNone. El registro no se encuentra editado. • adEditInProgress. El registro se encuentra editado, pero no se ha grabado. • adEditAdd. Se ha llamado al método AddNew. 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 "'" rs.Filter = Filtro 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: • adStateClosed. El Recordset está cerrado. • adStateOpen. El Recordset está abierto. Por último, debemos referirnos a las dos colecciones que forman parte del objeto Recordset. Estas colecciones son las siguientes: Colección Fields Descripción 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) Fields("nombre") 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) En resumen... 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.