none
Oracle 64 bit .NET RRS feed

  • Pregunta

  • Hola compañeros, tengo el siguiente problema, agradezco cualquier colaboración al respecto: 

    Hice una aplicación de prueba para probar el tema de 32 a 64 en .net y se me presenta lo siguiente usando el archivo de configuracion siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.data>
        <DbProviderFactories>
          <add name="Oracle Data Provider for .NET"
               invariant="oracle.dataaccess.client"
               description="Oracle Data Provider for .NET"
               type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.6.20, PublicKeyToken=89b483f429c47342"/>
        </DbProviderFactories>
      </system.data>
      <connectionStrings>
        <add name="conexion" connectionString="user id=loco;password=loco;data source=Base;" providerName="Oracle.DataAccess.Client" />
      </connectionStrings>
    </configuration>

    Pero en código no referencié ninguna dll de oracle. dataaccess y me funcionó usando DbConnection y además localmente en la máquina de 32 bits cuando ejecutado el instalador me funciona, en esa máquina esta instalado el cliente de oracle y la versión de la dll Oracle.DataAccess.dll es 2.111.6.20.

    Ahora cuando paso el instalador a la máquina de 64 bits no corre.  Sin embargo, supongo que el número de la versión cambia por eso lo cambio en el config y tampoco funcionó.  Entonces la pregunta del año es si ¿debo referenciar obligatoriamente una libreria Oracle.DataAccess.dll dentro de mi aplicación? haaa en el  tnsName tengo "Base" configurado.

    ¿Porque me funciona en la aplicación de 32 bits no teniendo referenciado la dll?

    El error que aparece en la máquina de 64 bits es algo parecido a que no se ha instanciado un objeto.

    jueves, 3 de enero de 2013 16:47

