首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DbConnection对OleDbConnection对OdbcConnection

DbConnection对OleDbConnection对OdbcConnection
EN

Stack Overflow用户
提问于 2012-04-11 07:56:26
回答 2查看 8.5K关注 0票数 16

在C#中,上述每种数据库连接方法在连接到多个可能的数据源(与数据库无关)方面的主要优点是什么?另外,在性能方面,哪一个可能提供最好的整体表现?

最后,对于数据库不可知论的应用程序,有什么理由避免使用特定的方法吗?

我之所以问这个问题,是因为我的应用程序目前使用Ole,并且我在使用工厂连接到某些数据库时遇到了一些问题,因此我正在研究其他方法。我听说Odbc比Ole慢,但这背后有什么事实吗?在现实世界的应用程序中,它真的很明显吗?

我对这个问题感兴趣的原因如下:

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

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

代码语言:javascript
复制
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));
}

如果所选的app.config或web.config框架版本在machine.config中尚未出现类似的内容,则可能需要将类似的内容添加到.net或.net中。

代码语言:javascript
复制
<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>

所需连接字符串:

代码语言:javascript
复制
<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/>

在这个阶段,只要在配置应用程序的客户端版本时使用正确的连接字符串,我现在可以完全不知道数据库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 08:03:34

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

尽管如此,我从来没有经历过需要支持多个数据库是一个困难的例子。在这种情况下,所有这些恶化都会出现在YAGNI咒语中。

关于将OLE DB与ODBC进行比较的问题通常可以在这里找到:

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

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

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

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

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

不理想,但完全可行。

票数 6
EN

Stack Overflow用户

发布于 2012-04-11 08:17:07

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

我看不出有什么理由要避免这种情况,所有必要的功能都是使用System.Data.Common上的基类实现的。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10102008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档