12

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

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

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

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

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

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

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

  • 嵌入在您的 SELECT 语句中的供应商特定关键字(我所有的 ins、upd 和 del 都在 procs 中,所以这不是问题)
  • 直接绑定数据库可能会导致问题。
  • 除非您的连接实例化是集中式的,否则无论如何都需要调用供应商特定的类。

使用接口的积极原因:

  • 根据我的经验,客户一直很欣赏转移到不同供应商的能力(即使没有行使)。
  • 在可重用代码库中使用接口
4

6 回答 6

5

要考虑的一件事是您切换数据库的实际机会。在大多数情况下,这永远不会发生。即便如此,这也将是一次重大的重写,即使您使用与数据库无关的类。在这种情况下,最好使用功能更丰富且能帮助您更快完成项目的那个。

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

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

于 2008-12-08T19:44:38.050 回答
3

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

或者,您可以像我们所做的那样,编写我们自己的层来处理我们使用的所有语法,这不是不同引擎提供的所有语法,但足以设法编写一个之前正确重写的 SQL执行。

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

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

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

从某种意义上说,我们不太担心需要编写的 SQL 是有回报的。

于 2008-12-08T19:42:51.160 回答
2

我正在写一些类似于 lassevk 所说的东西,但他打败了我。

此外,您必须在某个时候与真实的数据库交谈。您也许可以不用接口代码来包装大部分数据访问,这是个好主意。但最终,如果您使用的是 SQL Server,您将希望创建一个真实的 SqlClient.SqlConnection 实例。Access、Oracle 或 MySQL 也是如此。

于 2008-12-08T19:46:45.660 回答
2

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

于 2008-12-08T19:50:24.327 回答
1

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

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

基本上,套用爱因斯坦的话说:使解决方案尽可能简单,但不要更简单。

于 2008-12-08T19:41:22.037 回答
0

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

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

于 2009-02-18T14:39:08.553 回答