C # - Сделать совместимым проект MySQL и SQL Server - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над проектом, который я хочу совместить с MySQL и MSQL . Все работает хорошо, но у меня есть небольшая проблема с повторением кода:

У меня есть отдельный класс для всех запросов к базе данных, и для выбора я делаю следующее (пример для объекта «Профиль»):

У меня есть параметр "isMySQL", который я установил в true, если я хочу использовать MySQL, и false для использования Microsoft SQL Server.

public Profil Select_profil(string query)
        {
            Profil profil = new Profil();
            if (this.OpenConnection() == true)
            {
                if (this.isMySQL)
                {
                    MySqlCommand cmd = new MySqlCommand(query.Replace("[myDataBase].", ""), connection);
                    using (MySqlDataReader dataReader = cmd.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            profil.ID = Int32.Parse(dataReader["ID"].ToString().Trim());
                            profil.Nom = dataReader["PROFIL"].ToString().Trim();
                            profil.Famille = dataReader["FAMILLE"].ToString().Trim();
                            profil.Largeur = double.Parse(dataReader["LARGEUR"].ToString().Trim());
                            profil.Hauteur = double.Parse(dataReader["LARGEUR_AILE"].ToString().Trim());
                            profil.EpAile = double.Parse(dataReader["EP_AILE"].ToString().Trim());
                            profil.EpAme = double.Parse(dataReader["EP_AME"].ToString().Trim());
                            profil.Radius1 = double.Parse(dataReader["R"].ToString().Trim());
                            profil.Radius2 = double.Parse(dataReader["R2"].ToString().Trim());
                            profil.PdsLin = double.Parse(dataReader["PDS_LINEAIRE"].ToString().Trim());
                            profil.PaintSurf = double.Parse(dataReader["PAINT_SURF"].ToString().Trim());
                            profil.P08 = double.Parse(dataReader["P08"].ToString().Trim());
                            profil.P09 = double.Parse(dataReader["P09"].ToString().Trim());
                            profil.P10 = double.Parse(dataReader["P10"].ToString().Trim());
                            profil.P11 = double.Parse(dataReader["P11"].ToString().Trim());
                        }
                    }
                }
                else
                {
                    SqlCommand cmd = new SqlCommand(query, MSconnection);
                    using (SqlDataReader dataReader = cmd.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            profil.ID = Int32.Parse(dataReader["ID"].ToString().Trim());
                            profil.Nom = dataReader["PROFIL"].ToString().Trim();
                            profil.Famille = dataReader["FAMILLE"].ToString().Trim();
                            profil.Largeur = double.Parse(dataReader["LARGEUR"].ToString().Trim());
                            profil.Hauteur = double.Parse(dataReader["LARGEUR_AILE"].ToString().Trim());
                            profil.EpAile = double.Parse(dataReader["EP_AILE"].ToString().Trim());
                            profil.EpAme = double.Parse(dataReader["EP_AME"].ToString().Trim());
                            profil.Radius1 = double.Parse(dataReader["R"].ToString().Trim());
                            profil.Radius2 = double.Parse(dataReader["R2"].ToString().Trim());
                            profil.PdsLin = double.Parse(dataReader["PDS_LINEAIRE"].ToString().Trim());
                            profil.PaintSurf = double.Parse(dataReader["PAINT_SURF"].ToString().Trim());
                            profil.P08 = double.Parse(dataReader["P08"].ToString().Trim());
                            profil.P09 = double.Parse(dataReader["P09"].ToString().Trim());
                            profil.P10 = double.Parse(dataReader["P10"].ToString().Trim());
                            profil.P11 = double.Parse(dataReader["P11"].ToString().Trim());
                        }
                    }
                }
                this.CloseConnection();
            }
            return profil;
        }

Для MySQL и SQL Server код один и тот же (за исключением [MyDatabase]. , который я заменяю в случае MySQL), но мне нужно повторить его дважды, потому что в одном случае я использую объекты MySqlCommand и MySqlDataReader, во втором случае мне нужно использовать SqlCommand и SqlDataReader. Неудобно, когда я делаю некоторые изменения в моей базе данных, мне нужно изменить все дважды (источник ошибок). Есть ли способ сгруппировать код и поставить его один раз, без использования функций?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вместо применения логики переключения в операторе if..else .. вы должны написать отдельный слой для доступа к данным, как предлагалось в предыдущих комментариях. Этот слой будет заниматься выбором базы данных и другими операциями.

например, Добавьте контракт, скажем, ICommand - это будет использоваться в вашем текущем коде вместо MySQLCommand или SQLCommand. Уровень доступа к данным будет иметь фабрику / класс и функцию, которая будет возвращать вам соответствующую команду на основе параметра.

Аналогично, все другие операции, связанные с базой данных, которые вы, возможно, выполняете в своем коде на бизнес-уровне, будут перемещены на этот новый уровень, который вы создадите, DataAccessLayer.

Отредактировано: Спасибо @Richardissimo и @ Siegfried.V за то, что приняли это как ответ. Как и предполагалось, я поместил здесь код, чтобы вы могли принять его в качестве ответа.

public IDataReader ExecuteReader(string query) 
    {
         IDataReader dataReader = null; 
       if (this.isMySQL) 
      {
         MySqlCommand cmd = new MySqlCommand(query.Replace("[myDataBase].", ""), 
         connection); 
         dataReader = cmd.ExecuteReader(); 
      } 
      else 
      { 
        SqlCommand cmd = new SqlCommand(query, connection); 
        dataReader = cmd.ExecuteReader(); 
      }
        return dataReader; 
  }
0 голосов
/ 07 июля 2018

Спасибо zacs за его решение, я поставил здесь код:

public List<Profil> Select_profil(string query)
        {
            List<Profil> list = new List<Profil>();
            if (this.OpenConnection() == true)
            {
                IDataReader dataReader = ExecuteReader(query);
                while (dataReader.Read())
                {
                    ...
                    ...
                }
                this.CloseConnection();
            }
            return list;
        }

Затем функция ExecuteReader:

public IDataReader ExecuteReader(string query)
        {
            IDataReader dataReader = null;
            if (this.isMySQL)
            {
                MySqlCommand cmd = new MySqlCommand(query.Replace("[v-steel].", ""), connection);
                dataReader = cmd.ExecuteReader();
            }
            else
            {
                SqlCommand cmd = new SqlCommand(query, MSconnection); 
                dataReader = cmd.ExecuteReader();
            }
            return dataReader;
        }

Что касается соединения и MSconnection, это два частных объекта:

private MySqlConnection connection;
private SqlConnection MSconnection;
0 голосов
/ 05 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...