我希望我的应用程序使用Oracle 11g ODAC,但它似乎正在使用12c的那些.... 如何强制我的应用程序使用11g ODAC?
出于某种原因,我在PC上关注客户端和ODT(Windows 7 Pro SP1 64位):
- Oracle 11g Client (64-bit) version 11.2.0.3.0
- Oracle 12c Client (64-bit) version 12.1.0.1.0
- Oracle 12c ODT (Oracle Developer Tools for Visual Studio) (32-bit)
而且,我的.net项目(visual studio 2013)引用" Oracle.DataAccess.dll"存储在: C:\的Windows \ Microsoft.NET \组件\ GAC_64 \ Oracle.DataAccess \ v4.0_4.112.3.0__89b483f429c47342
我的环境路径的顺序是这样的:
C:\oracle12c\product\12.1.0\client_2;
C:\oracle12c\product\12.1.0\client_2\bin;
C:\oracle12c\product\12.1.0\client_1;
C:\oracle12c\product\12.1.0\client_1\bin;
C:\Oracle\product\11.2.0\client_1;
C:\Oracle\product\11.2.0\client_1\bin;
我尝试过在web.config文件中指定dllPath,如下所示:
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\Oracle\product\11.2.0\client_1\bin"/>
</settings>
</oracle.dataaccess.client>
然而,它不起作用。 当调用 OracleConnection 类的构造函数时,我收到以下错误:
System.TypeInitializationException:
The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.
---> Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client
at Oracle.DataAccess.Client.OracleInit.Initialize()
at Oracle.DataAccess.Client.OracleConnection..cctor()
--- End of inner exception stack trace ---
任何信息都会有所帮助。提前谢谢!
--- Yukapod于10月14日更新---
我发现我的应用程序不需要12c ODT 32位版本,因此我将其从PC中删除并再次尝试。 但情况并没有改变;我仍然得到&#34;提供商与Oracle客户端版本不兼容&#34;在调用OracleConnection类的构造函数之后发生错误。我想知道问题出在哪里......
我的web.config中仍然有以下配置:
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\Oracle\product\11.2.0\client_1\bin"/>
</settings>
</oracle.dataaccess.client>
而且,这是我当前的环境PATH变量:
C:\oracle12c\product\12.1.0\client_1;
C:\oracle12c\product\12.1.0\client_1\bin;
C:\Oracle\product\11.2.0\client_1;
C:\Oracle\product\11.2.0\client_1\bin;
,其中
C:\oracle12c\product\12.1.0\client_1
-> ORACLE_HOME for Oracle 12c Client (64-bit) version 12.1.0.1.0
Oracle\product\11.2.0\client_1
-> ORACLE HOME for Oracle 11g Client (64-bit) version 11.2.0.3.0
即使我颠倒了PATH变量的顺序(我的意思是,让11g先来),结果没有改变(仍然有相同的错误)。如果有人知道某事,任何类型的信息都将非常有用。再次提前感谢您!
答案 0 :(得分:0)
谢谢大家的帮助!我终于找到了这个问题的原因。
<强>原因:强>
12c的Policy DLL正在将11g的所有引用重定向到12c。
<强>详细信息:强>
我首先安装了11g客户端,然后安装了12c客户端,因此我的GAC中有两个策略文件夹(C:\ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Policy.4.112.Oracle.DataAccess):
v4.0_4.112.3.0__89b483f429c47342 <== policy folder for 11g
v4.0_4.121.1.0__89b483f429c47342 <== policy folder for 12c
在每个文件夹中,您都可以看到Policy。[version] .Oracle.DataAccess.config文件。
11g的配置文件是这样的:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/> <== This is OK!
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
这是12c的那个:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="4.112.0.0-4.112.9999.9999" newVersion="4.121.1.0"/> <== OMG!! The 11g version 4.0_4.112.3 is included!
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
我不必关心环境PATH变量的顺序,或者我不必使用DllPath指定我想要的Oracle.DataAccess.dll版本。就我而言,以下是使用特定ODAC的关键点:
- Make sure that my application has a reference for Oracle.DataAccess.dll for 11g.
- Remove / rename the policy folder for 12c (v4.0_4.121.1.0__89b483f429c47342) in GAC.
然后,我终于可以使用11g。