如何编写适用于SqlServer和Oracle的.Net应用程序(现在不推荐使用System.Data.OracleClient)

时间:2009-07-28 09:50:14

标签: .net sql-server oracle ado.net odp.net

另见System.Data.OracleClient namespace discontinued?

(首先不要惊慌,System.Data.OracleClient尚未被Microsoft删除,但它不在.net 4的客户端版本中)

使用System.Data.OracleClient however Microsoft has decided to deprecate OracleClient可以实现这一目的。 (OracleClient是Microsoft开发的Oracle ADO.NET提供程序,作为.NET Framework的一部分提供。)

您可以使用ODP.Net,但是您希望您的Sql Server客户必须安装ODP.Net吗? (您希望您的任何客户必须​​安装Oracle软件吗?)

DataDirect不是一种选择,因为它需要一条腿和一条腿;如果您需要将单个服务器连接到大型机,它可能几乎可以负担得起。但是,期望所有客户都不能购买它。

将表单C#移动到Java不是一个好选择,因为我是C#程序员并且希望能够谋生!

与大多数必须支持多个RDBMS的ISV一样,我们只需要一个允许我们使用与SqlServer相同的Oracle小部分的解决方案。因此,System.Data.OracleClient对我们来说足够强大。

(也许我们应该开始将所有数据存储在平面文件中,以便客户的DBA停止尝试告诉我们如何编写软件.Oracle DBA更糟糕!)


我真正的问题是如何编写与Oracle通信的.NET软件,我们可以轻松地安装为与SqlServer对话的.NET软件。不得不使用ODP.NET只会让oracle客户端安装更加痛苦,而且还会出现更多问题。

如果我使用的是JAVA,我可以使用JDBC 4类驱动程序。 Microsoft为SqlServer提供了一个,Oracle为Oracle提供了一个。但是,似乎Oracle希望尽可能地使用.Net,并且微软希望尽可能地使用Oracle。


到目前为止,最佳选项看起来像devArt's dotConnect

然而我开始质疑天气.NET是一个很好的ISV开发系统,迟早你总是得到一个需要oracle支持的客户。在Java世界中,他们似乎已经解决了这个问题。


看起来Oracle可能即将推出一个完全托管的ADO.NET提供商,它甚至可能很容易安装!请参阅声明Beta - 2011,生产 - 2011年底的here

13 个答案:

答案 0 :(得分:6)

编辑:完全托管的ODP.NET现已投入生产。它非常小(小于10MB)并且不依赖于其他文件。你可以在这里获得它:

http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html

原始答案:

轻松确保部署计算机上始终可用的所需Oracle客户端软件(包括ODP.NET)的一种方法是将其嵌入到您的应用程序中。由于XCOPY ODP.NET可用,ODP.NET已经轻松嵌入了 lot 。您可以从以下链接下载:

http://www.oracle.com/technology/software/tech/windows/odpnet/index.html

使用XCOPY ODP.NET,部署应用程序时需要做的就是:

1)将您的应用程序复制到目标计算机

2)运行“install.bat”,将几个Oracle DLL复制到目标机器(包括ODP.NET和Oracle客户端(OCI)软件)

3)运行“configure.bat”,它执行“gacutil”并更新目标机器的注册表

4)为您的应用程序提供连接字符串信息。您可以使用EZCONNECT连接字符串(“hostname @ servicename”),或者您(或您的客户)可以通过将TNS_ADMIN注册表项或环境变量设置为指向已配置sqlnet连接别名的另一个Oracle主目录来共享预先存在的sqlnet配置。 / p>

就是这样!这真的很简单。

我希望您能够在上面的链接中仔细查看ODP.NET XCOPY,亲眼看看现在将ODP.NET与您的应用程序嵌入是多么容易。


附加说明:

如果您选择不在应用程序中嵌入ODP.NET,则无论是Microsoft OracleClient还是ODP.NET,都需要在任何部署计算机上安装其他Oracle客户端(OCI)软件。这两种情况的唯一区别在于,当您使用ODP.NET时,它也需要存在于部署机器上。好消息是客户机器上的典型Oracle安装已经包含ODP.NET。

现在,如果您的目标计算机已经安装了ODP.NET,则无需执行任何其他操作。您只需要分发您的应用程序。如果确实需要使用标准安装程序安装ODP.NET,也可以从上面提供的链接下载它。标准的ODP.NET安装只需几分钟,并为您配置一切。

同样,您可以使用EZConnect连接字符串使网络配置变得轻而易举,或者使用TNS_ADMIN注册表项或环境变量来利用客户已经习惯使用的预先存在的连接别名。

希望这有帮助,

Christian Shay

的Oracle

欢迎在我们的功能请求网站上提供有关此功能和其他未来功能的反馈: http://apex.oracle.com/pls/apex/f?p=18357:46

答案 1 :(得分:5)

您是否查看了devArt's dotConnect等备用Oracle提供商?作为示例,此驱动程序是100%托管代码,支持许多高级Oracle功能,提供实体框架支持(有一天会在ODP.NET中出现,我敢肯定)。

