
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.