我有一个连接字符串被传递给一个函数,我需要基于这个字符串创建一个基于 DbConnection 的对象(即 SQLConnection、OracleConnection、OLEDbConnection 等)。
是否有任何内置功能可以做到这一点,或者有任何第三方库可以提供帮助。我们不一定要构建这个连接字符串,所以我们不能依赖写入字符串的格式来确定它的类型,我宁愿不必编写可能的连接字符串的所有组合和排列
我有一个连接字符串被传递给一个函数,我需要基于这个字符串创建一个基于 DbConnection 的对象(即 SQLConnection、OracleConnection、OLEDbConnection 等)。
是否有任何内置功能可以做到这一点,或者有任何第三方库可以提供帮助。我们不一定要构建这个连接字符串,所以我们不能依赖写入字符串的格式来确定它的类型,我宁愿不必编写可能的连接字符串的所有组合和排列
DbConnection GetConnection(string connStr)
{
string providerName = null;
var csb = new DbConnectionStringBuilder { ConnectionString = connStr };
if (csb.ContainsKey("provider"))
{
providerName = csb["provider"].ToString();
}
else
{
var css = ConfigurationManager
.ConnectionStrings
.Cast<ConnectionStringSettings>()
.FirstOrDefault(x => x.ConnectionString == connStr);
if (css != null) providerName = css.ProviderName;
}
if (providerName != null)
{
var providerExists = DbProviderFactories
.GetFactoryClasses()
.Rows.Cast<DataRow>()
.Any(r => r[2].Equals(providerName));
if (providerExists)
{
var factory = DbProviderFactories.GetFactory(providerName);
var dbConnection = factory.CreateConnection();
dbConnection.ConnectionString = connStr;
return dbConnection;
}
}
return null;
}
如果您使用的是框架 2.0 或更高版本,并且可以让它们通过驱动程序类传入第二个字符串,则可以使用 dbProviderFactory 类为您加载驱动程序。
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;
这是 Factory 类的 MSDN 链接:http: //msdn.microsoft.com/en-us/library/wda6c36e.aspx
您应该能够解析出 Provider 部分并将其传递给 DbProviderFactories.GetFactory,它将返回 OdbcFactory、OleDbFactory 或 SqlClientFactory,然后让您执行 CreateConnection 等。
我不确定这将如何与 Oracle 一起使用,除非他们提供 OracleDbFactory。
大多数连接字符串(至少在 .NET 2.0 中)也有一个 providerName 属性。所以一个 SQL 连接字符串将有一个提供者名称,如:
providerName="System.Data.SqlClient"
因此,您的方法需要同时接受连接字符串和提供者名称,然后您可以使用damieng 提到的 DbProviderFactory。