2013-07-02 142 views
5

我們使用Oracle.DataAccess.dll程序集版本2.102.2.20(32位)。如何解決「提供程序與Oracle客戶端的版本不兼容」?

我部署我們的Web API應用程序來IIS,並試圖開擴和關閉連接:

private static void CheckConnectionUsingOracleClient(string connection) 
     { 
      var logger = DiContainer.Resolve<ILogger>(); 

      try 
      { 
       logger.LogInfo("Trying to connect to " + connection); 
       // check whether you can connect to the shop using Oracle.DataAccess 
       using (var cnn = new Oracle.DataAccess.Client.OracleConnection(connection)) 
       { 
        cnn.Open(); 
        cnn.Close(); 
       } 

       logger.LogInfo("Succeeded to connect to " + connection); 
      } 
      catch (System.Exception ex) 
      { 
       logger.LogError("Failed to connect to " + connection, ex); 
      } 
     } 

在我的本地機器是好的,但在此服務器上,它拋出試圖initalize的的的OracleConnection時異常:

'Oracle.DataAccess.Client.OracleConnection' 的類型初始值設定項引發異常。 ---> Oracle.DataAccess.Client.OracleException:該 提供商是無法與服務器上

我已經安裝了Oracle客戶端11.2(32位)的Oracle客戶端的版本兼容,我可以看到,在GAC(c:\ windows \ assembly)中的Oracle.DataAccess程序集安裝在32位處理器體系結構中。它在我們的一臺服務器上正常工作,但不是這個。

在IIS中,我還在應用程序池上設置了「啓用32位應用程序」。

如何解決?我花了10個小時以上,到目前爲止嘗試不同的事物:(

我非常希望能夠用Oracle.DataAccess.dll無需在服務器上安裝Oracle客戶端的需求。

+0

與連接器的驅動器可能的問題。嘗試刪除/安裝其他版本。 – PiLHA

+0

可能的重複http://stackoverflow.com/questions/659341/the-provider-is-not-compatible-with-the-version-of-oracle-client – cremor

回答

3

甲骨文.DataProvider版本2.102.2.20 decripted

2:.NET版本(可以是1對1的.Net - 1.1,2 2 - 3.5和4 4 - 4.5)

102:Oracle版本:Oracle 10.2

2.20:Oracle數據訪問版本

您應該檢查

  1. .NET版本(不應該比你的.NET編譯更高)

  2. Oracle客戶端版本(不應超過Oracle客戶端版本)

  3. Oracle客戶端和Oracle.DataProvider都是64位或Oracle.DataProvider是32位,Oracle客戶端是32位T或支持傳統的32位模式

+0

我正在使用.NET 4.5。 Oracle Client 11.2版安裝在另一臺PC上,並且工作正常。他們都是32位。 –

0

安裝確認後:

  • PATH與甲骨文的dll位置更新:\產品\ 12.1.0 \ Client_1與\ bin和\產品\ 12.1.0 \ client_1
  • 重新啓動服務器。
  • 在IIS中爲App Pool啓用32位。
4

您可以安裝Oracle。ManagedDataAccess 使用軟件包管理器控制檯nuget

Pm> Install-Package Oracle.ManagedDataAccess 

ODP.NET,管理驅動程序是100%原生.NET代碼驅動程序。無需安裝額外的Oracle客戶端軟件即可連接到Oracle數據庫。

更新代碼

using Oracle.ManagedDataAccess.Client; 
private static void CheckConnectionUsingOracleClient(string connection) 
     { 
      var logger = DiContainer.Resolve<ILogger>(); 

      try 
      { 
       logger.LogInfo("Trying to connect to " + connection); 
       // check whether you can connect to the shop using Oracle.DataAccess 
       using (var cnn = new OracleConnection(connection)) 
       { 
        cnn.Open(); 
        cnn.Close(); 
       } 

       logger.LogInfo("Succeeded to connect to " + connection); 
      } 
      catch (System.Exception ex) 
      { 
       logger.LogError("Failed to connect to " + connection, ex); 
      } 
     } 
相關問題