visual studio odp net manageddataaccess framework for example data 11g c# asp.net oracle odp.net oracleclient

c# - studio - El proveedor no es compatible con la versión del cliente de Oracle



oracle managed data access visual studio 2017 (26)

Intento utilizar 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 " cliente de Oracle ". Cualquier ayuda sería apreciada.

Hice referencia al proveedor de datos en Visual Studio 2005 y el código que se muestra es el siguiente:

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


¿El usuario de IIS / IWAM tiene permisos en el directorio de Oracle? ¿Puede conectarse a esta fuente de datos usando otra aplicación, como Excel o Access?


Debería "ignorar" todo el discurso 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 administrado por Oracle ODP.net vs controlador no administrado

Evite todo lo "no administrado" que DLL emite la arquitectura. : D (sobre la hora de Oracle).

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

El método antiguo / manual:

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

  • En primer lugar, aquí hay una gran comparación de código de administrado frente a no administrado : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Asegúrese de haber descargado la versión de ODP.NET, Managed Driver Xcopy solamente
  • Desde el archivo zip descargado, copie y pegue en su directorio de proyecto:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Agregue una referencia a Oracle.ManagedDataAccess.dll
  • Asegúrese de que su exe se haya liberado (agregado a la carpeta de aplicaciones en VS2010) con ambos dlls

Después de perder tres horas en esto, mi problema fue simplemente:

Falta OraOps11w.dll

¿Por qué debería eso generar el mensaje de error "El proveedor no es compatible con la versión del cliente de Oracle"? Debe ser una codificación / prueba deficiente por parte de Oracle. Utilizo Oracle desde 1994 y muchas veces con .Net desde 2002. Prácticamente siempre es un problema.

Todos deberían desinstalar Oracle y seguir la solución de Chris anterior (respuesta superior) . Eso debería funcionar todo el tiempo

Desde otra publicación en , esta es la forma de desinstalar Oracle (olvide la herramienta de desinstalación de Oracle, ya que no funciona correctamente):

  • Desinstale todos los componentes de Oracle utilizando Oracle Universal Installer (OUI).
  • Ejecute regedit.exe y elimine la clave HKEY_LOCAL_MACHINE / SOFTWARE / ORACLE. Esto contiene entradas de registro para todos los productos de Oracle.
  • Elimine cualquier referencia a servicios de Oracle que haya quedado en la siguiente parte del registro: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / Ora * Debería ser bastante obvio cuál se relaciona con Oracle.
  • Reinicia tu máquina.
  • Elimine el directorio "C: / Oracle" o el directorio que sea su ORACLE_BASE.
  • Elimine el directorio "C: / Archivos de programa / Oracle".
  • Vacía el contenido de tu directorio "c: / temp".
  • Vacíe su papelera de reciclaje.

Chris tiene menos dlls que yo en Server 2003 (32 bit). Esto es lo que tengo:

C:/oracle/instantclient>dir /b oci.dll ociw32.dll Oracle.DataAccess.dll orannzsbb11.dll oraocci11.dll oraociei11.dll OraOps11w.dll Orasqlplusic11.dll sqlplus.exe tnsnames.ora

C: / oracle / instantclient está en la ruta global y en la variable de entorno ORACLE_HOME. El código .Net hace referencia a C: / oracle / instantclient / Oracle.DataAccess.dll


Después de varias horas de resolución de problemas, descubrí que este problema se debe a tener Oracle.DataAccess.dll (v4.0) en el directorio bin de mi proyecto, pero el tiempo de ejecución también carga 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 parecen ser necesarios en mi situación.

ACTUALIZAR

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

<configuration> <oracle.dataaccess.client> <settings> <add name="DllPath" value="C:/oracle/bin"/> <!-- ... --> </settings> </oracle.dataaccess.client> </configuration>


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


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

  1. En Oracle Home ubicado en C:/oracle/product/11.2.0 tenía una carpeta llamada client_1 donde había instalado previamente bits ODP.NET para Windows 64 bits.

  2. Más tarde, cuando intentaba depurar mi aplicación ASP.NET Web API con Visual Studio 2012, seguí recibiendo este mensaje de error: El proveedor no es compatible con la versión del cliente de Oracle .

  3. Al buscar en Google, descubrí que esto estaba sucediendo porque estaba usando ODP.NET 64 bits. Luego agarré ODP.NET para Windows 32 bits y lo instalé pero seguí recibiendo el mismo mensaje de error.

  4. SOLUCIÓN: eliminó la carpeta client_1 y volvió a instalar ODP.NET 32 bits. Un poco, 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 de nuevo y puedo abrir una nueva OracleConnection . ¡FINALMENTE! :)


