我有一个应用程序在.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无论如何?
答案 0 :(得分:4)
据我了解,问题在于虽然Oracle.DataAccess.dll与应用程序位于同一目录中,但它无法找到其较低级别的同名词(oci等),因此出现兼容性错误。 / p>
事实证明,如果您希望应用程序与ODAC 11 xcopy部署一起使用,无论用户在其计算机上安装了什么,您需要做两件事:
为进程设置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没有被复制到客户端。
答案 1 :(得分:4)
标题为"使用Oracle Instant Client部署ODP.NET的文章"在http://alderprogs.blogspot.com/2009/04/deploying-odpnet-with-oracle-instant.html找到了关于如何使用您的应用程序提供精简的xcopy类型部署的最佳解释。支持只需要5个Oracle DLL。
据说ObiWanKenobi和Josh Kodroff的回答提供了与我的经验相符的重要信息。
添加到:http://www.brothersincode.com/post/Oracle-ODPnet-xcopy-deployment-for-aspnet.aspx
答案 2 :(得分:2)
您希望强制ODP.NET驱动程序使用本地文件夹中的oci.dll副本,而不是已安装的副本。
您可以通过
强制执行此操作或
有关详细信息,请参阅http://ora-00001.blogspot.com/2010/01/odpnet-minimal-non-intrusive-install.html和http://database.in2p3.fr/doc/oracle/Oracle_Database_11_Release_1_(11.1)_Documentation/win.111/e10927/featConfig.htm
答案 3 :(得分:0)
如果您使用的是Oracle客户端10.2.0.1或10.2.0.2,则Oracle Note 215255.1表示如果应用补丁集10.2.0.3,则会解决该问题。获取10.2.0.3数据库补丁(852MB)并将客户端修补到主页。是的,它是完整的数据库服务器补丁集,但它也适用于客户端。