如何修复"提供程序与Oracle客户端版本不兼容"?

The*_*ght 5 c# asp.net oracle data-access oracle-client

我们使用的是Oracle.DataAccess.dll程序集版本2.102.2.20(32位).

我将我们的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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

在我的本地机器上它很好,但是在这个服务器上它会在尝试初始化OracleConnection时抛出异常:

对于"Oracle.DataAccess.Client.OracleConnection"的类型初始值引发异常.---> Oracle.DataAccess.Client.OracleException:提供程序不能与Oracle客户端的版本兼容

我已经在服务器上安装Oracle客户端11.2(32位)和I可以看到,在GAC(C:\ WINDOWS \组件)的Oracle.DataAccess组件安装在32位处理器体系结构.它在我们的一台服务器上工作正常但不是这一台.

在IIS中,我在应用程序池上设置了"启用32位应用程序".

怎么修好?到目前为止我花了10多个小时尝试不同的东西:(

理想情况下,我希望能够使用Oracle.DataAccess.dll而无需在服务器上安装Oracle客户端.

Dmi*_*nko 5

Oracle.DataProvider版本2.102.2.20解密

2:.Net 版本(对于 .Net 1 - 1.1 可以是 1,对于 2 - 3.5 可以是 2,对于 4 - 4.5 可以是 4)

102:Oracle 版本:Oracle 10.2

2.20:Oracle数据访问版本

你应该检查一下

  1. .Net 版本(不应高于您的 .Net 编译器)

  2. Oracle客户端版本(不应超过Oracle客户端版本)

  3. Oracle 客户端和 Oracle.DataProvider 均为 64 位,或者 Oracle.DataProvider 为 32 位且 Oracle 客户端为 32 位或支持旧版 32 位模式


Dav*_*ano 5

您可以使用Package Manager Console nuget安装Oracle.ManagedDataAccess

Pm> Install-Package Oracle.ManagedDataAccess
Run Code Online (Sandbox Code Playgroud)

ODP.NET托管驱动程序是100%本机.NET代码驱动程序。无需安装其他Oracle Client软件即可连接到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);
            }
        }
Run Code Online (Sandbox Code Playgroud)