2015-10-13 67 views
0

我希望我的應用程序使用Oracle 11g ODAC,但它似乎是使用那些用於12c .... 如何強制我的應用程序使用11g ODAC?想使用ODAC的特定版本

出於某種原因,我有以下的客戶和ODT在我的電腦(Windows 7的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項目(視覺工作室2013年)referes「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 --- 

任何信息都將是有益的。先謝謝你!

--- UPDATE 10月14日通過Yukapod ---

我發現我的應用程序不需要12C ODT 32位版本,所以我從我的電腦中刪除它,並再次嘗試。 然而,情況並沒有改變;在調用OracleConnection類的構造函數之後,我仍然收到「提供程序與Oracle客戶端版本不兼容」錯誤。我不知道哪裏出了問題....

我仍然在我的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變量的順序(我的意思是,讓11克是第一位的),結果沒有改變(仍然有相同的錯誤)。如果有人知道,任何類型的信息都會非常有幫助。再次提前謝謝你!

+0

您的應用程序嘗試使用11g ODAC:C:\ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess \ v4.0_4。 ** ** 112。3.0__89b483f429c47342。但是,它會加載64位版本的「Oracle.DataAccess.dll」,但它會找到(第一個)32位Oracle客戶端二進制文件。如果你喜歡 - 或者在你的機器上同時使用32位和64位Oracle客戶機,請按照以下說明安裝它們:http://stackoverflow.com/questions/24104210/badimageformatexception-this-will-occur- 64-bit-mode-with-the-32#24120100 –

+0

感謝您的快速響應,Wernfried!我發現我的應用程序不再需要12c ODT 32位版本,所以我從我的PC中刪除了它。然而,情況並沒有改變...... – yukapod

+0

也看看這個:http://stackoverflow.com/questions/659341/the-provider-is-not-compatible-with-the-version-of-oracle-客戶端#25412992。我的建議是完全刪除所有Oracle安裝(請參閱:http://stackoverflow.com/questions/28727721/how-can-i-completely-uninstall-oracle-11g/28728711#28728711)並進行新的全新安裝。 –

回答

0

謝謝大家幫助我!我終於找到了這個問題的原因。

原因:

12C的政策DLL被重定向對11克所有參考到12C。

詳情:

我第一次安裝Oracle 11g客戶端,然後安裝12C的客戶,所以在我的GAC(C兩項政策文件夾:\ WINDOWS \ Microsoft.NET \裝配\ GAC_64 \ Policy.4.112。甲骨文。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了。