5

我有一个应用程序在 .exe 文件所在的目录下使用本地版本的 ODAC 11。我们希望我们的应用程序使用本地 ODAC 11,而不管用户在她的机器上安装了什么。

Oracle.DataAccess.dll 与 .exe 位于同一目录中。

当客户端机器没有安装 Oracle 客户端时它工作正常,但是在安装了 Oracle Database 10.2.0.something 的机器上启动它时出现错误:

The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.

[Stack Trace]

The provider is not compatible with the version of Oracle client
OracleException
   at Oracle.DataAccess.Client.OracleInit.Initialize()
   at Oracle.DataAccess.Client.OracleConnection..cctor()

我猜这与运行时绑定策略有关,但在 Google 上搜索“Oracle/ODAC/ODP.NET 运行时绑定策略”并没有发现任何有用的信息。

有谁知道如何解决这个问题?

如果不是这个特定问题,有人可以向我指出如何做我想做的事情的概述:确保我的应用程序无论如何都使用 ODAC 11?

4

4 回答 4

4

所以据我了解,问题在于,虽然 Oracle.DataAccess.dll 与应用程序位于同一目录中,但它找不到其较低级别的伙伴(oci 等),因此出现兼容性错误。

事实证明,如果您希望应用程序与 ODAC 11 xcopy 部署一起使用,而不管用户可能在她的机器上安装了什么其他东西,您需要做 2 件事:

  1. 为进程设置 PATH 环境变量。(我已经这样做了。)
  2. 为进程设置 ORACLE_HOME 环境变量。(我没有这样做。)

    Environment.SetEnvironmentVariable("PATH", Environment.CurrentDirectory + "\\oracle\\11.1\\odac;" + Environment.CurrentDirectory + "\\oracle\\11.1\\odac\\bin;", EnvironmentVariableTarget.Process);
    Environment.SetEnvironmentVariable("ORACLE_HOME", Environment.CurrentDirectory + "\\oracle\\11.1\\odac", EnvironmentVariableTarget.Process);
    

编辑:同样重要的是要注意,Oracle 不仅会因为环境问题引发此错误,而且如果目标机器上缺少其中一个文件,也会引发此错误。尽管有环境设置,但我在其他机器上也遇到了同样的错误,因为我将 Subversion 设置为忽略名为“bin”的目录,因此没有将 OraOps DLL 复制到客户端。

于 2009-02-02T19:36:52.357 回答
4

http://alderprogs.blogspot.com/2009/04/deploying-odpnet-with-oracle-instant.html上的一篇题为“使用 Oracle Instant Client 部署 ODP.NET”的文章给出了对我来说最好的解释如何为您的应用程序提供精简的 xcopy 类型部署。支持只需要 5 个 Oracle DLL。

也就是说,ObiWanKenobi 和 Josh Kodroff 的回答提供了与我的经验相匹配的重要附加信息。

补充一点:http ://www.brothersincode.com/post/Oracle-ODPnet-xcopy-deployment-for-aspnet.aspx

于 2011-02-09T16:01:42.590 回答
2

您想强制 ODP.NET 驱动程序使用本地文件夹中的 oci.dll 副本,而不是已经安装的。

您可以通过以下任一方式强制执行此操作

  • 设置 PATH 变量,以便系统首先找到您的 oci.dll 副本(如 Josh Kodroff 的回答)

或者

  • 您可以使用 app.config(或 web.config)中的 ODP.NET 配置部分来显式设置“DllPath”的值。

有关详细信息,请参阅http://ora-00001.blogspot.com/2010/01/odpnet-minimal-non-intrusive-install.htmlhttp://database.in2p3.fr/doc/oracle/Oracle_Database_11_Release_1_(11.1) _Documentation/win.111/e10927/featConfig.htm

于 2010-09-01T07:03:02.980 回答
0

如果您使用的是 oracle 客户端 10.2.0.1 或 10.2.0.2,Oracle 说明 215255.1 指出,如果您应用补丁集 10.2.0.3,它可以解决问题。获取 10.2.0.3 数据库补丁 (852MB) 并修补客户端主页。是的,它是完整的数据库服务器补丁集,但它也适用于客户端。

于 2009-02-01T21:35:13.710 回答