C# 通过连接字符串检索正确的 DbConnection 对象

23

我有一个被传递到函数中的连接字符串,需要根据这个字符串创建一个基于DbConnection的对象(例如SQLConnection、OracleConnection、OLEDbConnection等)。

是否有内置的功能或第三方库可以帮助实现此功能。由于我们不一定是在构建这个连接字符串,因此不能依赖于字符串编写格式来确定其类型,而且我更倾向于不必编写所有可能的连接字符串组合和排列。

4个回答

32
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;
}

我也不认为它适用于像OleDb连接字符串这样的情况,例如:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=9cb8a4c4-9661-4c10-a21c-fb4a85ce2471.xlsx;Mode=ReadWrite;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=0;" - Philipp Munin
不会,只有在提供程序指定为“System.Data.OleDb”或连接字符串在配置中指定时,它才会返回OLEDB连接。 - Mark Cidade
1
我觉得这真的很令人惊讶,你不能在没有这种麻烦的情况下使你的代码与数据库无关。 - Mr. Boy

19

如果您正在使用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


1

你应该能够解析出 Provider 部分并将其传递给 DbProviderFactories.GetFactory,它会返回一个 OdbcFactory、OleDbFactory 或 SqlClientFactory,并让你可以执行 CreateConnection 等操作。

我不确定这在 Oracle 上如何实现,除非他们提供一个 OracleDbFactory。


1
大多数连接字符串(至少在.NET 2.0中)还有一个与它们配对的providerName属性。因此,SQL连接字符串将具有类似于以下内容的提供程序名称:
providerName="System.Data.SqlClient"

所以你的方法需要接受连接字符串和提供程序名称,然后你可以使用 DbProviderFactory 如damieng所述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接