我有一个被传递到函数中的连接字符串,需要根据这个字符串创建一个基于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。
providerName="System.Data.SqlClient"
所以你的方法需要接受连接字符串和提供程序名称,然后你可以使用 DbProviderFactory 如damieng所述。