El proveedor no es compatible con la versión del cliente Oracle

157

Estoy tratando de usar Oracle ODP.NET 11g (11.1.0.6.20) Instant Client en mi proyecto ASP.net como proveedor de datos, pero cuando ejecuto la página aspx aparece el mensaje " El proveedor no es compatible con la versión del mensaje de error del cliente Oracle ". Cualquier ayuda sería apreciada.

He hecho referencia al proveedor de datos en Visual Studio 2005 y el código detrás se ve así:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

El error para la página se ve así:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
EverTheLearner
fuente

Respuestas:

91

He estado investigando este problema aún más, y simplemente necesita tomar todas las DLL apropiadas de la misma versión descargada de ODP.Net y ponerlas en la misma carpeta que su archivo Exe, porque ODP.Net es quisquilloso sobre no mezclar Números de versión.

He explicado cómo hacer esto aquí: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Aquí está la esencia de esto:

  • Descargar ODP.Net
  • Descomprime el archivo
  • Descomprime todos los JAR que contiene
  • Tome estos dll que acaban de descomprimir:
    • oci.dll (renombrado de 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (renombrado de 'ociw32.dll.dbl')
  • Coloque todas las DLL en la misma carpeta que su ejecutable C #
Chris
fuente
44
Su solución funcionó para mí: encontré su publicación de blog antes de que encontrara esto. Tu eres el hombre. ¡Gracias! :-) Además, utilizando la última versión de ODAC, no necesité descomprimir ninguno de los archivos JAR ... los archivos .dll se encontraban en varios directorios en mi casa Oracle. Una simple búsqueda en Windows los hizo aparecer muy rápidamente.
Pandincus
10
Además, estaba usando la última versión de ODAC (11.2.0.1.2) en mi máquina de desarrollo, y los únicos archivos que necesitaba eran: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Como Chris señala, ASEGÚRESE DE QUE ESTÁN EN LA MISMA CARPETA COMO SU EJECUTABLE. ;-)
Pandincus
1
Parece que la versión más nueva hace que sea más fácil encontrar los dll. ¡Excelente! Ahora, ¿cuánto tiempo hasta que Oracle los convierta en un dll simple ...
Chris
La estrategia de Chris y el conjunto de la biblioteca de Pandincus funcionaron para mí. Llamo al cliente Oracle a través de PowerShell, por lo que coloco el conjunto de bibliotecas en el directorio ejecutable de PowerShell.
Quillbreaker
1
Probablemente debería usar el controlador administrado C # en estos días si puede :)
Chris
47

Debe "ignorar" toda la charla x86 / x64 aquí para empezar y, en su lugar, probar el controlador administrado ODP.NET (si está utilizando .Net v4 +):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Controlador Oracle ODP.net administrado vs no administrado

¡Evite todos los "no administrados" qué DLL emite la arquitectura! : D (sobre el tiempo Oracle).

El paquete NuGet (también funciona para 11g):

ingrese la descripción de la imagen aquí

El método antiguo / manual:

Para obtener información sobre cómo convertir a usar las bibliotecas administradas :

  • Primero, aquí hay una gran comparación de código de administrado vs no administrado : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Asegúrese de haber descargado solo la versión XDP de Managed Driver Xcopy de ODP.NET
  • Desde el archivo zip descargado, copie y pegue en el directorio de su proyecto:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Agregue una referencia a Oracle.ManagedDataAccess.dll
  • Asegúrese de que su exe se publique (agregado a la carpeta de aplicaciones en VS2010) con ambos dlls
Tod Thomson
fuente
3
Es una buena noticia que Oracle finalmente tenga un controlador totalmente administrado. Cargar alrededor de esos 100mb dll ha sido una carga real.
Jafin
1
el controlador administrado funciona muy bien para mí: no he tenido ningún problema desde que me mudé a él / puedes configurar tus proyectos nuevamente en AnyCPU, etc. y funciona muy bien :)
Tod Thomson
55
Solo para que todos lo sepan, aunque el proveedor administrado es agradable, carece de muchas características que el proveedor completo permite. A saber, el cifrado incorporado de Oracle.
Justin Skiles
1
La documentación de Oracle tiende a estar "dispersa" por decir lo menos. Aquí hay un buen enlace sobre algunos métodos no compatibles . Además, el controlador en sí viene con un readmeresumen de algunas limitaciones.
Justin Skiles
2
¡El uso del controlador administrado es la solución final! Tengo una pesadilla cada vez que pienso todo el tiempo que pasé cuando tuve una falta de coincidencia de tipos
ettore ct
35

