为啥不用 DbConnection 而不是 SqlConnection 或 OracleConnection?

Posted

技术标签:

【中文标题】为啥不用 DbConnection 而不是 SqlConnection 或 OracleConnection?【英文标题】:Why not DbConnection instead of SqlConnection or OracleConnection?为什么不用 DbConnection 而不是 SqlConnection 或 OracleConnection? 【发布时间】:2011-07-14 01:40:26 【问题描述】:

我是一个 Java 翻新者,对 C# 很陌生。我希望在接下来的几周内编写出一堆 DML 代码时不会遇到麻烦。

我习惯于使用 JDBC 的抽象类,如 Connection、Statement 等。 C# 在 System.Data.Common 命名空间中提供了类似的抽象类,如 DbConnection、DbCommand 等。

但是,我在 MS 文档和其他书籍中看到的大多数示例都使用具体类:SqlConnection、OracleCommand 等。这种具体性甚至出现在 mysql 文档中。

这方面的最佳做法是什么?是否有充分的理由为此目的选择具体的表服务器特定而不是抽象类? (当然,我知道将抽象转换为具体的危险)。

【问题讨论】:

【参考方案1】:

一般来说,当您知道您的公司或您正在使用什么数据库时,您就可以定位到该特定的数据库类型。如果你知道它的Oracle,那么你使用Oracle相关的类,如果它的SQLClient,那么你使用SqlClient等等。

现在,如果您不确定它是哪种类型,那么您将寻求通用/通用形式的引用,这样您就可以实现您的目标而不必担心数据库类型。反之亦然,编写一堆条件语句来检查数据库的类型,然后根据它执行操作。

帮助您理解的一个常见场景是:如果您正在编写代码,以便您的最终用户可以更改配置文件并输入连接字符串以连接到数据库,您会使用哪个提供?这是 DbFactory 及其相关类派上用场的地方,您无需编写代码块,而是利用泛型类(我猜是这样)来处理所有事情。

请记住,如果确实针对特定的提供者,您将获得更好的性能(因为 DbFactory 必须在处理之前在内部解析您的提供者),但如果您不确定最终用户提供者,那么您的代码将是大而且效率不高。

谈到您的另一个问题:抽象还是具体。它取决于你,它基于场景。 abstract 的优点是,您可以根据规则(如接口)强制/绑定客户端,也可以概括事物以及利用类型转换(类似于具体类)来访问子类方法来做某事(检查如果可以的话,关于这个话题。使用运行时多态性,您可以使用一个对象并调用一个方法,该方法在该父类的子类的不同类中具有不同的实现,您无需担心 - 例如感兴趣的计算可能是银行的单利和复利,它们是由各自的班级计算的——但你不关心它,因为你只是说——GetInterest() 和繁荣!)。

将两者结合在一起,我会说,在您不知道最终用户使用的数据库类型并且不知道连接字符串的情况下,您可能希望强制最终用户实现您的类 IMPLEMENT您的抽象方法来初始化连接字符串,然后执行必要的操作以提供输出。

希望对你有帮助。

【讨论】:

【参考方案2】:

抽象类不是框架的第一个版本的一部分,它们是在 2.0 版中引入的。很多例子都是在那之前写的,或者是基于之前写的例子。

使用具体或抽象类主要是个人喜好问题。编写可以与任何数据库一起使用的代码是一个好主意,但我的经验是,您不会经常切换数据库系统,如果您这样做,那么您需要进行的更改太多,这并不重要是否使用了抽象类。

【讨论】:

【参考方案3】:

大多数特定于数据库的 ADO.NET 类都有额外的重载和/或特定于该数据库驱动程序的方法和属性。

使用 SqlConnection 和 OracleConnection 等具体类可以更轻松地访问特定于驱动程序的功能。

【讨论】:

以上是关于为啥不用 DbConnection 而不是 SqlConnection 或 OracleConnection?的主要内容,如果未能解决你的问题,请参考以下文章

markdown [DbConnection]常用数据库连接字符串#sql

为啥在 SQL 中使用表值函数而不是临时表?

为啥使用 DataSource 而不是 XADataSource?

为啥我可以使用 tsql 而不是 pymssql 连接到 Azure MS SQL?

为啥当 WHERE 子句包含参数化值时 SQL Server 使用索引扫描而不是索引查找

为啥 SQL 服务器在我的表中插入 0 值而不是使用函数的正确值