2013-07-02 153 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); 
      } 
     } 
相关问题