
El comportamiento inesperado de mezclar conjuntos de registros ADODB y DAO en formularios de acceso
Durante un proyecto reciente, encontré una peculiaridad intrigante en Microsoft Access que vale la pena compartir. Este comportamiento peculiar ocurre cuando se mezclan conjuntos de registros ADODB y DAO en eventos de formulario, lo que genera resultados inesperados que fácilmente podrían confundirse con daños en la base de datos.
La configuración
Inicialmente creé un formulario con un conjunto de registros ADODB creado dinámicamente en el evento Form_Open:
Private Sub Form_Open(Cancel As Integer) Dim rstVirtual As Object Set rstVirtual = CreateObject("ADODB.Recordset") With rstVirtual .Fields.Append "ItemId", 20 .Fields.Append "ItemDescription", 200, 50 .CursorType = 3 ' adOpenStatic .CursorLocation = 3 ' adUseClient .LockType = 3 ' adLockOptimistic .Open End With '... Set Me.Recordset = rstVirtual End Sub
El giro inesperado
En el evento Form_Close, tenía la intención de procesar los datos del formulario. Sin embargo, sin darme cuenta utilicé un conjunto de registros DAO en lugar de un conjunto de registros ADODB:
Private Sub Form_Close() Dim rs As DAO.Recordset Set rs = Me.RecordsetClone '... End Sub
El resultado sorprendente
Ahora, si no te diste cuenta, ¡cometí un gran error! Así es, inicialmente creé un conjunto de registros ADODB y lo asigné al formulario, pero en mi evento de cierre definí la variable como un conjunto de registros DAO y luego intenté asignar el conjunto de registros del formulario (ADODB) a la variable DAO.
En lugar del esperado error «No coinciden los tipos», Access mostró un cuadro de diálogo de Fuente de datos:
¡No sé qué decir, pero esto es simplemente extraño! Inicialmente, cuando esto sucedía, realmente pensé que mi base de datos o tal vez incluso el propio Access se habían corrompido. Revisar el código me permitió determinar el problema de la incompatibilidad de los tipos de variables.
Lo que hace las cosas aún más extrañas es el hecho de que solo .RecordsetClone desencadena este comportamiento y el uso de .Recordset en su lugar genera el error «No coinciden los tipos» que esperaba ver originalmente.
¿Esto entra en la categoría de error? En mi humilde opinión, sí, ya que esperaría recibir un mensaje de error como el que recibí al usar .Recordset, ¡ciertamente no un cuadro de diálogo de Fuente de datos!
Entonces, si, como yo, un día comienzas a aparecer un cuadro de diálogo de Fuente de datos de la nada al ejecutar tu código, ¡mira tus variables cuidadosamente!