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

Resuelto EverTheLearner asked hace 15 años • 28 respuestas

Estoy intentando utilizar el cliente instantáneo Oracle ODP.NET 11g (11.1.0.6.20) 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 subyacente 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 de 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 avatar Mar 19 '09 00:03 EverTheLearner
Aceptado

He estado investigando este problema más a fondo, y simplemente necesita tomar todas las DLL apropiadas de la misma versión descargada de ODP.Net y colocarlas en la misma carpeta que su archivo Exe, porque ODP.Net es quisquilloso al 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 Sin embargo, aquí está la esencia:

  • Descargar ODP.Net
  • Descomprimir el archivo
  • Descomprima todos los JAR que contiene.
  • Tome estos archivos 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 de C#
Chris avatar Aug 11 '2009 03:08 Chris

Para empezar, debe "ignorar" toda la charla sobre x86/x64 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 frente a no administrado de Oracle ODP.net

¡Evite todos los problemas "no administrados" de qué DLL y qué arquitectura! :D (ya era hora de 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 para usar las bibliotecas administradas :

  • Primero, aquí hay una excelente comparación de código entre administrado y no administrado : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Asegúrese de haber descargado ODP.NET, versión Managed Driver Xcopy únicamente
  • Desde el archivo zip descargado, cópielo y péguelo en el directorio de su proyecto:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Agregar una referencia a Oracle.ManagedDataAccess.dll
  • Asegúrese de que su archivo ejecutable esté publicado (agregado a la carpeta de aplicaciones en VS2010) con ambos archivos DLL
Tod Thomson avatar Jul 24 '2013 05:07 Tod Thomson

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 avatar Mar 18 '2009 20:03 EverTheLearner

Esto puede deberse a la ejecución de un tiempo de ejecución .NET de 64 bits en un cliente Oracle de 32 bits. Esto puede suceder si en 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 avatar May 29 '2009 04:05 Daniel

Hagamos una especie de resumen:

El mensaje de error "El proveedor no es compatible con la versión del cliente Oracle" puede deberse a varios motivos. Mientras tanto, el mensaje de error puede tener diferentes tipos, por ejemplo, "Referencia de objeto no establecida como instancia de un objeto". o "No se pudo cargar el archivo o ensamblado 'Oracle.DataAccess' o una de sus dependencias"

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

Oracle Data Provider para .NET (ODP.NET, es decir, archivo Oracle.DataAccess.dll) no está incluido en Oracle Instant Client; debe instalarse por separado (descárguelo desde Oracle Data Access Components (ODAC) de 32 bits o Oracle Data Access Components de 64 bits ( ODAC) Descargas ) o debe seleccionar la opción correspondiente 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. ¡Tienes que comprobar incluso el número de versión menor! Por ejemplo, Oracle.DataAccess.dllla 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 utilizar sigcheck y oraociei*.dll/o OraOps*w.dllobtener la versión de Oracle Client.

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

    Hay versiones ODP.NET "1.x", "2.x" y "4.x". Estos números están relacionados con las versiones 1.0.3705/1.1.4322, 2.0.50727 y 4.0.30319 de Microsoft .NET Framework. 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 utilice 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, no podrá 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.dllsu máquina de desarrollo (es decir, la versión que se carga durante la compilación) es superior a la versión de la máquina de destino.

  • Tenga en cuenta que Oracle.DataAccess.dllpuede cargarse desde GAC , que de forma predeterminada tiene prioridad sobre cualquier archivo proporcionado localmente.

  • La versión más reciente de ODP.NET requiere una versión superior de Microsoft .NET Framework. Por ejemplo, ODP.NET versión 21.4 requiere .NET Framework 4.8. Consulte los requisitos del sistema en la "Guía del desarrollador del proveedor de datos para .NET" de su versión.

Soluciones

  • Considere utilizar el controlador administrado ODP.NET, que se puede descargar desde la página de Oracle: Descargas de componentes de acceso a datos de Oracle (ODAC) de 64 bits . Allí sólo tienes que copiar Oracle.ManagedDataAccess.dllel archivo al directorio de tu aplicación, 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 de esta manera:

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

Los atributos como Version=...o processorArchitecture=...no son obligatorios. Su aplicación se cargará correctamente 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 a su máquina local. En su proyecto VS, haga referencia a esta DLL (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 ejecute su aplicación, la Política del editor en GAC lo redirigirá a la versión realmente instalada.

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

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

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

  • Opcionalmente, elimine cualquier cliente de Oracle instalado.

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

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

  • Abra la herramienta de línea de comando, 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, normalmente 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

  • Abra su Editor de 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 juntos 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 luego desee instalar ODP.NET manualmente, tenga cuidado de seleccionar las carpetas apropiadas para la instalación.

  • A pesar de sus nombres, la carpeta 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 (respectivamente, TNS_ADMINentradas en el Registro) en una ubicación común, por ejemplo TNS_ADMIN=C:\Oracle\Common\network.

Wernfried Domscheit avatar Aug 20 '2014 19:08 Wernfried Domscheit