15

在连接到多个可能的数据源(与数据库无关)方面,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));
}

如果您选择的 .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>

需要连接字符串:

<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/>

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

4

2 回答 2

5

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

也就是说,我从未遇到过需要支持多个数据库是一项硬性要求的情况。在这种情况下,所有这些恶化都进入了 YAGNI 的口头禅。

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

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

尽管提前询问性能问题是一件好事,但无法在您的应用程序上下文中回答这个问题。不幸的是,只有根据样本数据对两者进行分析才能为您提供所需的答案。

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

您是否考虑过像 NHibernate 这样的 ORM 或像Enterprise Library Data Access Application Block这样的框架?这些将帮助您抽象数据库(使用 ORM,您甚至不需要在数据库中进行任何编码)。

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

不理想,但完全可行。

于 2012-04-11T08:03:34.363 回答
3

DbProviderFactory如果您需要一个不可知的数据访问层,而无需对数据访问进行多次编码,则使用是一个不错的选择。

我看不出有任何理由要避免它,并且所有必要的功能都使用System.Data.Common.

我们在Nearforums上使用不可知的数据访问,因为我们提供 SQL Server 和 MySql db 脚本。关于性能,它取决于不同公司/社区提供的特定连接器(Oracle、MySql、PostgreSQL...)实现。大多数已知的连接器都经过了几年的适当测试。

于 2012-04-11T08:17:07.070 回答