Esto puede deberse a que ejecuta 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 64 bit. Ejecutará la aplicación .NET con el tiempo de ejecución de 64 bits. Puede establecer el indicador de CPU en su proyecto en VS para ejecutarlo en el tiempo de ejecución de 32 bits.


Hagamos algún tipo de resumen:

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

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

    ODP.NET (es decir, el archivo Oracle.DataAccess.dll ) no está incluido en Oracle Instant Client, debe instalarse por separado (descargar desde los Componentes de acceso a datos Oracle (ODAC) de 32 bits o los Componentes de acceso a datos Oracle (ODAC) de 64 bits Descargas ) o tiene que seleccionar la opción de acuerdo en Oracle Universal Installer (OUI).

  • La versión de ODP.NET no coincide con la versión instalada de Oracle Client. ¡Tienes que verificar incluso el número de versión menor! Por ejemplo, Oracle.DataAccess.dll versió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*.dll y / o OraOps*w.dll para obtener la versión de Oracle Client.

    Tenga en cuenta el diferente esquema de numeración. La versión del archivo 4.112.3.0 significa: .NET Framework Versión 4, Oracle Release 11.2.0.3.x.

    Hay versiones ODP.NET "1.x", "2.x" y "4.x". Estos números están relacionados con Microsoft .NET Framework versiones 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

    Además, tenga en cuenta que Oracle.DataAccess.dll puede cargarse desde GAC que por defecto tiene prioridad sobre cualquier archivo proporcionado localmente.

  • 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 podrá usar ODP.NET versión 4.x. La versión de destino de .NET Framework debe ser igual a la versión superior de ODP.NET.

Soluciones

  • Considere usar el controlador administrado ODP.NET, puede descargarse de la página de Oracle: Descargas de Oracle Data Access Components (ODAC) de 64 bits . Allí solo tiene que copiar el archivo Oracle.ManagedDataAccess.dll al directorio de la aplicación, no se requiere nada más. Funciona tanto para 32 bits como para 64 bits.

  • En su *.csproj , resp. *.vbproj edita su referencia a ODP.NET de esta manera:

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

    Los atributos como Version=... o processorArchitecture=... no son necesarios. Su aplicación cargará el Oracle.DataAccess.dll correcto según la arquitectura seleccionada y el framework .NET de destino (siempre que esté instalado correctamente)

  • No creo que sea un enfoque inteligente tomar DLL individuales y copiarlas a ciertas carpetas. Puede funcionar en una máquina "desnuda", pero si su máquina de destino ha instalado algún producto de Oracle, existe un alto riesgo de que no coincida con la versión. Desinstale los productos Oracle de su máquina y realice una nueva instalación. Eche un vistazo a Cómo desinstalar / eliminar completamente Oracle 11g (cliente)? ordena 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 sola máquina:

