使应用程序与多个ado.net提供程序一起使用的最佳方法是什么?

时间:2011-07-22 08:36:34

标签: database architecture ado.net oledb data-access-layer

我们开发了一组使用SQL Server的工业应用程序。

随着需求的扩大,客户希望将我们的应用程序与他们自己的RDBMS一起使用,例如Oracle,MySQL等。

目前,一些应用程序使用OLEDB提供程序,而其他应用程序使用本机SQLServer有各种原因,包括编程经验和宗教信仰。

我们寻求统一的方法。项目经理更喜欢OLEDB,因为“它适用于所有东西。”就个人而言,我讨厌它,因为如何处理查询参数......

我有两个解决方案:

第一种方法是使用SQLOLEDB保留现有代码,并通过使用分支指令在不兼容的情况下调整每个SQL语句。它会很快,SQL不会有太大差异,它会让项目经理满意。但是,它可能会将代码变成意大利面。

第二种方法是为每个RDBMS使用本机ADO.NET提供程序,并为每个RDBMS开发数据访问库。每个库可能包含一个公共部分,以避免代码重复。当然需要一些时间,但它会带来清洁的架构和最佳的性能。

主要是客户端服务器应用程序。我们数据库的某些部分是动态生成的,并且有很多动态查询。这就是为什么不能使用ORM的原因。

你将如何实现同样的目标?

2 个答案:

答案 0 :(得分:2)

在您的库中,确保您只使用System.Data.Common命名空间中的基类。

因此,使用SqlCommand

来代替DbCommand

您可以将实际实现注入DAL。

public class MyDal
{
  private cmd DbCommand;

  public MyDal(DbCommand command)
  {
      cmd = command;
  }
}

或者,编写自己的抽象(接口/抽象类),为它编写实现类,包装不同的提供程序实现并使用它。

答案 1 :(得分:2)

我会做两件事之一:

  • 使用它们之间的共同功能,在代码中这将意味着使用IDbConnection等。
  • 在您的应用中,在DAL上创建一组接口,然后为每个支持的数据库设置DAL实现。

如果你可以逃脱它,那就去最低公分母路线吧。但是,听起来您可能需要利用特定于数据库的功能。如果是这样,那么在代码中干净地执行此操作的最佳途径是与一组接口而不是特定DAL进行通信。

只需确保您的界面已经足够好定义,以便以后减少更改,并提供足够的空间来支持所有必要的数据库。

这只是一个工厂为给定接口提供具体实现的情况。