Как работать с двумя базами данных без перекомпиляции проекта

  • Автор темы NikSoft
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

NikSoft

#1
Покажем, как можно работать с двумя базами данных, не изменяя исходных текстов проекта, а изменяя только его файл конфигурации. Задачу решает следующий MultiConnection класс.
Код:
class MultiConnection
{
private static BooleanSwitch _switch = new BooleanSwitch("Provider", "Supports switching");

private static string GetConnectionString()
{
if (_switch.Enabled) // > 0
{
return @"Provider=Microsoft.Jet.OLEDB.4.0;Data		 Source=D:\WINDOWS\SHELLNEW\ACCESS9.MDB";
}
else
{
return @"Data Source=.\SQLEXPRESS;AttachDbFilename='D:\Program Files\DVDCollectionDatabase.mdf';
Integrated Security=True;Connect Timeout=30;User Instance=True";
}
}

private static IDbConnection GetConnection()
{
if (_switch.Enabled) 
{
return new OleDbConnection(GetConnectionString());
}
else
{
return new SqlConnection(GetConnectionString());
}
}

public static void Test()
{
IDbConnection c = GetConnection();
try
{
Console.WriteLine(c.ConnectionString);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + ex.StackTrace);
}
}
}
Если имя проекта “BoolSwitch”, то в файл конфигурации “BoolSwitch.exe.config” необходимо добавить следующие строки
Код:
<system.diagnostics>
<switches>
<add name="Provider" value="1"/>
</switches>
</system.diagnostics>
Меняя в файле конфигурации значение свойства "Provider" на 0 или 1, функция GetConnectionString будет обеспечивать переключение к нужной базе данных без перекомпиляции проекта.
Интерфейс IDbConnection является базовым для OleDbConnection и SqlConnection классов. Заметим,что MultiConnection класс по сути реализует Factory паттерн.
 
K

karlito

#2
Чушь.

Зачем такие извращения? Если можно просто в конфиге прописать строчку подключения к базе данных. И менять её в конфигурационном файле.

Если это ASP.NET, то при изменении конфиг файла, ASP.NET перегрузит домен приложения.
Если это WinForm, то придётся перегрузить приложение.

И никакой компиляции. :D

СЛОЖНО МОЖЕТ СДЕЛАТЬ ЛЮБОЙ, А ПРОСТО - ПРОФЕССИОНАЛ!!!
 
N

NikSoft

#3
А где будет менять логику работы с двумя различными базами данных(MS Aссess, MS SQL Server) без перекомпиляции проекта профессионал karlito? Тоже в конфигурационном файле?
Это же надо догадаться, написать такую чушь!!!
 
K

karlito

#4
А где будет менять логику работы с двумя различными базами данных(MS Aссess, MS SQL Server) без перекомпиляции проекта профессионал karlito? Тоже в конфигурационном файле?
Это же надо догадаться, написать такую чушь!!!
Microsoft.ApplicationBlock.Data - если хочешь абстрагироваться от определённого провадера. И будешь выбирать провайдер в конфиг файле.

Ты в своём примере используешь коннекшены, но на этом работа с базой данных не ограничивается. а как же DBCommand, DBParameters? Factory Method - здесь не поможет. Минимум фабрику классов необходимо применять.

Если уж твой пример в порядок привести, то возвращать необходимо System.Data.Common.DbProviderFactory, который в кое в чём сможет решить твою проблему.

Совет. Не сохраняй в коде строки подключения к бд. потом обожжошься. :unsure:

Пример на помойку. :)
 
N

NikSoft

#5
Причем здесь Factory паттерн?
Этот пример не призван показать как работать с Factory паттерн или с базами данных.
Этот пример показывает как работать с BooleanSwitch классом и одной из возможных областей его применения.
Так что место помоечных комментариев профессионала karlito только на помойке
 
K

karlito

#6
Причем здесь Factory паттерн?
Этот пример не призван показать как работать с Factory паттерн или с базами данных.
Этот пример показывает как работать с BooleanSwitch классом и одной из возможных областей его применения.
Так что место помоечных комментариев профессионала karlito только на помойке
Чуть-чуть по политкорректней.
Работа с базами данных это не та область, где нужно применять BooleanSwith.

СЛОЖНО МОЖЕТ СДЕЛАТЬ ЛЮБОЙ, А ПРОСТО - ПРОФЕССИОНАЛ!!! Это тебе совет. Не усложняй.
 
N

NikSoft

#7
Работа с базами данных это не та область, где нужно применять BooleanSwith
Звучит не убедительно. Считаю, что приведенный приведенный пример вполне корректен и может использоваться на практике.
Не надо делать личностных оценок и вешать персональные ярлыки. Не надо делить программистов на профессионалов и непрофессионалов. Ознакомься с правилами этикета на форуме.
 
D

Dr.Gigabit

#8
А где будет менять логику работы с двумя различными базами данных(MS Aссess, MS SQL Server) без перекомпиляции проекта профессионал karlito? Тоже в конфигурационном файле?
Это же надо догадаться, написать такую чушь!!!
А между прочем karlito во многом прав :) Замена 0 на 1 выглядит не очень убедительно.
Что значит менять логику работы? Интерфейсы то одинаковые.
Если в зависимости от базы данных меняется интерфейс работы с ней -- что-то у вас не то с дзайном,имхо.

Рекомендую посмотреть, как это решается, к примеру вот здесь http://www.bltoolkit.net/
 
Статус
Закрыто для дальнейших ответов.