Solo instalé Oracle Data Provider para .NET 2.0 (11.1.0.6.20) y no instalé Oracle Instant Client (11.1.0.6.0) .

¡Lo acabo de instalar y el error desapareció!

EverTheLearner
fuente
3
¿Puede simplemente copiar las 4 DLL del cliente instantáneo en la misma carpeta que su EXE, en lugar de instalar el cliente? (estos archivos: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris
2
@ Chris: Sí, puedes. Sin embargo, en mi experiencia, necesita oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll y oracle.dataaccess.dll
Pakman
Al revés para mí: había instalado el cliente, pero no el proveedor
Ev.
33

Esto puede ser causado al ejecutar un tiempo de ejecución .NET de 64 bits contra un cliente Oracle de 32 bits. Esto puede suceder si su servidor está ejecutando la aplicación en 64 bits. Ejecutará la aplicación .NET con el tiempo de ejecución de 64 bits. Puede configurar el indicador de CPU en su proyecto en VS para que se ejecute en el tiempo de ejecución de 32 bits.

Daniel
fuente
Acabo de encontrarme con este. Trabajó en una aplicación de prueba (32 bits), luego se cayó en IIS. En lugar de requerir que todos los ensambles involucrados sean de 32 bits, cambié a un AppPool de 32 bits.
anton.burger
22

Hagamos algún tipo de resumen:

El mensaje de error "El proveedor no es compatible con la versión del cliente Oracle" puede deberse a varias razones.

  • No tiene instalado el Cliente Oracle. En este caso, el mensaje de error es realmente engañoso.

    Oracle Data Provider para .NET (ODP.NET, es decir, archivo Oracle.DataAccess.dll) no está incluido en Oracle cliente inmediato, tiene que ser instalado por separado (descarga de 32 bits de Oracle Data Access Components (ODAC) o de 64 bits de Oracle Data Access Components ( ODAC) Descargas ) o debe seleccionar según la opción en Oracle Universal Installer (OUI).

    Tenga en cuenta que al instalar Oracle Data Provider> = 12.1, el proveedor no se registra automáticamente en GAC. Debe registrarlo manualmente si es necesario, consulte Oracle Doc 2272241.1 .

  • La versión de ODP.NET no coincide con la versión instalada de Oracle Client. ¡Debe verificar incluso el número de versión menor! Por ejemplo, la Oracle.DataAccess.dllversión 4.112.3.0 no es compatible con Oracle Client 11.2.0.4 . Verifique cuidadosamente las versiones de ODP.NET y Oracle Client. Puede usar sigcheck en oraociei*.dlly / o OraOps*w.dllpara obtener la versión de Oracle Client.

    Tenga en cuenta los diferentes esquemas de numeración. Versión del archivo 4.112.3.0 medios: .NET Framework versión 4, Oracle Release 11.2.0.3.x .

    Hay ODP.NET versión "1.x", "2.x" y "4.x". Estos números están relacionados con las versiones de Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 y 4.0.30319. La versión "1.x" estuvo disponible hasta Oracle Client 11.1. La versión "4.x" se introdujo con Oracle Client 11.2

  • La arquitectura (32 bits o 64 bits) de ODP.NET no coincide con la arquitectura de su aplicación. Una aplicación de 32 bits solo funciona con Oracle Client / ODP.NET de 32 bits, respectivamente, una aplicación de 64 bits requiere Oracle Client / ODP.NET de 64 bits. (A menos que use el controlador administrado ODP.NET )

  • La versión de .NET Framework no coincide. Por ejemplo, si compila su aplicación con Target .NET Framework 2.0, entonces no puede usar ODP.NET versión 4.x. La versión de destino de .NET Framework debe ser igual o superior a la versión de ODP.NET.

  • La versión de Oracle.DataAccess.dllen su máquina de desarrollo (es decir, la versión que se carga durante la compilación) es más alta que la versión en la máquina de destino.

  • Tenga en cuenta que Oracle.DataAccess.dllpodría cargarse desde GAC, que por defecto tiene prioridad sobre cualquier archivo proporcionado localmente.

Soluciones

  • Considere usar el controlador administrado ODP.NET, se puede descargar desde la página de Oracle: Descargas de componentes de acceso a datos de Oracle (ODAC) de 64 bits . Allí solo tiene que copiar el Oracle.ManagedDataAccess.dllarchivo a su directorio de aplicaciones, no se requiere nada más. Funciona tanto para 32 bits como para 64 bits.

  • En su *.csproj, resp. *.vbprojedite su referencia a ODP.NET así:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

    Atributos como Version=...o processorArchitecture=...no son obligatorios. Su aplicación cargará la correcta Oracle.DataAccess.dllsegún la arquitectura seleccionada y el marco .NET de destino (siempre que esté instalado correctamente) -> no 100% verificado

  • En caso de que no conozca la versión de Oracle Client en la máquina de destino (por ejemplo, podría ser la máquina de su cliente): vaya a la página de descarga mencionada anteriormente y descargue la versión mínima de XCopy de Oracle Data Access Components. Extraiga el zip y copie solo el Oracle.DataAccess.dllarchivo en su máquina local. En su proyecto VS haga una referencia a esta DLL (muy probablemente desactualizada). La versión de esta DLL es la versión mínima de ODP.NET con la que funcionará su aplicación. Cuando ejecuta su aplicación, la Política del editor en GAC redirigirá a la versión realmente instalada.

  • No creo que sea un enfoque inteligente tomar archivos DLL individuales y copiarlos en ciertas carpetas. Puede funcionar en una máquina "desnuda", pero si su máquina de destino ha instalado algún producto Oracle, existe un alto riesgo de desajuste de versión. Desinstale cualquier producto Oracle de su máquina y realice una nueva instalación. Eche un vistazo a ¿Cómo desinstalar / eliminar completamente Oracle 11g (cliente)? Para obtener una máquina realmente limpia.

  • En caso de que tenga que trabajar con aplicaciones de 32 bits y 64 bits al mismo tiempo, siga estas instrucciones para instalar ambas versiones en una máquina:

Suposiciones: se llama Oracle Home OraClient11g_home1, la versión del cliente es 11gR2.

  • Opcionalmente, elimine cualquier cliente Oracle instalado

  • Descargue e instale Oracle x86 Client, por ejemplo en C:\Oracle\11.2\Client_x86

  • Descargue e instale Oracle x64 Client en una carpeta diferente, por ejemplo para C:\Oracle\11.2\Client_x64

  • Abra la herramienta de línea de comandos, vaya a la carpeta% WINDIR% \ System32, normalmente C:\Windows\System32y cree un enlace simbólico ora112a la carpeta C:\Oracle\11.2\Client_x64(ver más abajo)

  • Cambie a la carpeta% WINDIR% \ SysWOW64, por lo general, C:\Windows\SysWOW64y cree un enlace simbólico ora112a la carpeta C:\Oracle\11.2\Client_x86(ver más abajo)

  • Modifique la PATHvariable de entorno, reemplace todas las entradas como C:\Oracle\11.2\Client_x86y C:\Oracle\11.2\Client_x64por C:\Windows\System32\ora112, respectivamente, su \binsubcarpeta. Nota: C:\Windows\SysWOW64\ora112no debe estar en el entorno PATH.

  • Si es necesario, configure su ORACLE_HOMEvariable de entorno enC:\Windows\System32\ora112

  • Abre tu Editor del Registro. Establezca el valor del Registro HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEenC:\Windows\System32\ora112

  • Establecer el valor del Registro HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEen C:\Windows\System32\ora112(no C:\Windows\SysWOW64\ora112)

  • ¡Estás listo! Ahora puede usar el cliente Oracle x86 y x64 sin problemas juntos, es decir, una aplicación x86 cargará las bibliotecas x86, una aplicación x64 cargará las bibliotecas x64 sin ninguna modificación adicional en su sistema.

Comandos para crear enlaces simbólicos:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

Algunas notas:

  • Ambos enlaces simbólicos deben tener el mismo nombre, por ejemplo ora112.

  • En caso de que luego desee instalar ODP.NET manualmente, asegúrese de seleccionar las carpetas apropiadas para la instalación.

  • A pesar de su carpeta de nombres C:\Windows\System32contiene las bibliotecas x64, mientras que C:\Windows\SysWOW64contiene las bibliotecas x86 (32 bits). No te confundas

  • Tal vez sea una buena opción configurar su TNS_ADMINvariable de entorno ( TNS_ADMINentradas de registro en el Registro) en una ubicación común, por ejemplo TNS_ADMIN=C:\Oracle\Common\network.

Wernfried Domscheit
fuente
Esta OMI tiene más conocimiento para llevar que la respuesta real. Entonces, si tengo una aplicación x86 para .net 4 y la versión de la base de datos es 9i, ¿qué versión de cliente necesitaría tener un usuario si tiene Windows de 32 o 64 bits? Oracle dice que cualquier versión de cliente es compatible con cualquier versión de db. ¿Es la respuesta que los usuarios de 32 bits instalen la versión de 32 bits y los usuarios de 64 bits instalen la versión de 64 bits y usen el controlador administrado ODP.NET para decidir con qué sistema operativo está hablando?
Luminoso
1
Cuando utiliza el Controlador administrado ODP.NET, no es necesario instalar ningún cliente Oracle, esa es la principal ventaja. Funciona con aplicaciones x86 y x64. Sin el "Controlador administrado ODP.NET", una aplicación x86 requiere también un Cliente Oracle x86 (es decir, 32 bits), sin importar la arquitectura del servidor de la base de datos.
Wernfried Domscheit
Acabo de encontrarme con "Microsoft Visual C ++ 2010 Redistributable necesita estar instalado". Debería agregarlo a su resumen.
Jay Sullivan
1
No creo que este error esté relacionado o sea causado por Oracle u ODP.NET
Wernfried Domscheit
Funciona para mí, lo instalo Oracle.DataAccess.dlldesde el paquete nuget Oracle.DataAccess.x86, y su versión Dll es 2.112.1.0, por lo que coincido con la instalación del Cliente Oracle con la versión Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) AQUÍ, ¡ luego se solucionó el problema!
yu yang Jian
6

