C#接続文字列による正しいDbConnectionオブジェクトの取得
-
06-07-2019 - |
質問
関数に渡される接続文字列があり、この文字列に基づいて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以上を使用していて、ドライバークラスで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
Providerセクションを解析し、DbProviderFactories.GetFactoryに渡して、OdbcFactory、OleDbFactory、またはSqlClientFactoryを返し、CreateConnectionなどを実行できるようにする必要があります。
OracleDbFactoryを提供しない限り、Oracleでこれがどのように機能するかわかりません。
ほとんどの接続文字列(少なくとも.NET 2.0では)には、それらに付随するproviderNameプロパティもあります。したがって、SQL接続文字列には次のようなプロバイダー名があります。
providerName="System.Data.SqlClient"
したがって、メソッドは接続文字列とプロバイダー名の両方を受け入れる必要があり、DbProviderFactory damiengによる言及。