使应用程序与多个 ado.net 提供商一起工作的最佳方法是啥?
Posted
技术标签:
【中文标题】使应用程序与多个 ado.net 提供商一起工作的最佳方法是啥?【英文标题】:what is the best approach to make an application to work with multiple ado.net providers?使应用程序与多个 ado.net 提供商一起工作的最佳方法是什么? 【发布时间】:2011-10-10 21:06:46 【问题描述】:我们开发了一组使用 SQL Server 的工业应用程序。
随着需求的扩大,客户希望将我们的应用程序与他们自己的 RDBMS(如 Oracle、mysql 等)一起使用。
目前,一些应用程序使用 OLEDB 提供程序,而其他应用程序出于各种原因使用原生 SQLServer,包括编程经验和宗教信仰。
我们寻求统一的方法。项目经理更喜欢 OLEDB,因为“它适用于所有事物”。就个人而言,我讨厌它,因为查询参数的处理方式......
我有两个解决方案:
第一种是使用 SQLOLEDB 保留现有代码,并使用分支指令在不兼容的情况下调整每个 SQL 语句。它会很快进行,SQL 不会有太大差异,它会取悦项目经理。但是,它可能会将代码变成意大利面条。
第二种方法是为每个 RDBMS 使用本机 ADO.NET 提供程序,并为每个 RDBMS 开发一个数据访问库。每个库可能包含一个公共部分以避免代码重复。当然这需要一些时间,但它会带来干净的架构和最佳的性能。
主要是客户端服务器应用程序。我们数据库的某些部分是动态生成的,并且有很多动态查询。这就是为什么不能使用 ORM 的原因。
您将如何尝试实现相同的目标?
【问题讨论】:
【参考方案1】:我会做以下两件事之一:
使用它们之间的共同特征,在代码中这意味着使用 IDbConnection 等。 在您的应用中,在 DAL 上创建一组接口,然后为每个受支持的数据库实现 DAL。如果您能侥幸逃脱,请走最低公分母路线。但是,听起来您可能需要利用特定于数据库的功能。如果是这样,那么在代码中干净利落地执行此操作的最佳途径是与一组接口而不是特定的 DAL 通信。
只需确保您的接口定义得足够好,以减少以后的更改,并提供足够的开口来支持所有必要的数据库。
这只是让工厂为给定接口提供具体实现的情况。
【讨论】:
【参考方案2】:在您的库中,确保您仅使用 System.Data.Common
命名空间中的基类。
所以,不要使用SqlCommand
,而是使用DbCommand
等。
您可以将实际实现注入 DAL。
public class MyDal
private cmd DbCommand;
public MyDal(DbCommand command)
cmd = command;
或者,编写您自己的抽象(接口/抽象类),为其编写实现类来包装不同的提供者实现并使用它。
【讨论】:
以上是关于使应用程序与多个 ado.net 提供商一起工作的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
带有 OLE DB SQLServer2000 数据源的 ADO.NET 实体框架