C# で DataProvider のリストの中身を確認する
下記の実装のように DB 非依存にするために DataProvider のリストから Invariant Name を取得して指定した DB に接続する事がありますが、どのような内容が取得されているのか意識していなかったので内容を確認しました。
// 接続文字列
string connectionString = @"Server=X.X.X.X/test; User ID=YYYY; Password=ZZZZ";
// DB ファクトリクラス情報の一覧を取得する
DataTable factoryClasses = DbProviderFactories.GetFactoryClasses();
// DB ファクトリクラス情報の一覧の中から Oracle 用のファクトリクラスの一意名を取得する
string providerInvaliantName =
factoryClasses.Rows
.Cast<DataRow>()
.Where(row => row["InvariantName"].ToString().Contains("System.Data.OracleClient"))
.Select(row => row["InvariantName"].ToString())
.FirstOrDefault();
if (string.IsNullOrEmpty(providerInvaliantName))
{
System.Console.WriteLine("No Data Provider matched.");
return;
}
// DB ファクトリのインスタンスを取得する (DB 非依存)
DbProviderFactory dbFactory = DbProviderFactories.GetFactory( providerInvaliantName);
// ファクトリによる Connection 等の作成を行う
IDbConnection dbConn = dbFactory.CreateConnection();
dbConn.ConnectionString = connectionString;
dbConn.Open();
// 各処理
// ...
// ...
// ...
dbConn.Close();
取得した DB ファクトリクラス情報の一覧の一部
上記の画像は実施した環境での factoryClasses.Rows
の内容をダンプしたものです。
InvariantName 列の中に System.Data.OracleClient
が見つかり、実際にこちらの文字列が取得されます。