IdbConnection与SqlConnection

时间:2008-12-08 19:38:04

标签: .net design-decisions vendor-neutrality

当我编写应用程序时,我使用System.Data接口(IDbConnection,IDbCommand,IDataReader,IDbDataParameter等...)。我这样做是为了减少供应商的依赖性。除非,我正在做一个简单的测试应用程序,在咨询时这似乎是道德的事情。

但是,我看到的所有代码似乎都使用System.Data.SqlClient命名空间类或其他特定于供应商的类。在杂志和书籍中,很容易将其归结为微软的影响力以及他们的营销转向仅针对SQLServer进行编程。但它看起来像我看到的几乎所有.NET代码都使用SQLServer特定的类。

我意识到供应商特定的类具有更多功能,例如向SqlCommand对象添加参数是一种方法,其中将其添加到IDbCommand是令人恼火的4+行代码。但话又说回来;为这些限制编写一个小助手类非常简单。

我还想知道当SQLServer是当前目标客户端时是否对接口进行编程是否过度工程,因为它不是立即需要的。但我不认为这是因为针对接口编程的成本太低,因为减少供应商依赖性会带来如此巨大的好处。

您是否使用供应商特定的数据类或接口?

编辑:总结下面的一些答案,并在阅读时提出一些想法。

使用接口实现供应商中立的可能陷阱:

  • 嵌入的供应商特定关键字 你的SELECT语句(我所有的ins, 更新,& del是在procs中,所以那是 不是问题)
  • 直接绑定 数据库可能会导致 的问题。
  • 除非你的联系     实例化是集中的,     供应商特定类需要     无论如何都要打电话。

使用接口的正面理由:

  • 根据我的经验,能力(甚至     如果没有行使)转移到     不同的供应商一直都是     受到客户的赞赏。
  • 在可重用代码库中使用接口

6 个答案:

答案 0 :(得分:4)

要考虑的一件事是您切换数据库的实际机会。在大多数情况下,这绝不会发生。即使它确实如此,即使您使用数据库中立的类,它也将是一个重大的重写。在这种情况下,最好使用功能更丰富的功能,并帮助您更快地完成项目。

话虽如此,我认为在大多数情况下,您应该使用自己创建的图层,在实际的.Net API之上,这样如果您必须更改必须使用的类,那么它将不会这么多问题。即使您停留在同一个数据库中,也永远不知道何时需要切换访问数据库的方式。从ASP迁移到ASP.Net(ADODB与ADO.Net)的任何人都可以告诉你这是多么痛苦。

所以我认为最好的解决方案是使用功能更丰富的特定于数据库的API,并在其上构建自己的层,以便在必要时可以轻松地将其交换出来。

答案 1 :(得分:3)

根据您正在与之交谈的数据库引擎的类型,您必须为这些类提供不同的SQL,因此即使您设法编写所有代码以使用接口,您仍然需要编写多组SQL。

或者,你可以做我们已经完成的工作,编写我们自己的图层来处理我们使用的所有语法,这不是不同引擎提供的所有语法,但足以管理编写一个获得的SQL在执行之前正确地重写。

基本上我们已经创建了一个函数语法,其中我们使用SQL::为函数的名称添加前缀,这使我们的代码能够识别需要重写的特殊函数。然后将这些解析出来并正确地重写,甚至可以在必要时交换参数顺序。

可以完成返回当前服务器日期和时间的函数名称之类的小事,但也可以做更大的事情,比如如何选择查询的前N行。

此外,SQL Server的参数写为@name,其中OleDb使用位置(只需在参数中添加?),我们的代码也会处理这些差异。

在我们不需要担心需要编写的SQL的意义上,它会得到回报。

答案 2 :(得分:2)

我写的是类似于lassevk所说的东西,但他打败了我。

此外,您必须在某个时候与真实数据库交谈。您可以通过界面代码将大部分数据访问包装起来,这是一个好主意。但最终如果您使用的是SQL Server,则需要创建SqlClient.SqlConnection的实际实例。对于Access,Oracle或MySQL也是如此。

答案 3 :(得分:1)

我使用特定于供应商的类,我正在进行直接数据库工作(除非我被告知可能最终使用不同的数据库 - 已发生的次数:一次)。

但是,如果我最终将一些非db特定代码分解为单独的类,我将经常制作方法参数接口 - 特别是如果我认为它在其他项目中有用,并且我不依赖于任何直接访问类的具体功能。

基本上,用爱因斯坦的话来说:让解决方案尽可能简单,但并不简单。

答案 4 :(得分:1)

您应该尝试编写与代码数据库无关的代码。也许你现在没有发现它有用,但你将来可能会利用它。

答案 5 :(得分:0)

查看Microsoft的模式和实践组的企业库。 他们在那里的数据访问代码显示了一些提供者独立性的良好实现。

http://msdn.microsoft.com/en-us/library/cc467894.aspx