Después de varias horas de resolución de problemas, descubrí que este problema se debía a que tenía Oracle.DataAccess.dll (v4.0) en mi directorio bin de proyectos, pero el tiempo de ejecución también cargaba Oracle.DataAccess.dll (v2.x) desde el GAC. Eliminar y leer la entrada Oracle.DataAccess en las referencias del proyecto resolvió el problema para mí.

Los otros archivos mencionados aquí no parecían necesarios en mi situación.

ACTUALIZAR

La causa raíz del error "El proveedor no es compatible con la versión del cliente Oracle" es (generalmente) que el ensamblado administrado está intentando cargar bibliotecas no administradas que no coinciden con las versiones. Parece que puede forzar al controlador de Oracle a usar las bibliotecas correctas especificando la ruta de la biblioteca en web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
psaxton
fuente
¡Gracias! Su solución me da la idea de que funciona después de 2 días (tengo Visual Studio 2010 Net 4, cliente Oracle 10g) ... veo GAC y, por supuesto, he instalado 3 versiones de Oracle.DataAccess.dll, desinstalé todo (y elimine las claves inválidas machine.config en "DbProviderFactories") y reinstale solo el ODAC1120320 x64. Y funciona.
Hernaldo González
5

instale ODP.Net en la máquina de destino y debería resolver el problema ... copiar la dll no parece una buena idea ...

