我看过一些帖子说 Oracle 11g 客户端(适用于 Windows)适用于最高 9.2 的数据库。但是如果客户端有时连接到 11g 有时连接到 10g 数据库,它仍然工作吗?我的问题是:连接到 10g 和 11g 数据库时有什么不同的配置吗?
有些人告诉我有关 GAC 的政策。
谢谢 !
我看过一些帖子说 Oracle 11g 客户端(适用于 Windows)适用于最高 9.2 的数据库。但是如果客户端有时连接到 11g 有时连接到 10g 数据库,它仍然工作吗?我的问题是:连接到 10g 和 11g 数据库时有什么不同的配置吗?
有些人告诉我有关 GAC 的政策。
谢谢 !
使用较新的客户端驱动程序连接到较旧的 Oracle 数据库通常没有问题,例如使用 12g 客户端连接到 10g 或 11g 数据库。其余的答案属于在执行程序的计算机上(可能)已经安装了 Oracle 客户端的情况下,可能在您的 .Net 程序中出现的技术问题。
2014 年更新:
与此同时,Oracle 发布了一个用于 Oracle 数据库的托管 .Net 驱动程序。因此,与其安装本地 Oracle 客户端或随应用一起交付 Instant Client,不如只交付托管驱动程序而不依赖于本地配置。那么安装客户端、GAC、Oracle 数据库版本等就没有问题了。您可以从Oracle 网站下载托管驱动程序。
如果您不能使用托管驱动程序,仍然需要以前的答案:
如果您不知道您的客户端工作站上是否安装了 Oracle 客户端,就会出现问题。如果您谈论的是 GAC ,我假设您不知道是否安装了 Oracle 客户端,如果安装了,它是哪个版本。
如果您不想依赖已安装的 Oracle 客户端,您可以在 .Net 应用程序中提供一个 Oracle Instant Client。例如,您可以使用 Oracle Developer Tools for Visual Studio 下载 ODAC 11.2 Release 4 (11.2.0.3.0),它为您的开发人员工作站提供 Oracle 客户端安装(Visual Studio 支持 DataSet 开发和 EntityFramework)以及所有即时客户端所需的文件。
对于即时客户端,您需要以下文件(在 ODAC 安装的子文件夹中搜索它们):
此外,还需要 Windows 目录中的以下 .dll 文件:
只需将所有文件复制到应用程序的工作目录(.exe 文件所在的位置)。
现在,它属于 GAC 吗?
如果在客户端计算机上安装了 Oracle 客户端,则 GAC 中还有一个Oracle.DataAccess.dll。也有可能安装了一个策略,它声明如下:与您的程序引用的Oracle.DataAccess.dll无关,应始终使用GAC中的Oracle.DataAccess.dll版本。如果您安装我上面链接的 ODAC,您会在下面找到该文件
C:\Windows\Microsoft.NET\assembly\GAC_32\Policy.4.112.Oracle.DataAccess\v4.0_4.112.3.0__89b483f429c47342
结果是,如果您尝试加载 Oracle.DataAccess.dll(带有“提供程序不兼容...”之类的错误消息),如果客户端计算机具有另一个版本的安装的 Oracle Client 11 比您在应用程序中引用的那个多。
为了解决这个问题,您可以配置您的 app.conf 以便忽略发布者策略并始终加载您的版本:
<configuration>
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" />
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
使用 JAVA 或 .Net 执行此操作没有任何问题。事实上,甲骨文说这完全没问题:
该版本包含 Oracle 数据库客户端 11.2.0.3,它可以访问 Oracle 数据库 9.2 及更高版本。Oracle 通过 Microsoft Visual Studio 2010 和 .NET Framework 4(包括 Entity Framework 4.1 和 4.2)支持 Entity Framework 和 LINQ。此版本不支持 Code First。
显然,您希望在连接到每个流程时测试相同的流程并通过您自己的测试进行验证,但我认为您会没事的。