1

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

我该如何构建这个?我正在使用存储库模式,并且有一个CarRepository类和一个Car类。该类CarRepository负责从数据库中保存、删除和加载。

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

我想要一种方法,可以让我的应用程序在两个平台上都运行。

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

欢迎任何建议

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

4

3 回答 3

2

我遵循的方法是首先使用 ADO 提供者工厂来抽象数据访问实现。所以我会IDbConnection在代码中使用等等。

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

编写这个“管道”需要做大量的工作,而且我还没有遇到过需要不同平台的情况,所以我没有费心编写一些我知道需要解决的小问题,但欢迎您联系如果您有兴趣查看一些代码。

于 2012-05-02T08:47:08.600 回答
0

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

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

但这是在我看到NHibernate的光芒之前的方式!

于 2012-05-02T08:38:20.553 回答
0

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

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

于 2012-05-02T08:51:30.753 回答