HainKurt
fuente
5

Para Oracle 11g (11.1.0.7.20) tuve que agregar los siguientes dlls junto con mi Exe para trabajar.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (bastante grande cerca de 30mb)
  4. Oracle.DataAccess.dll
SKG
fuente
Quiere decir 130 MB
Elmue
2

Me parece que a pesar de que tiene ODP con el Cliente Oracle Istant, el ODP puede estar tratando de usar el Cliente Oracle real. ¿También tiene un cliente Oracle estándar instalado en la máquina? Recuerdo que Oracle era bastante exigente cuando se trataba de múltiples clientes en la misma máquina.

Peter Meyer
fuente
2

Tuve exactamente el mismo problema. Eliminé (y olvidé que había eliminado) oraociei11.dll después de compilar la aplicación. Y estaba dando este error al intentar ejecutar. Entonces, cuando no puede encontrar el dll que oraociei11.dll, muestra este error. Puede haber otros casos cuando da este error, pero este parece ser uno de ellos.


fuente
2

También busque el grupo de aplicaciones IIS Habilite la marca de verdadero o falso de 32 bits, cuando vea este mensaje, ¡algún foro de Oracle me lo pidió!

Hydtechie
fuente
2

Tengo el mismo problema, pero en mi caso no puedo simplemente copiar los archivos DLL en la carpeta bin, luego solo 'vuelvo a unir' la versión de ensamblaje.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>    
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
        <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
