Access

Acceda a Oddity al asignar conjuntos de registros incompatibles

Aquí hay algo realmente extraño que encontré mientras hacía un trabajo reciente. Una de esas cosas que te hacen hacer hmmmm, ¿en serio?

Configuré un formulario para, al abrirlo, crear un conjunto de registros dinámicamente haciendo algo similar a:

Private Sub Form_Open(Cancel As Integer)
    Dim rstVirtual            As Object

    Set rstVirtual = CreateObject("ADODB.Recordset")
    With rstVirtual
        .Fields.Append "ItemId", 20    ' adBigInt
        .Fields.Append "ItemDescription", 200, 50    ' adVarChar
        .Fields.Append "ItemIsSelected", 11    ' adBoolean

        .CursorType = 3    ' adOpenStatic
        .CursorLocation = 3    ' adUseClient
        .LockType = 3    ' adLockOptimistic
        .Open
    End With

    ' Add data
    rstVirtual.AddNew
    rstVirtual.Fields("ItemId").Value = 1
    rstVirtual.Fields("ItemDescription").Value = "Some description"
    rstVirtual.Fields("ItemIsSelected").Value = False
    rstVirtual.Update
    
    Set Me.Recordset = rstVirtual
End Sub

Luego, al cerrar el formulario, quería procesar los datos del formulario, así que creé un evento de cierre similar a:

Private Sub Form_Close()
    Dim rs                    As DAO.Recordset
    
    Set rs = Me.RecordsetClone
    '...
End Sub

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.

Ahora, esperaría un error, ¡pero no! En su lugar, apareció el siguiente cuadro de diálogo Fuente de datos:

¡No sé qué decir, pero esto es simplemente extraño! Inicialmente, cuando esto sucedía, pensé que mi base de datos o Access se habían dañado. Revisar el código me permitió determinar el problema de la incompatibilidad 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.

Publicaciones relacionadas

Deja una respuesta

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

Mira también
Cerrar
Botón volver arriba