Supuestos: Oracle Home se llama OraClient11g_home1 , Client Version es 11gR2.

  • Opcionalmente eliminar 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, en C:/Oracle/11.2/Client_x64

  • Abra la herramienta de línea de comandos, vaya a la carpeta% WINDIR% / System32, normalmente C:/Windows/System32 y cree un enlace simbólico ora112 a la carpeta C:/Oracle/11.2/Client_x64 (consulte a continuación)

  • Cambie a la carpeta% WINDIR% / SysWOW64, normalmente C:/Windows/SysWOW64 y cree un enlace simbólico ora112 a la carpeta C:/Oracle/11.2/Client_x86 , (vea abajo)

  • Modifique la PATH entorno PATH , reemplace todas las entradas como C:/Oracle/11.2/Client_x86 y C:/Oracle/11.2/Client_x64 por C:/Windows/System32/ora112 , respectivamente su subcarpeta /bin . Nota: C:/Windows/SysWOW64/ora112 no debe estar en el entorno PATH.

  • Si es necesario, configure su variable de entorno ORACLE_HOME en C:/Windows/System32/ora112

  • Abra su Editor del Registro. Establezca el valor de registro HKLM/Software/ORACLE/KEY_OraClient11g_home1/ORACLE_HOME en C:/Windows/System32/ora112

  • Establezca el valor de Registro HKLM/Software/Wow6432Node/ORACLE/KEY_OraClient11g_home1/ORACLE_HOME en C:/Windows/System32/ora112 (no en C:/Windows/SysWOW64/ora112 )

  • ¡Estás listo! Ahora puede usar el cliente Oracle x86 y x64 sin problemas, es decir, una aplicación x86 cargará las bibliotecas x86, una aplicación x64 carga 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 desee instalar ODP.NET manualmente después, tenga cuidado de seleccionar las carpetas apropiadas para la instalación.

  • A pesar de su carpeta de nombres C:/Windows/System32 contiene las bibliotecas x64, mientras que C:/Windows/SysWOW64 contiene las bibliotecas x86 (32 bits). No te confundas

  • Quizás sea una sabia opción establecer su variable de entorno TNS_ADMIN (respectivamente las entradas TNS_ADMIN en el Registro) en una ubicación común, por ejemplo TNS_ADMIN=C:/Oracle/Common/network .


He estado investigando este problema más a fondo, y simplemente necesita obtener 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 acerca de 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á su esencia:

  • Descargar ODP.Net
  • Descomprime el archivo
  • Descomprimir todos los JAR''s
  • Coge estos dll que acabamos 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 #

La solución de Chris funcionó para mí también. 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á apuntando a todas las plataformas o máquinas de 32 bits. Simplemente cambie su plataforma objetivo en Project Properties a 64 bits y espere lo mejor.


Me parece que a pesar de que tiene ODP con Oracle Istant Client, el ODP puede estar tratando de usar el cliente real de Oracle en su lugar. ¿También tiene un cliente Oracle estándar instalado en la máquina? Recuerdo que Oracle fue bastante quisquilloso con respecto a múltiples clientes en la misma máquina.


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

  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 usado 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 para el 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, verifique su firewall.
  5. OPCIÓN A: para C # (.NET2 o .NET4) puede descargar ODAC11 , desde donde debe agregar Oracle.DataAccess.dll a su proyecto. Además, esta DLL depende de: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB), msvcr80.dll. These DLLs must be in the same directory as the EXE or you must specify the DLL path in: HKEY_LOCAL_MACHINE/SOFTWARE/Oracle/ODP.NET/4.112.4.0/DllPath . On 64 bit machines write additionally to HKLM/SOFTWARE/Wow6432Node/Oracle/...
  6. OPTION B: If you have downloaded ODAC12 you need Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll. The Registry path is HKEY_LOCAL_MACHINE/SOFTWARE/Oracle/ODP.NET/4.121.2.0/DllPath
  7. OPTION C: If you don''t want huge DLL''s of more than 100 MB you should download ODP.NET_Managed12.xxxxxxxx.zip in which you find Oracle.ManagedDataAccess.dll which is only 4 MB and is a pure managed DLL which works in 32 bit and 64 bit processes as well and depends on no other DLL and does not require any registry entries.
  8. The following C# code works for me without any configuration on the server side (just the default installation):

using Oracle.DataAccess.Client; or using Oracle.ManagedDataAccess.Client; .... string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)));" + "User Id=SYSTEM;Password=xxx;"; using (OracleConnection conn = new OracleConnection(oradb)) { conn.Open(); using (OracleCommand cmd = new OracleCommand()) { cmd.Connection = conn; cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES"; using (OracleDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { listBox.Items.Add(dr["TABLESPACE_NAME"]); } } } }


No fui por el camino de obtener nuevas DLL. Teníamos un montón de proyectos existentes que funcionan perfectamente bien y solo era mi nuevo proyecto el que me estaba dando dolores de cabeza, así que decidí probar algo más.

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