Todas las respuestas

  • La línea type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.6.20, PublicKeyToken=89b483f429c47342" le indica a ADO.Net que debe buscar un DLL llamado como está escrito en el subrayado (el segundo elemento de la lista separada por comas) y cargarlo.  Por eso es que no necesita referenciarse en el proyecto:  Se carga dinámicamente en tiempo de ejecución.

    La línea particular de tipo que usted muestra incluye una versión específica así que la PC que pretenda correr su aplicación necesita esta versión particular.  Si usted tiene otras versionas, podría intentar especificar un tipo más "ligeramente"; algo como type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" para no ligarse a ninguna versión particular.

    NOTA:  Aunque si bien es cierto que la cadena de texto abreviada de tipo que le indico que pruebe es técnicamente correcta y de hecho funcional en muchas partes de los archivos de configuración incluyendo secciones, OLE DB para .Net podría rechazarla.  No sé si será rechazada o no; nunca uso OLE DB.  Siempre uso ADO.net para SQL Server directamente.

    En cuanto a todo el asunto de 32 y 64 bits:  ¿Cómo está usted compilando su ejecutable:  Como Any CPU o está seleccionando 32-bit?  ¿Cómo aparece el ejecutable en la PC de 64 bits cuando está corriendo cuando se le busca en el Administrador de Tareas, pestaña de procesos?  Los ejecutables de 32 bits en PC's de 64 bits se muestran como <nombre de archivo>.exe * 32 en el Administrador de Tareas.

    También debe usted averiguar si la DLL de Oracle que tiene usted es para 32 o 64 bits o ambos.  Si no lo sabe, entonces le recomiendo preguntarle al proveedor, que supongo sería Oracle.


    Jose R. MCP
    Code Samples

    jueves, 3 de enero de 2013 18:17
  • lo priemro que puedo decirte es que todo esto

    <DbProviderFactories>
          <add name="Oracle Data Provider for .NET"
               invariant="oracle.dataaccess.client"
               description="Oracle Data Provider for .NET"
               type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.6.20, PublicKeyToken=89b483f429c47342"/>
        </DbProviderFactories>

    esta de mas puede quitarlo porque no cumple ninguna funcion, salvo si vas a usar las clases genericas de ado.net, para dar soporte a multiples base de datos, pero por lo que comentas no parece ser este el caso

    ---------

    lo segundo debes descargar he instalar el provider de Oracle para .net

    ODAC (Oracle Data Provider)

    esto te proporcionara las librerias que tienes que referenciar en tu codigo para poder programar con ado.net para oracle

    -----

    esto que comentas de 32 o 64 es muy pero muy importante, Oracle es bastante compleicado con esto

    si estas trabjando con una pc de 32 bit, y tomas la dll de 32 bits de oracle, eso en 64 puede que no funcione, no al menso si instalaste el ODAC de 64 en la pc de 64

    quizas si instalbas el ODAC de 32 en la pc de 64 quizas podria funcionar

    en ese caso deberias tomar la dll de Oracle.cliente de la pc de 64, llevarla a tu codigo, referenciarla cambiando la de 32 y volver a compilar para asi llevar el nuevo codigo a la pc de 64, o sea tiene que ser todo 64 para que funcione, si pones mitas y mitad no va

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 3 de enero de 2013 19:04
  • Hola como estas, es claro lo que dices pero... así sea genérico debería funcionar dado que la instrucción siguiente pero permite cargar en teoría

    <DbProviderFactories>
          <add name="Oracle Data Provider for .NET"
               invariant="oracle.dataaccess.client"
               description="Oracle Data Provider for .NET"
               type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.6.20, PublicKeyToken=89b483f429c47342"/>
        </DbProviderFactories>

    la versión que uno necesita o se encuentra instalada en la maquina destino "Eso es lo que tengo entendido en teoria puedo estar equivocado"

    Ahora, Oracle no tiene una versión que funcione para ambos sistemas operativos al tiempo, lo que hay es una versión beta administrada  para .net y que es para la versión 4 del framework, pero estoy usando la versión 3.5 o sea no puedo usarla.  De hecho la versión que uso es para 32 bits pero al pasar a 64 no funciona obviamente, por eso es que usé la forma genérica porque no hago referencia a ninguna dll, supuse que podría tomar la que encontrara instalada en la máquina destino.

    viernes, 4 de enero de 2013 22:41
  • la versión que uno necesita o se encuentra instalada en la maquina destino "Eso es lo que tengo entendido en teoria puedo estar equivocado"

    eso depende de como estas creando las instncias de los objetos de ado.net

    s usas las intefaces genericas puede que si, pero si creas la instancia concreta no

    De hecho la versión que uso es para 32 bits pero al pasar a 64 no funciona obviamente, por eso es que usé la forma genérica porque no hago referencia a ninguna dll, supuse que podría tomar la que encontrara instalada en la máquina destino.

    como comente vas a tener que ir jugando con una dl, u otra

    cuando estes en 32 bit pones esa dll compatible y compilas

    cuando estes listo para pasar la aplciacion a el enterno 64, cambias la dll compilas yb llevas esto a la pc de 64 bits

    y asi pones una dll u otra segun el ambiente donde vayas a ejecutar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 5 de enero de 2013 6:07
  • Bien logré que funcionara, lo que hice fue referenciar la dll 2.111.6.20 usé las instrucciones atadas al proveedor por ejemplo : OracleConnection,OracleCommand etc, luego compilé con modo x86, al instalarlo en la máquina de 64 bits, esta ya tenía un cliente de oracle 11.1.0.6.0 con el odac 11.1.0.6.21 y funcionó.  Haaa eliminé las instruccciones del archivo de configuración <DbProviderFactories>, porq para este caso no me sirvieron.

    Otra forma que me funcionó fué usando el ejecutable CorFlags Conversion Tool (CorFlags.exe) en la máquina de 64 bits, ya teniendo el aplicativo con el error, ejecute el comando x.exe /32BIT+ y después el programa funcionó.  Sin embargo esta opción no la tomé porque eso implica enviar este comando al usuario, manual de usuario etc

    Por la forma genérica(DbConnection,DbCommand etc) no me funcionó

    martes, 8 de enero de 2013 21:29