Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C одной СУБД на другую 
:(
    Опции темы
N1ko
Дата 17.3.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



У меня есть приложение, которое на данный момент работает с SQLite. В будущем возможно прийдётся его перевести на Oracle либо на SQLServer. Задача состоит в том, что бы сейчас сделать код более гибким. То есть мне нужно что бы переход с одной СУБД на другую совершался быстро (что бы не нужно было лопатить весь код и перестраивать его) По этому поводу в инете нашёл DAO Pattern, но судя по всему он работает под Java. Если я ошибаюсь, поправьте меня. Посоветуйте, что можно сделать в данном случае, дабы упростить себе в дальнейшем жизнь. Если можно, скиньте ссылки на ресурсы, где такая вещ реализована.
PM MAIL ICQ   Вверх
Kanes
Дата 17.3.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Все провайдеры данных ADO.NET наследуются от абстрактных классов, таких как DbCommand, DbConnection, DbDataReader и прочие, т.е. если вы не используете в коде специфичных для конкретной БД фич, то спокойно можете использовать эти базовые классы. А конкретную БД можно задавать, например, в app.config. Так же в ADO.NET есть такой класс - DbProviderFactory, который облегчает разработку гибкого кода для работы с БД.
Примеры работы можно посмотреть в MSDN
Объекты DbProviderFactory (ADO.NET)

--------------------
Big gun - big future  
PM MAIL   Вверх
Exai1e
Дата 17.3.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 4
Всего: 30



N1ko, я делаю так: например есть в бд таблица "Группы" создают класс Group. Самый нижний слой - работает с бд (sql запросы, и прочее, что может придется потом менять при переходе на другую бд, например:
Класс группа
Код

    public class Group
    {
        public int GroupID { set; get; }
        public string Name { set; get; }
        public string About { set; get; }
// some code
}


слой который работает с базой данных (который если надо можно поменять, в зависимости от БД)
Код

    public class GroupManager
    {
        public void RemoveGroup(string pName)
        {
            try
            {
                OleDbConnection connection = new OleDbConnection(connectionString);
                connection.Open();
                OleDbTransaction trans = connection.BeginTransaction();
                OleDbCommand cmd = new OleDbCommand(removeGroupCommand, connection, trans);
                cmd.Parameters.AddWithValue("group_name", pName);
                cmd.ExecuteNonQuery();
                trans.Commit();
                connection.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

//bla bla bla 
 private const string getGroupCommandLike = "select * from groups where group_name like :group_name";
        public List<Group> GetGroupListInParam(string pName)
        {
            OleDbConnection connection = null;
            OleDbDataReader reader = null;
            try
            {
                connection = new OleDbConnection(connectionString);
                connection.Open();
                OleDbCommand cmd = connection.CreateCommand();
                cmd.Transaction = connection.BeginTransaction();
                cmd.CommandText = getGroupCommandLike;
                cmd.Parameters.AddWithValue("group_name", "%" + pName + "%");
                reader = cmd.ExecuteReader();

                if (reader != null)
                    return GetGroupListInReader(reader);
                else
                    return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                reader.Close();
                connection.Close();
            }
        }
//blablalba
}


и слой с которым будет работать программа:
Код

    public class DataManager
    {
//blablalba
        private GroupManager groupManager = null;
//blabla
        public void RemoveGroup(string pName)
        {
            if (pName.Length > 0)
                groupManager.RemoveGroup(pName);
            else
            {
                //Исключение
            }
        }

//blabla

        public List<Group> GetGroupListInName(string pName)
        {
            if (pName.Length > 0)
                return groupManager.GetGroupListInParam(pName);
            else
                return null;
        }


не знаю, насколько это правильно и хорошо


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Kanes
Дата 17.3.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Насчет OleDb - будет работать только с теми БД, которые поддерживают протокол OLE DB.
Из Троелсена:
Цитата

Этот поставщик позволяет взаимодействовать с любой БД, совместимой с OLE DB. Однако имейте ввиду, что поставщик OLE DB неявно взаимодействует с различными COM-обьектами, что может снизить производительность приложения. В общем-то поставщик данных OLE DB нужен только для взаимодействия с какой-нибудь СУБД, для которой нет специального поставщика данных .NET

--------------------
Big gun - big future  
PM MAIL   Вверх
Exai1e
Дата 18.3.2010, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 4
Всего: 30



Kanes, я знаю (просто у меня используется FireBird), но если понадобиться например использовать MS SQL то придется только переделать код в классе GroupManager, а класс который работает не посредственно с программной DataManager, трогать будет не обязательно. То есть вся логика и прочее в классе DataManager как была так и останется.


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Kanes
Дата 18.3.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Exai1e, да переделать, что не всегда удобно, если использовать подход который я предлагаю будет еще проще. Вот из Троелсена пример:
Код

using System;

using System.Data;
using System.Data.Common;

using System.Configuration;

namespace DataProviderFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("**** Fun with Data Provider Factories ****\n");

            //Получение строки подключения из *.config
            string dp = ConfigurationManager.AppSettings["provider"];
            string cnStr = ConfigurationManager.ConnectionStrings["AutoLotSqlProvider"].ConnectionString; //<--------

            //Получение фабрики поставщика
            DbProviderFactory df = DbProviderFactories.GetFactory(dp);

            //Создание обьекта подключения
            DbConnection cn = df.CreateConnection();
            Console.WriteLine("Your connection object is a: {0}", cn.GetType().FullName);
            cn.ConnectionString = cnStr;
            cn.Open();

            //Создание обьекта команды
            DbCommand cmd = df.CreateCommand();
            Console.WriteLine("Your command object is a: {0}", cmd.GetType().FullName);
            cmd.Connection = cn;
            cmd.CommandText = "SELECT * FROM Inventory WHERE Make = \'BMW\'";

            //Вывод данных с помощью обьекта чтения
            DbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            Console.WriteLine("Your data reader object is a: {0}", dr.GetType().FullName);

            Console.WriteLine("\n**** Current Inventory ****");
            while (dr.Read())
                Console.WriteLine("-> Car #{0} is a {1}.",
                    dr["CarID"], dr["Make"].ToString().Trim());

            Console.WriteLine();
        }
    }
}


Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- Поставщик -->
    <add key="provider" value="System.Data.SqlClient"/>
  </appSettings>
  <connectionStrings>
    <add name="AutoLotSqlProvider" 
         connectionString=
         "Data Source=(local)\SQLEXPRESS;
         Integrated Security=SSPI;
         Initial Catalog=AutoLot"
    />
  </connectionStrings>
</configuration>


В коде меняются только строчки связанные с чтением app.config, в самом app.config меняются только два параметра
--------------------
Big gun - big future  
PM MAIL   Вверх
N1ko
Дата 18.3.2010, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



А DataProviderFactory работает с SQLite. В описании кажись не было её поддержки. 
PM MAIL ICQ   Вверх
Kanes
Дата 18.3.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Цитата(N1ko @ 18.3.2010,  10:45)
А DataProviderFactory работает с SQLite. В описании кажись не было её поддержки.

ЕМНИП, фабрика работает только с поставщиками, которые поставляет Microsoft, но ее можно не использовать.
Вот другой код:
Код

using System;

using System.Data;
using System.Data.SqlClient;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.OracleClient;

using System.Configuration;

namespace MyConnectionFactory
{
    class Program
    {
        //Список возможных поставщиков
        enum DataProvider
        {
            SqlServer, OleDb, Odbc, Oracle, None
        }

        static void Main(string[] args)
        {
            Console.WriteLine("**** Very Simple Connection Factory ****\n");
            
            //Чтение ключа поставщика
            string dataProvString = ConfigurationManager.AppSettings["provider"];

            //Преобразование строки в перечисление
            DataProvider dp = DataProvider.None;
            if (Enum.IsDefined(typeof(DataProvider), dataProvString))
                dp = (DataProvider)Enum.Parse(typeof(DataProvider), dataProvString);
            else
                Console.WriteLine("Sorry, no provider exists!");

            //Получение конкретного подключения
            IDbConnection myCn = GetConnection(dp);
            if (myCn != null)
                Console.WriteLine("Your connection is a {0}", myCn.GetType().Name);

            Console.WriteLine();
        }

        static IDbConnection GetConnection(DataProvider dp)
        {
            IDbConnection conn = null;

            switch (dp)
            {
                case DataProvider.SqlServer:
                    conn = new SqlConnection();
                    break;

                case DataProvider.OleDb:
                    conn = new OleDbConnection();
                    break;

                case DataProvider.Odbc:
                    conn = new OdbcConnection();
                    break;

                case DataProvider.Oracle:
                    conn = new OracleConnection();
                    break;
            }

            return conn;
        }
    }
}

--------------------
Big gun - big future  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.