c# vb6 ado com-interop adox

c# - No se puede establecer ADOX.Catalog.ActiveConnection en ADODB Conexión proveniente de.NET



vb6 com-interop (1)

Parece ser el camino equivocado, pero esto es tan sospechosamente similar a un problema que tuve - donde ADO dejó de funcionar en un objeto COM recompilado en una máquina Win7 y luego usado en una máquina XP - que creo que esto puede ser lo mismo . A saber, la desastrosa actualización de Windows que rompió MDAC ADO en objetos COM (hilo muy largo, espera una carga lenta). Si es así, la solución oficial se puede encontrar aquí .

Si no es así y no puede encontrar la solución, creo que lo mejor que puede hacer es utilizar la solución de cadena de conexión que mencionó en su edición. No es ideal, pero dices que vas a comenzar a reescribir los archivos DLL de todos modos, por lo que solo será un acuerdo temporal.

Me han encomendado la migración incremental de una aplicación VB6 heredada (que utiliza MS Access como base de datos, no preguntes) a .NET.

Este va a ser largo, pero creo que es mejor dar un poco de contexto.

Esta aplicación tiene un formulario principal de MDI con un menú, que se crea de forma dinámica en función de las DLL que se encuentran en las carpetas de la aplicación. Básicamente es un tipo de complemento: cada archivo DLL está representado por un elemento de menú, que al hacer clic, abrirá el formulario principal contenido en el archivo DLL, llamando a SetParent() según sea necesario.

La forma MDI es mi punto de partida. Quiero reescribir lo suficiente (rediseñar y probar unidades a medida que avance, por supuesto) para poder abrir dichos formularios. Una vez que tenga esa clave, comenzaré a reescribir una DLL a la vez.

Cada archivo DLL necesita una conexión ADO, que he podido transmitir desde C #.

El problema es que uno de esos complementos (al menos, pero posiblemente muchos otros) utiliza ADOX para hacer cosas en la base de datos, y aquí radica el problema: cuando intento establecer la propiedad ActiveConnection de ADOX.Catalog en la conexión ADO, todo Obtengo el error 3001 en tiempo de ejecución: los Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

No puedo por mi vida descubrir lo que estoy haciendo mal.

El código VB6 es lo más simple que puede obtener:

Dim c As New ADOX.Catalog Set c.ActiveConnection = theAdoConnectionComingFromDotNet '' error!

El código de C # que crea la conexión ADO es tan sencillo como el de VB:

var conn = new ADODB.Connection(); conn.Open("Provider=Microsoft.JET.Oledb;[...]");

y la llamada a Open() tiene éxito. Si intento establecer ActiveConnection en el lado C #, así:

var catalog = new ADOX.Catalog(); catalog.ActiveConnection = conn;

Todo funciona.

Ahora, podría solucionar el problema simplemente instanciando ADOX en el lado C # y pasándolo a VB6, pero ajustar el código VB6 (que por supuesto no tiene una sola prueba de unidad) podría ser un PITA, y no estoy incluso seguro que sería fácil hacerlo en primer lugar (porque la aplicación puede usar múltiples Access DBs a la vez, abriendo y cerrando conexiones a cada uno de ellos según sea necesario).

Entonces, ¿alguien tiene alguna idea de lo que estoy haciendo mal? Desde C # He intentado hacer referencia a ADODB tanto desde la pestaña .NET como desde la COM (y la versión de ADO que elegí de la pestaña COM es la correcta: 2.5 ... de nuevo, no pregunte), pero aún no alegría.

EDITAR

Lo mismo ocurre cuando intento asignar una propiedad ActiveConnection de RecordSet a la conexión que proviene de C #, así:

Dim rs As New ADODB.Recordset Set rs.ActiveConnection = theAdoConnectionComingFromDotNet

Otra solución que puedo pensar, ya que ActiveConnection es una Variante, sería establecerlo en la propiedad ConnectionString de la conexión. Eso funciona, pero crearía y abriría una nueva conexión cada vez, y francamente no me gustaría.