Calderonsteven
fuente
2

Esto es lo que hice para resolver este problema que persistió durante 3 largas horas:

  1. En la casa de Oracle ubicada en C:\oracle\product\11.2.0, tenía una carpeta llamada client_1donde había instalado previamente ODP.NETbits para Windows de 64 bits.

  2. Más tarde, al intentar depurar mi aplicación API web ASP.NET con Visual Studio 2012, recibí este mensaje de error: el proveedor no es compatible con la versión del cliente Oracle .

  3. Al buscar en Google, descubrí que esto estaba sucediendo porque estaba usando ODP.NET64 bits. Luego tomé ODP.NETWindows 32 bits y lo instalé, pero seguía recibiendo el mismo mensaje de error.

  4. SOLUCIÓN: eliminó la carpeta client_1y reinstaló ODP.NET32 bits. De alguna manera, el instalador estaba mezclando bits de la versión de 64 bits con la versión de 32 bits. Imagínate...

  5. Ahora estoy feliz otra vez y puedo abrir una nueva OracleConnection. ¡FINALMENTE! :)

Leniel Maccaferri
fuente
2

Para cualquiera que todavía tenga este problema: según este artículo

http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html

Descubrí que a mi servidor le faltaba la Biblioteca Visual Runtime de Microsoft C ++: la tenía en mi máquina de desarrollo debido a la instalación de Visual Studio. Descargué e instalé la versión (actualmente) más reciente de la biblioteca desde aquí:

http://www.microsoft.com/en-us/download/details.aspx?id=13523

Ejecuté la configuración y la llamada oráculo de C # lo hizo.

dabor
fuente
1
Amigo ... Oráculo ... ¿podemos hablar un poco? Ven aquí, en la esquina. Escucha hombre, pasé todo el día averiguando qué demonios se suponía que significaba "proveedor no compatible", solo para descubrir después que es porque no se cumplió alguna dependencia de la instalación. Por favor, no, exijo que haga que su instalador verifique estas dependencias en el momento de la instalación y advierta al usuario si no se cumple. Gracias.
Jay Sullivan
3
Por cierto, he tenido que volver a esta pregunta de stackoverflow en múltiples ocasiones, y cada vez me aplica una respuesta diferente. Qué pérdida de tiempo y dinero ha causado esto.
Jay Sullivan
2

Versión TLDR:

  • Use el proveedor 12c 100% administrado en su lugar.
  • Si debe usar el proveedor anterior, debe apuntar Oracle.DataAccess.dll a los Dlls de Cliente Oracle no administrados que son de la versión correcta. Si tiene múltiples clientes Oracle instalados en su máquina, tal vez sea tan simple como incluir la variable de configuración "DllPath" (ver más abajo) en la configuración de su aplicación, pero también puede necesitar instalar un nuevo cliente Oracle para señalar.

Versión completa:

Primero, asegurémonos de que comprendamos los componentes del antiguo proveedor no modificado (no el nuevo proveedor 12c 100% administrado). Se compone de dos piezas:

  1. el componente .net administrado - Oracle.DataAccess.dll
  2. el cliente no administrado (no.net)

Simplemente hablando, Oracle.DataAccess.dll es casi solo un contenedor, traduciendo instrucciones .net en instrucciones ORACLE-NET para el cliente no administrado.

Dicho esto, cuando carga Oracle.DataAccess hay un orden en el que intenta localizar los dlls de clientes no administrados que necesita. De la documentación de Oracle :

Oracle.DataAccess.dll busca archivos DLL no administrados dependientes (como Oracle Client) según el siguiente orden:

1.Directorio de la aplicación o ejecutable.

Configuración 2.DllPath especificada por la configuración de la aplicación o web.config.

Configuración 3.DllPath especificada por machine.config.

Configuración 4.DllPath especificada por el Registro de Windows.

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ version \ DllPath

