DbConnection与OleDbConnection对比OdbcConnection

CSh*_*ned 14 .net c# ado.net database-connection

在连接到多个可能的数据源(与数据库无关)方面,C#中每个上述数据库连接方法的主要优点是什么?另外在性能方面可能会提供全面的最佳性能?

最后有什么理由可以避免使用与数据库无关的应用程序的特定方法吗?

我问的原因是因为我的应用程序目前使用Ole而且我在使用工厂连接到某些数据库时遇到了一些问题,因此我正在研究替代方案.我听说Odbc比Ole慢,但是这背后是否有任何真相,它是否真的在真实应用程序中引人注目?

我对此主题感兴趣的原因如下:

我对当前项目的要求表明,我必须有一个工作数据访问层,它能够在不事先了解所述数据库的情况下连接到任何数据库.因此,就连接而言,我无法对任何给定数据库的特定内容进行硬编码.已经使用sql查询工厂类型概念处理了对每个给定数据库运行方言特定语句.绑定变量的替换和格式化也是如此.

更新:目前我现在有一个工作版本的代码,它使用ADO.net和数据库提供程序工厂.这意味着我正在使用Adam Houldsworth建议的基类.提供程序在providerName属性下的连接字符串中指定.连接字符串存储在app.config中,可以通过我的数据库连接类检索它.如果已经安装了正确的驱动程序,如npgsql或Oracle的odac包,那么工厂将正常工作.下面是我的代码示例,显示了使用提供程序工厂的连接对象的基本构造函数.

private readonly DbFactoryBindVariables m_bindVariables;
private readonly DbProviderFactory m_provider;
private string m_connectionString = String.Empty;
private readonly string m_providerName = String.Empty;
private DbConnection m_dbFactoryDatabaseConnection;


/// <summary>
/// Default constructor for DbFactoryDatabaseConnection.
/// </summary>
public DbProviderFactoryConnection()
{
        m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;
        m_provider = DbProviderFactories.GetFactory(m_providerName);

        m_dbFactoryDatabaseConnection = m_provider.CreateConnection();

        m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
        m_dbFactoryDatabaseConnection.ConnectionString = m_connectionString;

        m_bindVariables = new DbFactoryBindVariables(m_dialect.ToLower(), DbFactoryBindSyntaxLoader.Load(this));
}
Run Code Online (Sandbox Code Playgroud)

如果您所选择的.net框架版本的machine.config中尚未包含类似于以下内容的内容,则可能需要将其添加到app.config或web.config中.

<system.data>
    <DbProviderFactories>
       <add name="Npgsql Data Provider" 
        invariant="Npgsql" 
        support="FF" 
        description=".Net Framework Data Provider for Postgresql Server"
        type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral, 
        PublicKeyToken=5d8b90d52f46fda7" />
    </DbProviderFactories>
</system.data>
Run Code Online (Sandbox Code Playgroud)

需要连接字符串:

<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/>
Run Code Online (Sandbox Code Playgroud)

在此阶段,如果在配置应用程序的客户端版本时使用了正确的连接字符串,我现在可以完全与数据库无关.

Ada*_*rth 5

我会避免抽象连接到数据库,因为你总是瞄准最低的公分母.相反,尝试抽象保存实体的要求.然后,该抽象的每个实现都可以是特定于数据库的(基本上是针对接口的编程).

也就是说,我曾经历过一个需要支持多个数据库的实例,这是一项艰难的要求.在这种情况下,所有这些恶化都会进入YAGNI口头禅.

有关将OLE DB与ODBC进行比较的问题通常可在此处找到:

OLE DB和ODBC数据源之间有什么区别?

虽然提前询问性能问题是一件好事,但是在您的应用程序环境中无法回答这个问题.不幸的是,只有对样本数据进行分析才能为您提供所需的答案.

没有太多需要注意的DbConnection,它是其他特定于数据库的连接类的基类.

您是否考虑过像NHibernate这样的ORM或像企业库数据访问应用程序块这样的框架?这些将帮助您抽象数据库(使用ORM,甚至不需要在数据库中进行任何编码).

更新:据我所知,从评论中可以看出,好像你唯一的选择是使用提供的.NET基类(如DbConnection)或接口(IDbConnection).据我所知,没有任何东西可以为您提供连接字符串的正确连接,因此您可能必须对该部分进行编码.这样一来,就可以返回OleDbConnection,OdbcConnection,SqlConnection,当检测到连接字符串,但在代码中使用它们作为等DbConnectionIDbConnection,从而保持你的代码无关的底层数据库.

不理想,但完全可行.