Hola compañeros...
Tengo un DLL creada en VB6, la tiene algo así:
'el proyecto se llama Prueba
'código de la clase Consulta
'una variable tipo recordset
Dim rstDet As ADODB.Recordset
'Esta función realiza unas consultas a una base de datos.
'Las consultas se efectúan sin problemas, y además, traen
'datos.
Public Function Maestro() As ADODB.Recordset
Dim strSQL As String
'código que no viene al tema ahora
'bla-bla-bla
strSQL = "SELECT * FROM Maestro"
Set Maestro = Conexion.Execute(strSQL)
'otra consulta que retorna un recordset, el cual es
'asignado en la variable declarada al principio.
strSQL = "SELECT * FROM Detalle"
'variable utilizada por la función Detalle, la cual
'está declarada mas abajo
Set rstDet = Conexion.Execute(strSQL)
'Listo!!!, finaliza la función
'La función queda con un recordset con datos
'La variable rstDet queda igualmente, con un recordset
'con datos.
'En otras palabras no hay error alguno (COMPROBADO!!!)
End Function
Public Function Detalle() As ADODB.Recordset
'Esta función debe llamarse después de haberse llamado
'la función Maestro(), lo anterior debido a que lo que
'retorna esta función es un recordset que fue creado
'en Maestro como se pueden dar cuenta.
Set Detalle = rstDet
End Function
Aquí se termina el código de la clase VB6 y se genera la
DLL sin problema alguno!!!.
Luego en .NET, agrego una referencia COM al proyecto de la
DLL que se acaba de generar. Esto me genera la
Interop.NombreDll en el directorio BIN sin problemas.
Asimismo, agrego una referencia al ADODB.
Ahora viene lo bueno.
Declaro una variable de la DLL en .NET así:
'aquí no hay problema
Prueba.Consulta oConsulta = new Prueba.Consulta();
'obtengo el recordset maestro. Todo funciona bien!!!!.
ADODB._Recordset rstM = null;
rstM = (ADODB._Recordset) oConsulta.Maestro();
'hago ciertas cosas con el recordset sin problemas,
'estas cosas no vienen al tema.
'..
'..
'intento obtener el recordset detalle, por medio de la
'función Detalle, la cual devuelve la variable que fue
'ajustada en la función Maestro tras el llamado anterior.
ADODB._Recordset rstD = null;
rstD = (ADODB._Recordset) oConsulta.Detalle();
Bueno aquí si está el misterio.
La variable rstD me queda null, y no entiendo el motivo,
puesto que como dije anteriormente ambos recordset que se
crean al llamar a la función Maestro tienen datos (esto no
lo pongan en duda!!!).
Es como si se perdiera el contenido de la variable rstDet
entre el llamado de la función Maestro y Detalle.
El mismo código, tal cual como les comenté, es decir, la
misma DLL, funciona en mi equipo de DESARROLLO, en un
servidor de PRUEBAS, pero en el servidor de PRODUCCIÓN no
funciona. Aclaro lo anterior, son tres equipos donde tengo
la aplicación:
1) MI EQUIPO DE DESARROLLO:
Se llaman a ambas funciones y me devuelve los recordsets
sin problemas.
2) EQUIPO SERVIDOR DE PRUEBAS (PRE-PRODUCCION)
Se llaman a ambas funciones y me devuelve los recordsets
sin problemas.
3) EQUIPO DE PRODUCCIÓN
Solo la función Maestro me retorna el recordset, la
función Detalle me retorna null
Uhhh, ahora, bailénme ese trompo en la uña pequeña del
dedo meñique.
Una cosa que me percaté hace un momento, la DLL la
desarrollo con MDAC 2.7 y en el servidor de PRODUCCIÓN
está el MDAC 2.8 ¿podría esto influir?
¿Qué demonios está pasando?
Mil gracias por su paciencia leyendo este libro...
Leer las respuestas