如何修复“提供程序与Oracle客户端版本不兼容”的问题?

5
我们正在使用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);
            }
        }

在我的本地机器上,一切都很好,但是在此服务器上,当尝试初始化OracleConnection时会引发异常:
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
我已经在服务器上安装了Oracle客户端11.2(32位),并且我可以看到在GAC(c:\ windows \ assembly)中,Oracle.DataAccess程序集以32位处理器架构安装。它在我们的一个服务器上运行良好,但是在此服务器上却无法使用。
在IIS中,我还设置了应用程序池的“启用32位应用程序”。
如何解决?我已经花费超过10个小时尝试不同的方法:(
最理想的情况是能够在不需要在服务器上安装Oracle Client的情况下使用Oracle.DataAccess.dll。

可能是连接器驱动程序出现问题。尝试卸载/安装其他版本。 - PiLHA
可能是 https://dev59.com/6nRB5IYBdhLWcg3wUVxd 的重复问题,该提供程序与 Oracle 客户端的版本不兼容。 - cremor
3个回答

5

您可以使用包管理器控制台nuget安装Oracle.ManagedDataAccess。

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);
            }
        }

5

Oracle.DataProvider版本2.102.2.20已解密。

2:.Net版本(可以是1表示.Net 1-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 位或支持传统的 32 位模式


我正在使用.NET 4.5。Oracle客户端版本11.2已安装在另一台计算机上,并且可以正常工作。它们都是32位的。 - The Light

1

安装完成后,请确保:

  • 更新 PATH 变量,添加 Oracle dlls 的位置:\product\12.1.0\client_1\bin 和 \product\12.1.0\client_1
  • 重启服务器。
  • 在 IIS 中为应用程序池启用 32 位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接