Лучший способ достичь этого - использовать интерфейсы, предоставляемые поставщиками баз данных; они почти параллельны по функциональности. Создайте статический фабричный класс для создания интерфейсов для адаптеров команд, адаптеров данных и соединений на основе настроенной базы данных. Например:
public static IDbDataAdapter GetDataAdapter (Database db)
{
switch (db)
{
default:
case "MsSql":
return new SqlDataAdapter ();
case "MySql"
return new MySqlDataAdapter ();
}
}
public static IDbCommand GetCommand (Database db)
{
switch (db)
{
default:
case "MsSql":
return new SqlCommand ();
case "MySql"
return new MySqlCommand ();
}
}
Ваш клиентский код не будет знать разницу, хотя он должен будет передать строку конфигурации. Используйте документы VS для изучения интерфейсов, предоставляемых каждым из объектов, которые вы обычно используете, и придерживайтесь их, и это будет довольно просто - хотя вам, возможно, придется взломать пару вещей.