在连接到多个可能的数据源(与数据库无关)方面,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;"/>
在这个阶段,如果在配置应用程序的客户端版本时使用了正确的连接字符串,我现在可以完全与数据库无关。