データをデータベースから別のデータベースに変換する「汎用」プログラムを作成しました。構成ファイルを使用して変換を定義します。次のようなコードを使用します。
static DbProviderFactory _srcProvFactory;
static DbProviderFactory _trgtProvFactory;
public static bool DoConversions()
{
try
{
if (!InitConfig())
return false;
_srcProvFactory = DbProviderFactories.GetFactory(GetConnectionClassTypeByDatabaseType(Preferences.SourceDatabaseType));
_trgtProvFactory = DbProviderFactories.GetFactory(GetConnectionClassTypeByDatabaseType(Preferences.TargetDatabaseType));
using (DbConnection srcCnctn = _srcProvFactory.CreateConnection(),
trgtCnctn = _trgtProvFactory.CreateConnection())
{
srcCnctn.ConnectionString = Preferences.SourceConnectionString;
srcCnctn.Open();
trgtCnctn.ConnectionString = Preferences.TargetConnectionString;
trgtCnctn.Open();
//DO STUFF
}
}
}
上記の GetConnectionClassTypeByDatabaseType メソッドは、構成ファイルに応じて「System.Data.OracleClient」のような文字列を返します。
DO STUFF 部分は、次のようなメソッドを呼び出します (これらのメソッドは多数あります)。スキーマからデータベース テーブルの列のプロパティを見つけます。これは、Oracle、SQL サーバーなどがこれらを異なる方法で処理するために必要です。
public static int GetColumnMaxStringLength(DbProviderFactory provFactory, DataRow schemaTableRow)
{
if (provFactory is OracleClientFactory)
{
return Convert.ToInt32(schemaTableRow["LENGTH"]);
}
else if // OTHER OPTIONS
...
throw new Exception(string.Format("Unsupported DbProviderFactory -type: {0}", provFactory.GetType().ToString()));
}
では、これらのクラスが廃止されたことがビルドで示されている場合、これをどのように修正する必要があるのでしょうか? 私がこれを行ったとき、これは一種の教科書的な解決策であるはずでした (Pro C# 2008 および .NET 3.5 プラットフォーム)。今、私は当惑しています。
よろしくお願いいたします - Matti