5.Directorios especificados por la variable de entorno PATH de Windows.

Entonces, en su caso, su aplicación siguió este proceso anterior y encontró una ruta que tiene dlls no gestionados que son demasiado antiguos en relación con el ensamblado Oracle.DataAccess.dll que está utilizando.

Podría ser que la única instalación de Oracle Client en esa máquina sea demasiado antigua. Pero esto entra en juego si tiene más de un cliente instalado en la máquina y los archivos no administrados se encontraron primero en una instalación diferente pero más antigua. Si es más tarde, lo más simple es usar la variable de configuración dllPath en su configuración y apuntarla a la carpeta correcta de Oracle Home Bin:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

Si desea instalar una copia nueva del cliente, la versión de xcopy es la más pequeña y contiene el "cliente instantáneo" y señala el DllPath anterior a esta nueva ubicación. Pero cualquier instalación del cliente Oracle funcionará.

Pero si desea evitar todas estas cosas de resolución de clientes no administrados, vea si puede actualizar su aplicación para usar el proveedor 100% administrado; en realidad, solo se trata de uno o dos ensamblados administrados, sin ninguna dependencia de los archivos no administrados.

También es posible que no esté cargando el Oracle.DataAccess.dll que cree que está si está instalado tanto en su directorio bin como en su GAC, pero creo que ese es el senario menos probable. Consulte el proceso de resolución de ensamblaje para obtener más información.

b_levitt
fuente
1

¿El usuario IIS / IWAM tiene permisos en el directorio de Oracle? ¿Se puede conectar a esta fuente de datos utilizando otra aplicación, como Excel o Access?

DCookie
fuente
1

Tuvimos el mismo problema, porque el ensamblado Oracle.Data.dll en un recurso compartido de red fue actualizado por nuestros DBA. Eliminar la referencia del proyecto y agregarla nuevamente resolvió el problema.

Doekman
fuente
1

Solo dos pasos para resolver este problema.

  1. vaya a la configuración avanzada del grupo de aplicaciones y establezca el indicador 'Habilitar aplicación de 32 bits' en Verdadero.
  2. Asegúrese de que todos los Dlls en su Bin es la versión de 32 bits ahora ...

la mejor de las suertes.

Mazhar Abbas
fuente
@ mazhar-abbas, ¿Puedes por favor? ¿En qué puedo configurar 'Habilitar aplicación de 32 bits? ¿Está en IIS o Project?
hiFI
1

No fui por el camino de conseguir nuevas DLL. Teníamos un montón de proyectos existentes que funcionan perfectamente bien y fue solo mi nuevo proyecto el que me dio dolor de cabeza, así que decidí probar otra cosa.

Mi proyecto estaba usando un Internal.dll desarrollado internamente que dependía de Oracle.DataAccess.dll v4.112.3.0. Por alguna razón, cuando se publica, Visual Studio siempre se carga v4.121.0.0, aunque no se especificó explícitamente en ninguno de los archivos de configuración. Es por eso que recibí un error.

Entonces lo que hice fue:

  1. Copié Internal.dll de uno de los proyectos ejecutados con éxito en mi sitio web /bin(solo para estar seguro).
  2. Copié Oracle.DataAccess.dll de uno de los proyectos que se ejecutaron con éxito en mi sitio web /bin.
  3. Agregar referencia a ambos desde mi sitio web.
  4. Finalmente, apareció la referencia Oracle.DataAccess myWebSite.csproj, pero mostró la versión incorrecta: en v4.121.0.0lugar de v4.112.3.0.
  5. Cambié manualmente la referencia myWebSite.csproj, por lo que ahora se lee:

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 
Robotron
fuente
2
Es una muy mala idea agregar una referencia a dlls en una carpeta bin.
Jay Sullivan
1
Las carpetas biny objson carpetas de salida ; aquí es donde van los dlls cuando construyes tu proyecto. Debería poder eliminar estas carpetas en cualquier momento sin crear conflictos. Por lo general, estas carpetas se ignoran en el control de origen. La práctica estándar es crear una External Referencescarpeta donde coloque sus dlls referenciados.
Jay Sullivan
@notfed Parece que tienes razón. Mantendré esto en mi mente.
Robotron
Como se mencionó, es solo una ruta de pista para el compilador, no una referencia forzada. Primero se busca el GAC para Oracle.DataAccess.dll. Debería funcionar incluso si eliminas por HintPathcompleto.
Wernfried Domscheit
1

