2010-07-22 49 views
2

我在.Net上使用ODP(使用Oracle.DataAccess dll 10.2编译)连接到Oracle上有一个非常简单的应用程序。 我想在将这个应用程序安装到其他计算机上之前检查“连接先决条件”(应用程序能否连接到数据库)?如何验证ODP和Oracle客户端连接的先决条件

如何检查在目标主机上是否安装了ODP.NET版本10.2或更高版本(注册表检查不适用)?

我知道我可以在注册表中检查ODP条目 - 但这不会检查Oracle客户端和客户端与ODP之间的兼容性。 另外,如果ODP是由ODAC XCopy安装安装的 - 注册表可能不会被新的ODP条目更新。 而且 - 如果我正在计算机上安装,安装了DB,Oracle Client可以不单独安装。

还有一个问题:当我试图从安装中运行“测试连接”方法,该方法使用机器上引用的dll,它只有ODAC(带有ODP)11, - “Oracle.DataAccess.Client.OracleException提供程序与Oracle.DataAccess.Client.OracleInit.Initialize()上的Oracle客户端版本不兼容Oracle.DataAccess.Client.OracleConnection..cctor()时出现的错误消息(ODAC 10.2和11的策略均存在在GAC(程序集)中,指向ODP 2x bin中的Oracle.DataAccess 11)。

那么,如何安装和检查哪些组件以确保适当版本的ODP和Oracle Client已安装并且应用程序将连接?

预先感谢您!

回答

0

您可以使用.Net中的DataProvider Factory Classes。这将显示可用于当前.Net安装/进程的所有数据提供者。我在这里有一篇关于如何做的博文。我把它放在适当的位置,以防止我们的用户使用不受.NET 4.0支持的Oracle版本。

http://blog.tsells.com/2011/05/12/oracle-11g-release-2-and-net-framework-4-0-and-version-checking/

我最近发现甲骨文是不支持与Oracle供应商对于.NET之前11.2.0.2的任何版本的.NET 4.0框架。 (有关更多详细信息,请参阅oracle支持的Oracle Data Provider for .NET(ODP)支持的配置[ID 726240.1])。

由于以前的版本工作(10.2,11.1,11.2.0.1),那么我需要一种方法来防止最终用户使用错误的版本。我搜索了网络,找不到能够做到这一点的人,所以我做了一些挖掘。经过一些测试后,我想出了以下代码。

System.Data.Common.DbProviderFactory factory = 
        System.Data.Common.DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); 

       if (factory == null) 
        return false; 

       Type t = factory.GetType(); 

       int majorversion = t.Assembly.GetName().Version.Major; 

       // Do not allow any major versions less than 4 
       if (majorversion < 4) 
        return false; 

此代码将使用与您正在使用的.net框架版本一起注册的相同数据提供程序。这可以确保您在环境中不会出现问题,并且可以检查已安装的dll版本。对于这个例子 - 我只是检查ODP是4.0还是更高(第一版odp for .net 4)。

+0

发生了什么事你的帖子? – Michael 2015-01-21 17:14:35

+0

我更新了链接,并在我的答案中包含了代码。 – tsells 2015-01-21 20:48:51