Cuando trabajas con bases de datos utilizando la tecnología ADO (ActiveX Data Objects), hay un objeto central que se convierte en tu principal herramienta para interactuar con los datos: el objeto Recordset. Entender qué es y cómo funciona es fundamental para cualquier desarrollador que necesite acceder, manipular y navegar a través de la información almacenada en un origen de datos.

El objeto Recordset representa, en esencia, un conjunto completo de registros (lo que comúnmente conocemos como filas) provenientes de una tabla base específica o, alternativamente, el resultado completo obtenido tras ejecutar un comando o consulta SQL. Piensa en él como una representación temporal de los datos que necesitas procesar en tu aplicación. Una característica clave de este objeto es que, en cualquier momento dado, solo hace referencia a un único registro dentro de ese conjunto; a este registro se le denomina el 'registro actual'.
- Manipulando Datos con Recordset
- Identificador de Programa (ProgID)
- Los Cuatro Tipos de Cursor en ADO
- Seleccionando y Configurando el Cursor
- Abriendo un Objeto Recordset
- Navegación en el Recordset
- Actualizando Datos: Inmediata y por Lotes
- Colección Fields
- Permisos de Acceso
- ¿Qué significa ADODB?
- Tabla Comparativa de Tipos de Cursor
- Preguntas Frecuentes sobre ADODB Recordset
- ¿Qué es exactamente ADODB Recordset?
- ¿Por qué usar un objeto Recordset?
- ¿Cuántos tipos de cursor hay y cuáles son?
- ¿Cuál es el tipo de cursor por defecto?
- ¿Puedo abrir un Recordset sin un objeto Connection explícito?
- ¿Cómo actualizo los datos en la base de datos usando Recordset?
- ¿Qué significa BOF y EOF?
Manipulando Datos con Recordset
La función principal de los objetos Recordset es permitirte manipular datos procedentes de un proveedor de datos (como una base de datos SQL Server, Access, Oracle, etc.). De hecho, la inmensa mayoría de las operaciones de manipulación de datos en ADO se llevan a cabo a través de instancias de este objeto. Cada Recordset está compuesto por la colección de registros que representan las filas y la colección de campos que representan las columnas.
Es importante saber que la funcionalidad específica de un Recordset puede variar ligeramente dependiendo de las capacidades del proveedor de datos que estés utilizando. Algunas propiedades o métodos pueden no estar disponibles si el proveedor no los soporta nativamente.
Identificador de Programa (ProgID)
El identificador de programa estándar que debes usar para crear una instancia de este objeto en tu código es ADODB.Recordset. Aunque es posible que encuentres aplicaciones heredadas que aún utilicen el ProgID obsoleto ADOR.Recordset, estas seguirán funcionando sin necesidad de recompilación. Sin embargo, para cualquier desarrollo nuevo, la referencia correcta y recomendada es siempre ADODB.Recordset.
Los Cuatro Tipos de Cursor en ADO
Uno de los aspectos más importantes del objeto Recordset es el concepto de 'cursor'. El tipo de cursor que elijas define cómo se comporta el Recordset, especialmente en lo que respecta a la visibilidad de los cambios realizados por otros usuarios y las capacidades de navegación dentro del conjunto de registros. ADO define cuatro tipos principales de cursor:
1. Cursor Dinámico
Este es el tipo de cursor más flexible en cuanto a la visibilidad de los cambios. Un cursor dinámico te permite ver las adiciones, modificaciones y eliminaciones que otros usuarios realizan en los datos mientras tú tienes el Recordset abierto. Permite todos los tipos de movimiento dentro del conjunto de registros que no dependan estrictamente de 'marcadores' (bookmarks), y si el proveedor los soporta, también permite el uso de marcadores para una navegación precisa.
2. Cursor Estático de Claves (Keyset)
El cursor de claves se comporta de manera similar a un cursor dinámico en muchos aspectos. Sin embargo, tiene una diferencia crucial: no te permite ver los registros que otros usuarios agregan después de que abres el Recordset, ni te permite acceder a los registros que otros usuarios eliminan. Las modificaciones realizadas por otros usuarios en los registros existentes sí son visibles. Este tipo de cursor siempre soporta marcadores, lo que permite todos los tipos de movimiento (adelante, atrás, al principio, al final) dentro del conjunto original de registros.
3. Cursor Estático
Un cursor estático proporciona una copia fija e inmutable del conjunto de registros tal como estaba en el momento en que se abrió el Recordset. Es ideal para tareas como buscar datos o generar informes, donde necesitas una instantánea coherente de la información sin preocuparte por los cambios externos. Las adiciones, modificaciones o eliminaciones realizadas por otros usuarios después de abrir el Recordset no serán visibles en absoluto. Este tipo de cursor siempre soporta marcadores y, por lo tanto, permite todos los tipos de movimiento. Es el único tipo de cursor permitido cuando se abre un Recordset del cliente (con la propiedad CursorLocation establecida en adUseClient).
4. Cursor de Sólo Avance (Forward-Only)
Como su nombre indica, este es el tipo de cursor más simple y eficiente para escenarios donde solo necesitas recorrer el conjunto de registros una única vez, de principio a fin. Solo permite el desplazamiento hacia adelante en el Recordset (usando el método MoveNext). Al igual que el cursor estático, las adiciones, modificaciones o eliminaciones realizadas por otros usuarios no serán visibles. Este cursor ofrece el mejor rendimiento porque requiere menos sobrecarga para mantener el estado del cursor y no necesita soportar movimientos hacia atrás o marcadores.
Seleccionando y Configurando el Cursor
Para especificar el tipo de cursor que deseas usar, debes establecer la propiedad CursorType del objeto Recordset antes de abrirlo. Alternativamente, puedes pasar el tipo de cursor deseado como un argumento al método Open al crear el Recordset. Es fundamental consultar la documentación de tu proveedor de datos, ya que no todos los proveedores soportan todos los tipos de cursor. Si no especificas un tipo de cursor, ADO abrirá por defecto un cursor de solo avance, priorizando el rendimiento para el caso de uso más común.
Otro aspecto importante es la ubicación del cursor, controlada por la propiedad CursorLocation. Si estableces CursorLocation en adUseClient, el Recordset se abre en el lado del cliente. En este caso, como se mencionó anteriormente, solo se permite el tipo de cursor estático. Además, cuando se utiliza un Recordset de cliente, la propiedad UnderlyingValue de los objetos Field no estará disponible.
Abriendo un Objeto Recordset
Puedes crear tantos objetos Recordset como necesites en tu aplicación. Hay varias formas de abrir un Recordset y conectarlo a los datos.
Es posible abrir un Recordset independientemente de un objeto Connection definido previamente, simplemente pasando una cadena de conexión directamente al método Open del Recordset. ADO creará internamente un objeto Connection para realizar la operación, aunque no lo asignará a una variable que puedas usar explícitamente.
Sin embargo, si planeas abrir múltiples objetos Recordset utilizando la misma conexión a la base de datos, se recomienda encarecidamente crear y abrir explícitamente un objeto Connection primero, y asignar ese objeto a una variable. Luego, utiliza esa variable de Connection al abrir tus Recordsets. Si no lo haces y simplemente pasas la misma cadena de conexión a múltiples llamadas Recordset.Open, ADO creará una nueva conexión para cada Recordset, lo cual puede ser ineficiente en términos de recursos y rendimiento.
También puedes ejecutar una consulta directamente pasando la cadena SQL al método Open de un objeto Recordset, sin necesidad de un objeto Command separado. No obstante, si necesitas reutilizar el texto del comando varias veces o si tu consulta utiliza parámetros, es mejor y más eficiente crear y configurar un objeto Command explícitamente y luego ejecutarlo para obtener el Recordset.
Cuando un Recordset se abre exitosamente y contiene registros, el 'registro actual' se posiciona automáticamente en el primer registro del conjunto, y las propiedades BOF (Begin of File) y EOF (End Of File) se establecen en False. Si el Recordset se abre pero no contiene registros, tanto BOF como EOF se establecerán en True.

