这是一个古老但仍然相关的问题,虽然这里的答案很有帮助,但没有一个答案完全解决了 OP 的两个问题。
1. 我是否必须在要运行我的应用程序的计算机上安装 ODP.NET 和 Oracle 客户端?
是-如果您使用的是 ODP.NET,则为 Unmanaged。这是您在 Oracle 客户端安装程序(例如)中选择“Oracle Data Provider for .NET”时通常安装的版本。你从甲骨文下载这个(只是谷歌它:甲骨文网址经常变化)。
但是,如果您使用的是 ODP.NET,托管(并且您可能希望使用这个代替)那么不,您只需要安装(或部署)ODP.NET,托管应用程序,而不是完整的 Oracle 客户端。详情见下文。
2. 如果是,是否有其他方式我不必安装它们但仍然可以运行我的应用程序?
是的,至少有一种方法。它是 ODP.NET 的托管端口。
不幸的是,通常的解决方法,包括 ODBC,Microsoft 的 Oracle Provider for .NET(是的,那个旧的,已弃用的)和 ODP.NET,非托管 DLL 都需要安装 Oracle 客户端。直到我们在 Oracle 的朋友给了我们一个很好的小 (~5MB) DLL,它也是托管的。这意味着不再需要为 32 位和 64 位 Oracle 客户端部署 32 位和 64 位版本!并且在您针对 10.0.2.1(或其他)构建的程序集绑定方面没有更多问题,但是您的客户安装了从 9i 一直到 12c 的一系列客户端,包括中间的“g”客户端)因为您可以直接发布它使用您的应用程序,并通过 nuget 进行管理。
但是,如果您使用 ODP.NET, Managed 作为 nuget 包提供,那么您不需要安装 Oracle 客户端。您只需要 ODP.NET 托管 DLL。如果您之前使用的是 ODP.NET,非托管 DLL,那么切换非常容易:只需更改对托管 ODP.NET 的所有引用(csharp 中的 .csproj 文件等),然后更改任何using
语句,例如示例:using Oracle.DataAccess.Client
成为using Oracle.ManagedDataAccess.Client
,就是这样!(除非您应该在 ODP.NET 中公开的完整客户端中使用一些更高级的数据库管理功能,非托管,我自己没有做过,所以祝你好运..)。并且还从您的/文件中删除所有那些烦人的assemblyBindingRedirect
节点,并且再也不会为这些垃圾出汗了!app.config
web.config
参考:
故障排除:
该错误通常意味着发现 ODP.NET 正常,但未找到或未安装 Oracle 客户端。当体系结构不匹配(安装了 32 位 Oracle 客户端,但尝试使用 64 位非托管 ODP.NET,反之亦然)时,也会发生这种情况。这也可能是由于权限问题和路径问题以及应用程序域(您的 Web 应用程序或您的 EXE 或其他)无法找到 Oracle DLL 以通过网络实际与 Oracle 通信(ODP.NET Unmanaged DLL 基本上只是挂接到 ADO 之类的包装器)。
我发现这个问题的常见解决方案:
应用程序是 64 位的?
- 安装 64 位 Oracle 客户端(32 位无法使用)
应用程序是 32 位的?
- 安装 32 位 Oracle 客户端(64 位无法使用)
已为正确的体系结构安装了 Oracle 客户端?
- 验证您的环境 PATH 和
ORACLE_HOME
变量,确保可以找到 Oracle(较新的版本可能使用 Registry)
- 验证注册表中的 ORACLE_HOME 和设置(请记住:注册表是 32 位或 64 位的,因此请确保检查与您的应用程序匹配的那个!)
ORACLE_HOME
验证文件夹的权限。如果您不知道它在哪里,请检查注册表。我已经看到 ASP.NET 应用程序工作进程正在使用网络服务用户并且由于某种原因并排安装 32 位和 64 位客户端导致权限从该Authorized Users
组的第一个客户端中删除..修复权限主文件夹解决了这个问题。
- 与往常一样,使用 SysInternals Process Monitor 找出丢失或无法读取的文件非常方便。