想要使用特定版本的ODAC

时间:2015-10-13 07:38:17

标签: .net oracle

我希望我的应用程序使用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先来),结果没有改变(仍然有相同的错误)。如果有人知道某事,任何类型的信息都将非常有用。再次提前感谢您!

1 个答案:

答案 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。