我赞同使用100% managed provider 的想法。它消除了了解我将要讨论的细节的需要。这里唯一的问题是我认为您可能需要升级到 .net 4.0。
TLDR 版本:
- 改用 12c 100% 托管提供程序。
- 简短的回答是不要将提供程序 (Oracle.DataAccess.dll) 与不同版本的非托管客户端混用(至少不要向后)。
- 考虑重新设计以包含一个服务层,这样一来就无需在客户端上安装 Oracle 提供程序。
完整版:
首先,让我们确保我们了解旧的非托管提供程序(不是新的 12c 100% 托管提供程序)的组件。它由两部分组成:
- 托管的 .net 组件 - Oracle.DataAccess.dll
- 非托管(非 .net)客户端
简单地说,Oracle.DataAccess.dll 几乎只是一个包装器,将 .net 指令转换为非托管客户端的 ORACLE-NET 指令。
也就是说,当您加载 Oracle.DataAccess 时,它会按照一个顺序尝试定位它需要的非托管客户端 dll。来自Oracle Documentation:
Oracle.DataAccess.dll 搜索依赖的非托管 DLL(例如
作为 Oracle 客户端)基于以下顺序:
1.应用程序或可执行文件的目录。
2.DllPath 设置由应用程序配置或 web.config 指定。
3.machine.config指定的DllPath设置。
4.Windows注册表指定的DllPath设置。
HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\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 是最小的并且包含“即时客户端”或者,您应该考虑最低系统要求 - 即。系统必须至少安装 X 版本的 odp.net。然后,您可以针对该最小 dll 进行编译,并在目标系统具有较新版本的客户端时依赖发布者策略重定向。
当然,这也促使我询问有关建筑的问题。您是否打算提示用户输入他们的 Oracle 帐户?如果没有,您必须小心保护应用程序将使用的共享服务帐户。您最好调用代表客户端进行 oracle 调用的 Web 服务 - 为您提供另一个安全层并简化客户端部署。
大多数版本的 ODP.net 都向后兼容数据库服务器 - 您当然可以将 11g 提供程序与 10g 数据库一起使用。