在C#中,上述每种数据库连接方法在连接到多个可能的数据源(与数据库无关)方面的主要优点是什么?另外,在性能方面,哪一个可能提供最好的整体表现?
最后,对于数据库不可知论的应用程序,有什么理由避免使用特定的方法吗?
我之所以问这个问题,是因为我的应用程序目前使用Ole,并且我在使用工厂连接到某些数据库时遇到了一些问题,因此我正在研究其他方法。我听说Odbc比Ole慢,但这背后有什么事实吗?在现实世界的应用程序中,它真的很明显吗?
我对这个问题感兴趣的原因如下:
我对当前项目的要求是,我必须有一个工作数据访问层,该层能够连接到任何数据库,而无需事先了解所述数据库。因此,我不能硬编码任何特定于任何给定数据库的连接。使用sql查询工厂类型概念处理了在每个给定数据库上运行方言特定语句。绑定变量的替换和格式化也是如此。
更新:,现在我的代码有一个工作版本,它使用ADO.net和数据库提供程序工厂。这意味着我正在使用建议的基类。提供程序在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));
}如果所选的app.config或web.config框架版本在machine.config中尚未出现类似的内容,则可能需要将类似的内容添加到.net或.net中。
<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;"/>在这个阶段,只要在配置应用程序的客户端版本时使用正确的连接字符串,我现在可以完全不知道数据库。
发布于 2012-04-11 08:03:34
我将避免抽象到数据库的连接,因为您总是以最低的公分母为目标。相反,尝试抽象保存实体的需求。然后,该抽象的每个实现都可以是特定于数据库的(基本上,针对接口进行编程)。
尽管如此,我从来没有经历过需要支持多个数据库是一个困难的例子。在这种情况下,所有这些恶化都会出现在YAGNI咒语中。
关于将OLE DB与ODBC进行比较的问题通常可以在这里找到:
尽管提前问性能问题是件好事,但在应用程序的上下文中不能回答这个问题。不幸的是,只有根据样本数据对两者进行分析,才能给出所需的答案。
关于DbConnection没有太多值得注意的地方,它是其他特定于数据库的连接类的基类。
您考虑过像NHibernate这样的ORM或者像企业图书馆数据访问应用程序块这样的框架吗?这些将帮助您抽象数据库(使用ORMs,您甚至不需要在数据库中进行任何编码)。
更新:就我从注释中可以看出的情况而言,似乎您唯一的选择是使用提供的.NET基类(如DbConnection)或接口(IDbConnection)。据我所知,没有任何东西可以为连接字符串提供正确的连接,因此您可能必须对该部分进行编码。这样,您可以在检测到连接字符串时返回OleDbConnection、OdbcConnection、SqlConnection等,但在代码中使用它们作为DbConnection或IDbConnection,从而使您的代码与底层数据库无关。
不理想,但完全可行。
发布于 2012-04-11 08:17:07
如果您需要一个不可知的数据访问层,而不需要对数据访问进行多次编码,那么使用DbProviderFactory是一个很好的选择。
我看不出有什么理由要避免这种情况,所有必要的功能都是使用System.Data.Common上的基类实现的。
我们在Nearforums上使用不可知的数据访问,因为我们同时提供Server和MySql db脚本。关于性能,它取决于特定的连接器(Oracle、MySql、PostgreSQL、.)不同公司/社区交付的实现。大多数已知的连接器在几年内都经过了适当的测试。
https://stackoverflow.com/questions/10102008
复制相似问题