如何为SQL Server和MySql创建数据访问层

时间:2012-05-02 08:23:24

标签: c# mysql sql-server architecture

我正在构建数据访问层,需要能够在不同环境中的两个提供程序之间切换。

我如何构建这个?我正在使用存储库模式,例如CarRepository班级和Car班级。 CarRepository类负责从数据库中保存,删除和加载。

我有一个Database类,负责连接数据库,并执行查询(为SQL Server发送SqlCommand)。底层数据库的SQL语法不同,参数语法也不同(SQL Server使用@而MySql使用?)。

我想要一种方法,我可以尽最大努力使我的应用程序在两个平台上运行。

显而易见的方法是制作MySqlCarRepositorySqlServerCarRepository,但这会带来大量的维护。这种情况有什么好的方法吗?也许保持一个静态类与静态字符串包含不同SQL风格的SQL语句? (那么参数语法怎么样?)

欢迎任何建议

(请注意ORM(Nhibernate,Linq2Sql等)不是一个选项)

3 个答案:

答案 0 :(得分:2)

我遵循的方法首先是使用ADO Provider Factories来抽象数据访问实现。所以我将在代码中使用IDbConnection等等。

然后我有一个查询的抽象。然后我可以使用包含实际sql语句的Query个对象。这些Query对象是从RawQuery或各种查询构建器(插入/更新/删除/等)创建的,这些构建器具有每种提供程序类型的实现。特定的原始查询需要根据您需要的DB进行编码和获取,因为没有通过该文件。

编码这个'管道'涉及到相当多的腿部工作,我没有遇到过我实际需要不同平台的情况,所以我没有打扰编码一些我知道需要熨烫的小块但你是如果您有兴趣查看一些代码,欢迎联系。

答案 1 :(得分:0)

您可以使用任何代码生成工具吗?

我曾经在另一个生活中使用 Code Smith ,并且拥有可以从DB表生成POCO对象的模板,每个对象和存储过程的存储库类。在对模板进行微调之后工作正常,网上有很多例子。

但在我看到 NHibernate 的灯光之前,这已经过了!

答案 2 :(得分:0)

用于访问多种数据库类型的模式是DAO(数据访问对象)模式。如果您不能/不使用ORM,这可能适合您的特殊需求。下面的文章解释了Java的模式,但它仍然与C#非常相关:

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html