我制作了一个“通用”程序,可以将数据从一个数据库转换到另一个数据库。它使用配置文件来定义转换。它使用这样的代码:
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 Server 等以不同方式处理这些问题。
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 平台)。现在我很困惑。
在此先感谢并致以最诚挚的问候-马蒂