在将.NET 3.5 Windows窗体部署到不同环境时,我们遇到了许多无效的提供程序问题。
它适用于某些人而不适用于其他人。
有人可以帮帮我,我该如何确定使用哪个版本的“Oralce.DataAccess.dll”,即9或10或11或9.1。*或10.1。*或11. *或12等。
是否依赖于我正在安装应用程序的服务器? OR
是否依赖于后端oracle数据库?
答案 0 :(得分:5)
我的第二个概念是使用100% managed provider。它不需要知道我即将讨论的细节。这里唯一的问题是我认为您可能需要升级到.net 4.0。
TLDR版本:
完整版:
首先,让我们确保了解旧的未经授权的提供程序(而不是新的12c 100%托管提供程序)的组件。它由两部分组成:
简单来说,Oracle.DataAccess.dll几乎只是一个包装器,将.net指令转换为非托管客户端的ORACLE-NET指令。
也就是说,当您加载Oracle.DataAccess时,它会尝试查找所需的非托管客户端dll。来自Oracle Documentation:
Oracle.DataAccess.dll搜索依赖的非托管DLL(例如 作为Oracle客户端)基于以下顺序:
1.应用程序或可执行文件的目录。
2.应用程序配置或web.config指定的.DllPath设置。
3.由machine.config指定的DllPath设置。
4. Windows注册表指定的4.DllPath设置。
HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ \版本ODP.NET \ DllPath的
5. Windows PATH环境变量指定的目录。
如果您在计算机上安装了多个客户端,则会发挥作用,因此这可能是您的问题的一部分。如果是这样,最简单的方法是在配置中使用dllPath配置变量:
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>
现在,直接回答你的问题 - 我不相信Oracle支持Oracle.DataAccess.dll与它的客户端不匹配(至少不会倒退)。您最好的选择是安装ODP.net与您的应用程序安装 - xcopy version是最小的并包含“即时客户端”或者,您应该考虑最低系统要求 - 即。系统必须至少安装了odp.net的X版本。然后,当目标系统具有客户端的NEWER版本时,您可以针对该最小dll进行编译并依赖发布者策略重定向。
当然这也促使我询问有关建筑的问题。您是否计划提示用户使用他们的Oracle帐户?如果没有,您必须小心保护应用程序将使用的共享服务帐户。您可能最好调用一个代表客户端进行oracle调用的Web服务 - 为您提供另一个安全层并简化您的客户端部署。
大多数版本的ODP.net都向后兼容数据库服务器 - 您当然可以将11g提供程序与10g数据库一起使用。
答案 1 :(得分:3)
首先澄清: 您有一个Oracle数据库服务器(您称之为“后端oracle数据库”)和一个Oracle 客户端(无论它是否安装在应用程序服务器上< / em>,从Oracle的角度来看,它是客户端)
ODP.NET(Oracle Data Provider for .NET,即Oracle.DataAccess.dll和更多文件)的版本由Oracle客户端定义。您几乎可以使用每个ODP.NET版本连接到每个Oracle数据库版本 - 或多或少。
错误消息“提供程序与Oracle客户端版本不兼容”也可能意味着根本没有安装ODP.NET提供程序。在这种情况下,错误消息确实有点误导。因此,首先检查是否安装了ODP.NET,它不包含在标准的Oracle Instant Client安装中。
当我检查Oracle的所有可用下载时,您有ODP.NET版本
9。?和10.?指的是Oracle的版本,1.x,2.0和4.0指的是Microsoft .NET Framwork的版本(奇怪的编号,但就是这样)。版本9.?和10.?很老了,我认为使用它们没有任何意义。直到Oracle客户端版本11.1,才支持1.x.
版本1.x和2.0彼此不兼容,即perhpaps你必须向你的客户提供你的应用程序的两个不同的安装文件,客户必须根据他的本地oracle客户端安装选择正确的。 / p>
我不知道2.0和4.0的情况,到目前为止我从未使用过4.0。
不需要将Oralce.DataAccess.dll的本地副本放入应用程序目录中。它将从安装它的GAC(全局程序集缓存)中获取。
在您的开发中,您只需要注意这些市长版本,例如2.0。 然后你的loal GAC知道由于策略文件加载了哪个确切的版本,例如2.0.10.2.0.2.20或2.0.11.1.0.6.20或2.0.11.1.0.7.20或2.0.11.2.0.1.2或其他。
除此之外,您必须知道您的Oracle客户端是32位还是64位,并相应地包含ODP.NET。
您可以在此处获取更多信息:Oracle Data Provider for .NET FAQ
答案 2 :(得分:2)
如果您的系统中安装了客户端或oracle实例。检查文件夹名称
ORACLE_HOME \产品\ 11.2.0 \ dbhome_1 \ ODP.NET \ BIN \ 2.x的
在这里你会找到文件 - Oracle.DataAccess.dll
只需加入您的参考资料。
答案 3 :(得分:0)
事实上,我认为没有正确的答案。 这完全取决于应用程序运行的处理器体系结构(如此位),您使用的OCI客户端的版本等等。
我发现将Oracle交互包装在一个类中最有用,使用Reflection查找要使用的可用版本。
关于版本号:ODP.net程序集的版本必须与OCI客户端安装的版本匹配。将12. * OCI客户端与10. * ODP.net程序集混合是一个坏主意。
也许this article对您也很有用。
答案 4 :(得分:0)
如果您的Oracle服务器是10.2或更高版本,您可以考虑使用Oracle 12提供的托管ODP.NET版本。
显然它是一个依赖,低于10 MB。与依赖于Oracle(即时)客户端的ODP.NET版本相比,它应该使您的应用程序部署到不同的系统要容易得多。它还应该避免您必须关心任何已安装的Oracle客户端。
但是,他们确实提到它适用于“.NET Framework 4.5.1的最新版本”,因此根据我的理解,您需要将应用程序升级到4.5.1,但也许只有在您希望使用某些功能(如实体框架支持)。
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
答案 5 :(得分:0)
有时你会得到Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies.
,而你有正确的dll而问题出在其他地方。
它发生在我身上(这个主题帮助我解决了很多问题)而且我的应用程序池在IIS中的配置不允许32位应用程序(高级设置)。