Entonces lo que hice fue:

  1. Copié Internal.dll desde uno de los proyectos que se ejecutan con éxito a mi sitio web /bin (solo para estar seguro).
  2. Copié Oracle.DataAccess.dll de uno de los proyectos que se ejecutan con éxito en el /bin mi sitio web.
  3. Agregar referencia a ambos desde mi sitio web.
  4. Finalmente, la referencia Oracle.DataAccess apareció en myWebSite.csproj , pero mostró la versión incorrecta: v4.121.0.0 lugar de v4.112.3.0 .
  5. Cambié manualmente la referencia en 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>


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

Para cualquiera que todavía tenga este problema: basado en 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 ++. Lo 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

¡Se ejecutó la configuración y la llamada al oráculo de C # lo hizo!


Recientemente tuve que trabajar en un proyecto anterior donde la solución y todos los proyectos contenidos estaban destinados a la plataforma x32. Seguí intentando copiar Oracle.DataAccess.dll y todos los demás archivos de Oracle sugeridos en todos los lugares, pero toco el muro cada vez. Finalmente, el foco en la cabeza se iluminó (después de 8 horas :)), y se le pidió que verificara los ensambles ODAC instalados y su plataforma. 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 del ODAC instalado.

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


Solo dos pasos para resolver este problema.

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

la mejor de las suertes.


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) .

¡Acabo de instalarlo y el error desapareció!


También busque el grupo de aplicaciones de IIS. Active el indicador de verdadero o falso de 32 bits, cuando vea este mensaje, ¡algún foro de Oracle me indicó esto!


Tengo el mismo problema pero en mi caso no puedo simplemente copiar los dlls en la carpeta bin, entonces solo ''vuelvo a enlazar'' la versión del ensamblado.

<?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>


Tuve el mismo problema con Oracle.DataAccess.dll v4.121.2.0. con instalación de 2 hogares (versiones de 32 y 64 bits). La versión de 32 bits trabajada, 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 64 bits para el hogar. 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á establecido por defecto en el directorio padre. Esos subdirectorios incluían "bin", "network / admin", "nls", "oracore", "RDBMS" y posiblemente otros. Los encontré filtrando el resultado "ACCESS DENIED" en la utilidad "Process Monitor" (Procmon.exe) de sysinternals. Una vez que los permisos fueron heredados del directorio padre a esos subdirectorios secundarios, todo comenzó a funcionar.

No pude anular los permisos en el hogar completo del oráculo, así que los hice un directorio a la vez, pero supongo que si no te preocupas tanto por la seguridad, puedes restablecerlo en el directorio principal completo de Oracle.


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.


Tuvimos el mismo problema porque nuestro DBA actualizaba el ensamblado Oracle.Data.dll en un recurso compartido de red. Eliminar la referencia del proyecto y volver a agregarlo resolvió el problema.


Versión de TLDR:

  • Use el proveedor administrado 100% 12c en su lugar.
  • Si debe usar el proveedor anterior, debe apuntar Oracle.DataAccess.dll a las Dlls de Oracle Client no administradas que son de la versión correcta. Si tiene instalados múltiples clientes de Oracle en su máquina, quizás sea sencillo incluir la variable de configuración "DllPath" (ver a continuación) 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 entendemos los componentes del antiguo proveedor sin remezclar (no el nuevo proveedor administrado al 100% 12c). Está compuesto de dos piezas:

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

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

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

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

1.Directorio de la aplicación o ejecutable.

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

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

Configuración de 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 Windows PATH.

Entonces, en su caso, su aplicación siguió este proceso anterior y encontró una ruta que tiene dlls no administrados que son demasiado viejos 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 gestionados se encontraron primero en una instalación diferente pero más antigua. Si lo último, 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 arriba a esta nueva ubicación. Pero cualquier instalación de cliente Oracle funcionará.

Pero si desea evitar todo este asunto de resolución de cliente no administrado, vea si puede actualizar su aplicación para usar el proveedor 100% administrado en su lugar: realmente es solo 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 tiene si está instalado tanto en su directorio bin como en su GAC, pero creo que es el senario menos probable. Consulte el proceso de resolución de ensamblaje para obtener más información.


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