Encontré este problema después de instalar Oracle Data Tools para Visual Studio 2015 y luego pelear con Oracle durante una buena hora. Decidí intentar reinstalar el cliente Oracle nuevamente en lugar de este lío con la copia de archivos, cambios de configuración, etc., y eso funcionó para mí.

David Spenard
fuente
1

Me enfrenté a un problema similar y la causa raíz fue que GAC tenía 2 versiones de oracle.dataaccess, es decir, v4.0_4.112.2.0 y v4.0_4.112.4.0. Mi aplicación se refería a v4.0_4.112.2.0, por lo que cuando eliminé v4.0_4.112.4.0 de GAC, funcionó bien.

Ruta de acceso de GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

Antes de : ingrese la descripción de la imagen aquí

Después : ingrese la descripción de la imagen aquí

Para eliminar una versión, uno simplemente puede eliminar la carpeta correspondiente de GAC.

p4ulinux
fuente
0

Recientemente tuve que trabajar en un proyecto anterior donde la solución y todos los proyectos contenidos estaban dirigidos a la plataforma x32. Seguí intentando copiar Oracle.DataAccess.dll y todos los demás archivos de Oracle sugeridos en todos los lugares, pero siempre me golpeé contra la pared. Finalmente, la bombilla de la cabeza se encendió (después de 8 horas :)) y solicitó verificar los ensambles ODAC instalados y su plataforma. Ya tenía todos los clientes ODAC de 64 bits (x64) instalados pero no los de 32 bits (x32). Instalé el ODAC de 32 bits y el problema desapareció.

Cómo verificar la versión de ODAC instalado: Busque en la carpeta C: \ Windows \ assembly. La propiedad "Arquitectura del procesador" informará a la plataforma de ODAC instalado.

Ocho horas es mucho tiempo para que se encienda la bombilla. No es de extrañar que siempre tenga que esforzarme en el trabajo :).

DiligenteKarma
fuente
Tenga en cuenta que C:\Windows\assembliessolo muestra ensamblados hasta .NET Framework versión 2.0. La versión 3.x / 4.x no se muestra, consulte stackoverflow.com/questions/28213105/…
Wernfried Domscheit
0

La solución de Chris también funcionó para mí. Sin embargo, recibí un mensaje de error de seguimiento que dice:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Aparentemente, en el idioma extranjero de Oraclish, eso significa que su programa está dirigido a todas las plataformas o máquinas de 32 bits. Simplemente cambie su plataforma de destino en Project Properties a 64 bits y espere lo mejor.

Cameron Castillo
fuente
3
Eso es en realidad .NETish, no Oraclish
Jay Sullivan
0

Tuve el mismo problema con Oracle.DataAccess.dll v4.121.2.0. con instalación en 2 hogares (versiones de 32 y 64 bits). Versión de 32 bits de trabajador, la versión de 64 bits no.

En mi caso (después de 2 días de intentarlo) descubrí que el problema eran los permisos en la versión de inicio de 64 bits. Muchos directorios en esa versión tenían permisos anulados exclusivamente donde el rol de "Usuarios autenticados" no tenía acceso de "Lectura", que está configurado de manera predeterminada en el directorio principal. Esos subdirectorios incluyeron "bin", "network / admin", "nls", "oracore", "RDBMS" y posiblemente otros. Los encontré filtrando el resultado "ACCESO DENEGADO" en la utilidad "Process Monitor" (Procmon.exe) de sysinternals. Una vez que los permisos se heredaron del directorio principal a esos subdirectorios secundarios, todo comenzó a funcionar.

No supe qué anular los permisos en toda la página de inicio de Oracle, así que hice un directorio a la vez, pero supongo que si no te preocupas tanto por la seguridad, puedes restablecerlo en todo el directorio de inicio de Oracle correspondiente.

Greg Z.
fuente
-3