Una vez que tienes un Recordset abierto, necesitas poder moverte a través de sus registros para acceder a los datos individuales. ADO proporciona varios métodos y propiedades para la navegación:
- MoveFirst: Se mueve al primer registro del conjunto.
- MoveLast: Se mueve al último registro del conjunto.
- MoveNext: Se mueve al siguiente registro.
- MovePrevious: Se mueve al registro anterior.
- Move: Permite moverse un número específico de posiciones relativas desde el registro actual o a una posición absoluta.
Además de estos métodos, puedes usar propiedades como AbsolutePosition y AbsolutePage (si el proveedor las soporta) para posicionarte directamente. También puedes usar la propiedad Filter para trabajar temporalmente con un subconjunto de los registros.
Como mencionamos, los Recordset de tipo Solo Avance son la excepción; solo soportan el método MoveNext. Al recorrer un Recordset (a menudo en un bucle), las propiedades BOF y EOF son cruciales para determinar si te has movido más allá del principio o del final del conjunto de registros, respectivamente, y así controlar el bucle.
Actualizando Datos: Inmediata y por Lotes
Los objetos Recordset no solo permiten leer datos, sino también modificarlos. ADO soporta dos enfoques principales para actualizar los datos en el origen subyacente:
Actualización Inmediata
En este modo, cada modificación que realizas en los datos de un registro (por ejemplo, cambiando el valor de un campo) se escribe inmediatamente en el origen de datos subyacente en el momento en que llamas al método Update del Recordset. También puedes pasar arrays de valores como parámetros a los métodos AddNew (para agregar un nuevo registro) y Update (para modificar uno existente), lo que te permite actualizar varios campos de un registro simultáneamente con una sola llamada.
Actualización por Lotes (Batch)
Si el proveedor de datos lo soporta, puedes configurar el Recordset para que opere en modo de actualización por lotes. En este modo, los cambios que realizas (adiciones con AddNew, modificaciones con Update, eliminaciones con Delete) no se envían inmediatamente al origen de datos. En su lugar, se almacenan en una caché local del proveedor. Cuando hayas terminado de realizar un conjunto de cambios, llamas al método UpdateBatch. Esto envía todos los cambios pendientes en la caché al origen de datos en una única operación por lotes. Después de llamar a UpdateBatch, puedes usar la propiedad Status para verificar si hubo conflictos de datos (por ejemplo, si otro usuario modificó el mismo registro que tú intentaste modificar) y resolverlos si es necesario.
Colección Fields
La colección Fields es un miembro fundamental del objeto Recordset. Contiene todos los objetos Field que representan las columnas de datos en el conjunto de registros. Debido a que la colección Fields es el miembro predeterminado del objeto Recordset, puedes acceder a los objetos Field directamente usando la sintaxis del Recordset, sin necesidad de referenciar explícitamente la colección Fields. Por ejemplo, si tu Recordset tiene un campo llamado 'Nombre', puedes acceder a su valor para el registro actual usando `Recordset("Nombre").Value` o, de forma equivalente, `Recordset("Nombre")`. Del mismo modo, `Recordset.Fields(0).Value` es equivalente a `Recordset(0).Value`.
Permisos de Acceso
Los permisos bajo los cuales se accede a los datos a través del Recordset están controlados por la propiedad Mode del objeto.
¿Qué significa ADODB?
Como mencionamos al principio, ADODB es el identificador de programa. Su significado completo es ActiveX Data Objects DB. Es una capa API (Interfaz de Programación de Aplicaciones) que se construye sobre OLE DB, que a su vez es una interfaz de bajo nivel para acceder a datos de diversas fuentes. ADO simplifica el acceso a los datos proporcionado por OLE DB, ofreciendo un modelo de objetos más fácil de usar para los desarrolladores.
Tabla Comparativa de Tipos de Cursor
| Tipo de Cursor | Visibilidad Adiciones (Otros) | Visibilidad Eliminaciones (Otros) | Visibilidad Modificaciones (Otros) | Navegación | Soporte Marcadores | Ideal Para |
|---|---|---|---|---|---|---|
| Dinámico | Sí | Sí | Sí | Completa (adelante/atrás) | Sí (si proveedor soporta) | Aplicaciones multiusuario con alta concurrencia y necesidad de ver cambios en tiempo real. |
| Estático de Claves | No | No (registros eliminados) | Sí | Completa | Sí | Aplicaciones donde necesitas ver modificaciones pero no te preocupan las nuevas adiciones o registros eliminados por otros. |
| Estático | No | No | No | Completa | Sí | Informes, búsquedas, o cuando necesitas una instantánea de los datos sin cambios externos. Requerido para Recordsets de cliente. |
| Sólo Avance | No | No | No | Sólo adelante (MoveNext) | No | Recorrer un conjunto de resultados una sola vez para procesar o mostrar datos. Máximo rendimiento. |
Preguntas Frecuentes sobre ADODB Recordset
¿Qué es exactamente ADODB Recordset?
Es un objeto fundamental en ADO que representa un conjunto de registros (filas) y campos (columnas) obtenidos de una base de datos o resultado de una consulta. Permite acceder, navegar y manipular estos datos.
¿Por qué usar un objeto Recordset?
Es la forma principal en ADO de trabajar con conjuntos de datos. Te permite obtener datos, moverte entre ellos, leer valores de campos y realizar modificaciones, adiciones o eliminaciones.
¿Cuántos tipos de cursor hay y cuáles son?
Hay cuatro tipos principales: Dinámico, Estático de Claves, Estático y Sólo Avance. Cada uno tiene comportamientos diferentes respecto a la visibilidad de cambios concurrentes y capacidades de navegación.
¿Cuál es el tipo de cursor por defecto?
Si no especificas un tipo de cursor al abrir el Recordset, ADO utilizará por defecto el cursor de Sólo Avance.
¿Puedo abrir un Recordset sin un objeto Connection explícito?
Sí, puedes pasar una cadena de conexión directamente al método Open del Recordset. Sin embargo, para múltiples Recordsets en la misma fuente, es más eficiente usar un objeto Connection explícito y compartirlo.
¿Cómo actualizo los datos en la base de datos usando Recordset?
Puedes usar actualización inmediata (llamando a Update después de cada cambio) o actualización por lotes (realizando varios cambios y luego llamando a UpdateBatch para enviarlos todos juntos).
¿Qué significa BOF y EOF?
BOF (Begin of File) y EOF (End Of File) son propiedades booleanas que indican si el registro actual se ha movido antes del primer registro o después del último registro, respectivamente. Son útiles para controlar bucles de navegación.
En resumen, el objeto ADODB Recordset es la piedra angular de la manipulación de datos en ADO. Comprender sus diferentes tipos de cursor, cómo abrirlos, navegar por ellos y realizar actualizaciones te permitirá trabajar eficientemente con bases de datos en entornos que soporten esta tecnología.
Si quieres conocer otros artículos parecidos a ADODB Recordset: El Corazón de ADO puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL