• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

NikSoft

Покажем, как можно работать с двумя базами данных, не изменяя исходных текстов проекта, а изменяя только его файл конфигурации. Задачу решает следующий 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

Чушь.

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

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

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

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

NikSoft

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

karlito

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

Microsoft.ApplicationBlock.Data - если хочешь абстрагироваться от определённого провадера. И будешь выбирать провайдер в конфиг файле.

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

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

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

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

NikSoft

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

karlito

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

Чуть-чуть по политкорректней.
Работа с базами данных это не та область, где нужно применять BooleanSwith.

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

NikSoft

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

Dr.Gigabit

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

А между прочем karlito во многом прав :) Замена 0 на 1 выглядит не очень убедительно.
Что значит менять логику работы? Интерфейсы то одинаковые.
Если в зависимости от базы данных меняется интерфейс работы с ней -- что-то у вас не то с дзайном,имхо.

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!