我有一个使用 Oracle 客户端访问 Oracle 数据库的 .NET 应用程序。
如果有一天我们将数据库从 Oracle 迁移到任何其他关系数据库,我不必被迫更改应用程序中的数据访问代码。
我只想更改一些东西,可能是驱动程序或 DLL,以及连接字符串,以便其余代码从适当的数据库中选择数据。
我怎样才能做到这一点?
我有一个使用 Oracle 客户端访问 Oracle 数据库的 .NET 应用程序。
如果有一天我们将数据库从 Oracle 迁移到任何其他关系数据库,我不必被迫更改应用程序中的数据访问代码。
我只想更改一些东西,可能是驱动程序或 DLL,以及连接字符串,以便其余代码从适当的数据库中选择数据。
我怎样才能做到这一点?
您可以在System.Data.Common
命名空间中找到您需要的内容,并且包含一系列专门为处理此类必需品而设计的类。
那里的类,使用一种称为抽象工厂的设计模式,主要思想是您的连接字符串向抽象工厂提供提供者,即 SQL 客户端或 Oracle 客户端,并且基于该抽象工厂可以创建一个特定的工厂来生成与特定数据库引擎对话的连接。废话不多说,代码如下:
string providerName = ConfigurationManager.ConnectionStrings["DbConn"].ProviderName;
string connectionString = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
您可以在此处阅读更多相关信息。关于您需要的抽象,我建议您执行以下操作,首先实现所有类以访问您的数据模型,然后从这些类中提取接口。
依靠这些接口实现业务层代码,并使用抽象工厂设计模式在幕后创建具体的实现类。
关于抽象工厂,这里有一个很好的答案,看看。还要记住,如果您使用抽象工厂,您可以同时拥有两个世界,也就是说,您可以拥有一个与您的大部分数据库对话的通用提供程序,并且您可以拥有一个专门用于甲骨文。
通用提供者是使用 DbConnection 对象的提供者,这适用于所有数据库。但是有时您可能想要获取特定数据库的最大价值,假设您将系统安装在拓扑中,在某些机器中它有一个专门为您的应用程序提供的 oracle,并且您希望代码在那里非常高效。然后对于该配置,您可以使用特定于 Oracle 的提供程序,抽象工厂的美妙之处在于它们允许您使用具体类型,只要您的上层代码仅通过接口进行对话。
最终,对于抽象工厂,您可以在 web 或 app.config 中进行设置,指示您想要什么模式,例如“Generic”、“OracleSpecific”、“SqlServerSpecific”。这些值只是您可以创建自己的约定。
看看微软的实体框架。这个 ORM 应该能够连接到大多数关系数据库并与之通信。
http://msdn.microsoft.com/en-us/data/ef.aspx
我推荐的书:http: //shop.oreilly.com/product/9780596807252.do http://shop.oreilly.com/product/0636920022220.do
或观看: http ://channel9.msdn.com/Events/TechEd/NorthAmerica/2009/DTL312
ADO .NET 包含一组抽象类和工厂,这意味着只要有 ADO.NET 驱动程序,您就不必考虑要连接的数据库类型
您将需要使用工厂方法来更新您使用的各种类,这样您就不会被绑定到特定的提供者。
更多信息在这篇msdn 文章中
当然,仅仅能够创建连接并针对多种类型的数据库运行查询只是问题的一半。您还需要确保查询本身与您打算使用的任何数据库兼容。
您可以使用主要 SQL 服务器可能理解的 SQL 子集,或者实体框架具有许多从 Linq 生成特定于数据库的 SQL 的提供程序。但这仍然不是万无一失的..您仍然可以编写无法由不支持它们的提供者翻译的查询