在ODP.NET 11g发布之前,我们还没有获得许多其他功能(如ASP.NET提供程序模型支持)。相当自由的许可和合理的价格。如果我没记错的话,还附带它自己的探查器。

their tests中,与ODP.NET相比,表现良好。我很乐意为您指出一些开源软件,但根据我的经验,一旦您作为数据库购买了Oracle,您已经接受了这样一个事实,即您将为数据库相关工具存入一些现金

答案 2 :(得分:3)

被弃用和被删除之间存在很大差异。

如果您只是使用SQL Server和Oracle共有的功能子集,那么您应该可以很好地转到ASP.Net 4.0并继续编写当前的编程方式。

使用类似EntitySpaces之类的内容,可以让您与提供商无关。 (它在其DAL中使用OracleClient)

完全同意Philippe关于甲骨文客户端软件的痛苦。我已经忘记了我安装它的次数并且讨厌这种体验。优先给我MySQL,SQLServer甚至Access。

(实际上,我收回了Access评论): - )

答案 3 :(得分:3)

使用“提供者工厂模式”,它基本上是使用工厂来提供一个完全抽象的数据提供者,远离使用它的数据库请求方法,这里是blogpost,其中包含示例代码为此,Jean-Paul Boodhoo on Demystifying Design Patterns dnrtv.com上的第1部分也展示了如何做到这一点。

这是一些非常酷的东西,基本上你有一个提供连接方法的工厂

public IDbConnection GetConnection()
{
     IDbConnection connection =  _frameworkDBProviderFactory.CreateConnection();
     connection.ConnectionString = _authenticationSettings.ConnectionString;            
     return connection;
} 

虽然是一个接口,所以你可以调用任何类型的数据库谁的连接对象实现IDbConnection接口(SQLServer,MySQL,Oracle等),它只是工作。

通过抽象出您使用的DB甚至可以在运行时将它们交换出来并且您的应用程序永远不会知道,它不需要连接到Orical DB,下载ODP.NET,同样的事情mysql connector同时实现IDbConnection,并根据抽象连接编写代码。

答案 4 :(得分:2)

除了其他人的建议,你可以考虑使用Provider模式和Oracle的ODP.NET。

答案 5 :(得分:2)

独立于数据库是一项非常艰巨的工作,因为有很多特定的东西(绑定变量命名,对象引用,......)。使用像NHibernate这样的库,它在您的应用程序和真实数据库之间放置一个层。

如果必须连接到两个数据库,那么这是一个部署问题。 如果连接到oracle(使用System.Data.OracleClient或Oracle.DataAccess.Client),则需要在计算机上安装oracle客户端软件。使用框架部署的数据库提供程序不足以连接到oracle数据库。

如果连接到oracle,则必须从oracle安装软件。如果您担心弃用,请安装并使用ODP.Net。 2 oracle数据库提供程序之间有一些differences

为了更好地部署,oracle引入了instant client的概念。可以使用xcopy部署来部署此客户端。正弦oracle 11即时客户端可与ODP.Net捆绑在一起。

ODP.Net的安装在Christian Shay的帖子中描述。

Oracle.DataAccess程序集不能位于全局程序集缓存中。把它放在你的bin目录中。 Oracle.DataAccess使用的即时客户端不得位于客户端计算机上的其他目录中。把它放在你的bin目录中。 documentation描述了如何配置应用程序以查找即时客户端。

答案 6 :(得分:1)

使用ODBC是否可行?

答案 7 :(得分:1)

答案 8 :(得分:1)

只要您不调用ODP.Net对象,如果只访问SQL Server,则无需安装ODP。

答案 9 :(得分:1)

我相信ODBC仍然可以同时使用SQL Server和Oracle,因此我会考虑将ADO.Net与ODBC提供程序一起使用。它不会为您提供SqlClient或OracleClient所具有的所有性能或功能,但它应该非常接近Oracle或SQL Server的相同代码。

答案 10 :(得分:0)

您可以考虑使用SubSonic 3.0!我有它运行我的SQLServer,MySQL和基于SQLite的应用程序,用户可以在运行时在这3个之间切换!

答案 11 :(得分:0)

根据我的经验,您不能简单地部署ODP.NET数据提供程序DLL。 Oracle要求Home安装不是默认配置(例如,我们使用LDAP名称解析,需要在特殊Home路径中使用LDAP.ora文件)。

但是,ODP.NET很好地实现了ADO.NET 2.0标准(DbProviderFactory等)。我已经针对基类(DbConnection,DbCommand等)进行了编程,在我公司的某个时间内没有任何特定的类需要。

我建议让这种数据访问工作是使用/遵循Entlib中的指导或使用NHibernate

如果您在安装ODP.NET或将其发送给客户/客户时遇到物流或IT问题,我建议您与您的IT人员和Oracle讨论解决方案。

答案 12 :(得分:0)

客户应在机器上安装odp.net和Oracle客户端。你不应该部署它。您的应用程序将在GAC中找到所需的Oracle dll。