Muchas respuestas teóricas aquí, pero aquí viene un ejemplo de trabajo con código que puede copiar, pegar y probar de inmediato:

  1. Instalé la base de datos Oracle Express OracleXE112 que ya viene con algunas tablas de demostración preinstaladas.
  2. Cuando inicia el instalador, se le solicita una contraseña . Ingresé "xxx" como contraseña. (no utilizado en producción)
  3. Mi servidor se ejecuta en la máquina 192.168.1.158
  4. En el servidor, debe permitir explícitamente el acceso al proceso TNSLSNR.exe en el Firewall de Windows . Este proceso escucha en el puerto 1521. Si obtiene un error de tiempo de espera del siguiente código, revise su firewall.
  5. OPCIÓN A: Para C # (.NET2 o .NET4) puede descargar ODAC11 , desde el cual debe agregar Oracle.DataAccess.dll a su proyecto. Además, esta DLL depende de: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Estos archivos DLL deben estar en el mismo directorio que el archivo EXE o debe especificar la ruta de DLL en: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. En máquinas de 64 bits, escriba adicionalmente enHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPCIÓN B: Si ha descargado ODAC12 , necesita Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (¡160 MB!), Oraons.dll, msvcr100.dll. La ruta del registro esHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPCIÓN C: si no desea archivos DLL enormes de más de 100 MB, debe descargar ODP.NET_Managed12.xxxxxxxx.zip en el que encuentra Oracle.ManagedDataAccess.dllque solo tiene 4 MB y es un archivo DLL administrado puro que funciona en procesos de 32 bits y 64 bits también y no depende de ninguna otra DLL y no requiere ninguna entrada de registro.
  8. El siguiente código C # funciona para mí sin ninguna configuración en el lado del servidor (solo la instalación predeterminada):
usando Oracle.DataAccess.Client;
o
utilizando Oracle.ManagedDataAccess.Client;

....

string oradb = "Fuente de datos = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVIDOR = DEDICADO)));"
    + "Id. De usuario = SISTEMA; Contraseña = xxx;";

utilizando (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    utilizando (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "seleccione TABLESPACE_NAME de DBA_DATA_FILES";

        utilizando (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}
Elmue
fuente
Es bastante exagerado instalar todo el servidor de bases de datos Oracle cuando solo necesita un cliente en ejecución.
Wernfried Domscheit
Tu respuesta es pobre de todos modos. No es necesario copiar ningún archivo dll de Oracle en el directorio de la aplicación porque, de manera predeterminada, la instalación se encuentra a través de ‰ PATH% (a menos que lo modifique por su cuenta). Cliente Oracle de 32 bits. Sin embargo, el tema principal de esta pregunta es la falta de coincidencia de 32 bits frente a 64 bits.
Wernfried Domscheit
Su comentario muestra que no leyó mi respuesta. Si quiero escribir una aplicación que se comunique con un servidor Oracle, no es necesario instalar nada desde Oracle. Solo uso la DLL mencionada anteriormente y la distribuyo con mi aplicación. Por lo tanto, no habrá nada en la variable PATH en la máquina del usuario final. Por cierto, el uso de la variable PATH (que proviene de la antigua era de DOS desde 1980) es muy obsoleto en el software moderno. Mi respuesta recomienda la OPCIÓN C, que no necesita ninguna ruta de registro y no depende de 32 o 64 bits. Mencioné las OPCIONES A y B solo para completar.
Elmue
Creo que sin la configuración adecuada de% PATH% su Windows no funcionará en absoluto, incluso en la versión 10. Mencioné en mi respuesta que no es inteligente copiar manualmente cualquier dll de Oracle con su aplicación. No conozco el código fuente de estos archivos dll, pero puede haber más dependencias del lado del cliente que no ve, por ejemplo, activadas por la configuración del idioma, los juegos de caracteres, la zona horaria, etc. Cuando hago un seguimiento con Oracle.DataAccess.dllel ¡El programa carga en total 35 DLL de Oracle! Realice una instalación normal de Oracle Client, a menos que utilice el controlador administrado ODP.NET, por supuesto.
Wernfried Domscheit
1
Creo que mencioné mis preocupaciones: (1) Instalar una base de datos es inútil, es decir, una exageración. (2) Las opciones A y B funcionan solo bajo ciertas condiciones, por ejemplo, no lee ninguna configuración de NLS del registro (para el que necesita un archivo oracle.key). Por compatibilidad, también debe tener en cuenta las versiones menores. Oracle.DataAccess, Version=2.112.2.0no funciona con la OraOps11w.dllversión 2.112.4.0 por ejemplo.
Wernfried Domscheit