El proveedor no es compatible con la versión del cliente Oracle.
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
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#
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):
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
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ó!
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.
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.dll
la 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 yoraociei*.dll
/oOraOps*w.dll
obtener 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.dll
su 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.dll
puede 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.dll
el 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.*.vbproj
edite 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 -> no 100% verificadoOracle.DataAccess.dll
según la arquitectura seleccionada y el marco .NET de destino (siempre que esté instalado correctamente)
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.dll
archivo 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 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 comando, vaya a la carpeta %WINDIR%\System32, normalmente
C:\Windows\System32
y cree un enlace simbólicoora112
a la carpetaC:\Oracle\11.2\Client_x64
(ver más abajo)Cambie a la carpeta %WINDIR%\SysWOW64, normalmente
C:\Windows\SysWOW64
y cree un enlace simbólicoora112
a la carpetaC:\Oracle\11.2\Client_x86
(ver más abajo)Modifique la
PATH
variable de entorno, reemplace todas las entradas comoC:\Oracle\11.2\Client_x86
yC:\Oracle\11.2\Client_x64
porC:\Windows\System32\ora112
, respectivamente, su\bin
subcarpeta. Nota:C:\Windows\SysWOW64\ora112
no debe estar en el entorno PATH.Si es necesario, configure su
ORACLE_HOME
variable de entorno enC:\Windows\System32\ora112
Abra su Editor de Registro. Establezca el valor del Registro
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
enC:\Windows\System32\ora112
Establecer el valor del Registro
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
enC:\Windows\System32\ora112
(noC:\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\System32
contiene las bibliotecas x64, mientras queC:\Windows\SysWOW64
contiene las bibliotecas x86 (32 bits). No te confundas.Tal vez sea una buena opción configurar su
TNS_ADMIN
variable de entorno (respectivamente,TNS_ADMIN
entradas en el Registro) en una ubicación común, por ejemploTNS_ADMIN=C:\Oracle\Common\network
.