我有一个使用Oracle客户端访问Oracle数据库的.NET应用程序。
如果有一天我们将数据库从Oracle迁移到任何其他关系数据库,我不必被迫更改我的应用程序中的数据访问代码。
我想改变一些东西,可能是一个驱动程序或DLL,以及连接字符串,以便其余代码从适当的数据库中选择数据。
我该怎么做?
答案 0 :(得分:0)
了解微软的实体框架。该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
答案 1 :(得分:0)
ADO .NET包含一组抽象类和工厂,这意味着只要有ADO.NET驱动程序,您就不必考虑要连接的数据库类型
您需要使用工厂方法来新建您使用的各种类,这样您就不会与特定的提供商绑定。
更多信息请参见此msdn article
当然,只是能够创建与多种类型数据库的连接并运行查询只是问题的一半。您还需要确保查询本身与您打算使用的任何数据库兼容。
您可以使用主要SQL服务器可能理解的SQL子集,或者实体框架具有许多从Linq生成特定于数据库的SQL的提供程序。尽管如此,这仍然不是万无一失的..你仍然可以编写那些不能由不支持他们的提供商翻译的查询
答案 2 :(得分:0)
您需要的内容可以在System.Data.Common
命名空间中找到,并且包含一系列专门用于处理这种必要条件的类。
那里的类,使用名为Abstract Factory的设计模式,主要思想是你的连接字符串向抽象工厂提供提供者,即SQL Client或Oracle Client,并且基于该抽象工厂可以创建一个特定的工厂生成连接以与特定数据库引擎通信。说够了,这就是代码:
string providerName = ConfigurationManager.ConnectionStrings["DbConn"].ProviderName;
string connectionString = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString;
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
您可以阅读有关here的更多信息。 关于您需要的抽象,我建议您执行以下操作,首先实现所有类以访问您的数据模型,然后从这些类中提取接口。
实现依赖于这些接口的业务层代码,并使用抽象工厂设计模式在幕后创建具体的实现类。
关于抽象工厂,SO中有一个很好的答案here,请看一看。 还要记住,如果你使用抽象工厂,你可以拥有这两个世界,也就是说,你可以拥有一个与大多数数据库对话的通用提供者,你可以拥有一个特定的甲骨文。
泛型提供程序是使用DbConnection对象的提供程序,适用于所有数据库。但有时你可能想要占用特定数据库的大部分价值,想象一下你在一个拓扑中安装系统,在某些机器中它只为你的应用程序提供专用的oracle,并且你希望代码在那里非常高效。然后,对于该配置,您可以使用特定于Oracle的提供程序,抽象工厂的优点在于它们允许您使用具体类型,只要您的上层代码只是通过接口进行通信。
最终,对于抽象工厂,您可以在web或app.config中设置一个设置,指示您想要的模式,例如“Generic”,“OracleSpecific”,“SqlServerSpecific”。这个值只是您可以创建自己的约定。