31

另请参阅System.Data.OracleClient 命名空间已终止?

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

通过使用 System.Data.OracleClient 可以实现此用途,但 Microsoft 已决定弃用 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 提供了一种。然而,甲骨文似乎希望尽可能难地使用.Net,而微软希望尽可能地使用甲骨文。


到目前为止,最好的选择看起来像devArt 的 dotConnect

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


看起来 Oracle 可能即将推出一个明智的完全托管的 ADO.NET 提供程序,它自己甚至可能很容易安装!请参阅此处声称 Beta – 2011,生产 – 2011 年底。

4

13 回答 13

6

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

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

原答案:

轻松确保所需的 Oracle 客户端软件(包括 ODP.NET)在部署机器上始终可用的一种方法是将其嵌入到您的应用程序中。由于 XCOPY ODP.NET 可用,ODP.NET 的嵌入变得更加容易。您可以从此链接下载它:

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 配置。

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

我希望您能仔细查看上面链接中的 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 注册表项或环境变量来利用您的客户已经习惯使用的预先存在的连接别名。

希望这可以帮助,

克里斯蒂安·谢伊

甲骨文

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

于 2009-07-30T23:16:38.367 回答
5

您是否查看过像devArt 的 dotConnect这样的替代 Oracle 供应商?例如,该驱动程序是 100% 托管代码,支持许多高级 Oracle 功能,提供实体框架支持(我敢肯定,有一天会在 ODP.NET 中出现)。

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

他们的测试中,性能优于 ODP.NET。我很乐意为您指出一些开源的东西,但是根据我的经验,一旦您购买了 Oracle 作为数据库,您就已经接受了这样一个事实,即您将为与数据库相关的工具投入一些现金.

于 2009-07-28T11:40:35.757 回答
3

被弃用和被删除之间有很大的区别。

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

使用类似EntitySpaces的东西,会让你相对地与提供者无关。(它在 DAL 中使用 OracleClient)

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

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

于 2009-07-28T10:37:52.857 回答
3

使用“提供者工厂模式”,它基本上是使用工厂来提供一个完全从使用它的数据库请求方法中抽象出来的数据提供者,这里是一篇博文,其中包含一些示例代码,也展示了如何做到这一点Jean-Paul Boodhoo on Demystifying Design Patterns Part 1 on dnrtv.com 也展示了如何去做。

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

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

虽然是一个接口,因此您可以调用任何类型的数据库,其连接对象实现了 IDbConnection 接口(SQLServer、MySQL、Oracle 等)并且它可以正常工作。

通过抽象出你使用的数据库,你甚至可以在运行时将它们换掉,你的应用程序永远不会知道,它不需要连接到 Orical DB,下载ODP.NET,同样的事情与mysql 连接器都实现IDbConnection,并针对抽象连接编写代码。

于 2009-07-28T13:06:00.887 回答
2

除了其他人的建议之外,您还可以考虑使用提供者模式和 Oracle 的 ODP.NET。

于 2009-07-28T10:46:45.663 回答
2

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

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

如果连接到 oracle,则必须从 oracle 安装软件。如果您担心弃用,请安装和使用 ODP.Net。2 oracle 数据库提供者之间存在一些差异。

为了更好的部署,oracle 引入了即时客户端的概念。此客户端可以使用 xcopy 部署进行部署。Sine oracle 11 的即时客户端可以与 ODP.Net 捆绑。

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

The Oracle.DataAccess assembly must not be in die global assembly cache. Put it in your bin directory. The instant client used by Oracle.DataAccess must not be in a different directory on your client machine. Put it in your bin directory. The documentation describes how to configure your application to find a instant client.

于 2009-08-06T22:11:25.247 回答
1

两者都使用 ODBC 可行吗?

于 2009-07-28T10:05:37.883 回答
1

人们现在不应该使用ADO.NET Entity Framework吗?请参阅 https://stackoverflow.com/questions/82644/can-you-use-microsoft-entity-framework-with-oracle

于 2009-07-28T10:41:52.287 回答
1

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

于 2009-07-28T11:03:30.683 回答
1

我相信 ODBC 仍然可以在一定程度上透明地使用 SQL Server 和 Oracle,所以我会看看将 ADO.Net 与 ODBC 提供程序一起使用。它不会为您提供 SqlClient 或 OracleClient 将提供的所有性能或功能,但它应该非常接近 Oracle 或 SQL Server 的相同代码。

于 2009-07-28T14:22:33.793 回答
0

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

于 2009-07-28T12:28:31.673 回答
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 讨论解决方案。

于 2009-07-28T13:51:06.693 回答
0

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

于 2009-07-28T14:10:03.907 回答