Access

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!

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba