23

関数に渡される接続文字列があり、この文字列に基づいて DbConnection ベースのオブジェクト (SQLConnection、OracleConnection、OLEDbConnection など) を作成する必要があります。

これを行うための組み込み機能、または支援するサードパーティのライブラリはありますか。必ずしもこの接続文字列を構築しているわけではないため、文字列が書き込まれた形式に依存してその型を判断することはできません。可能な接続文字列のすべての組み合わせと順列をコード化する必要はありません

4

4 に答える 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;
}
于 2008-10-09T01:13:03.357 に答える
19

フレームワーク 2.0 以降を使用していて、ドライバー クラスで 2 番目の文字列を渡すことができる場合は、dbProviderFactory クラスを使用してドライバーをロードできます。

DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;

Factory クラスへの MSDN リンクは次のとおりです: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

于 2008-10-09T00:29:26.470 に答える
1

Provider セクションを解析して、それを DbProviderFactories.GetFactory に渡すと、OdbcFactory、OleDbFactory、または SqlClientFactory が返され、CreateConnection などを実行できるようになります。

OracleDbFactory を提供しない限り、これが Oracle でどのように機能するかはわかりません。

于 2008-10-09T00:28:22.057 に答える
1

ほとんどの接続文字列 (少なくとも .NET 2.0 では) には、それらに対応する providerName プロパティもあります。したがって、SQL 接続文字列には、次のようなプロバイダー名が含まれます。

providerName="System.Data.SqlClient"

したがって、メソッドは接続文字列とプロバイダー名の両方を受け入れる必要があり、damiengが述べたように DbProviderFactory を使用できます。

于 2008-10-09T00:31:00.120 に答える