MySQL и SQL Server для одного приложения - PullRequest
2 голосов
/ 06 ноября 2008

Каковы хорошие способы достижения этого агностицизма БД без фактического кодирования двух DAL? Я слышал, что для этого подходит блок приложения доступа к данным.

Ответы [ 8 ]

4 голосов
/ 06 ноября 2008

Вы также можете посмотреть на различные библиотеки ORM, такие как NHibernate. Когда вы ориентируетесь на несколько баз данных, лучше всего искать инструмент, который может создать вашу базу данных из файлов конфигурации или из кода. Это избавит вас от необходимости создавать идентичные базы данных в MySQL и MSSql.

1 голос
/ 06 ноября 2008

Одним из вариантов является кодирование с использованием классов IDbConnection, IDbCommand и т. Д. Из пространства имен System.Data, а не определенных классов SQL Server (SqlConnection, SqlCommand) из System.Data.SqlClient или соответствующих определенных MySQL классов. Вам все еще нужно создать экземпляр класса соединения для конкретной базы данных, которую вы используете, но с этого момента вы можете просто использовать универсальные интерфейсы.

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/1175d7ea-f5b4-442f-9155-08bf8b2ba06c/ и http://www.15seconds.com/issue/040127.htm имеют некоторый пример кода.

0 голосов
/ 14 декабря 2009

Модель провайдера .net разработана специально для решения этой проблемы. Предоставляя класс «провайдера», который обрабатывает все ваше взаимодействие с БД и происходит от хорошо спроектированного базового класса, вы можете с минимальными усилиями менять внутренних поставщиков (для sql, mySql (blech), xml и т. Д.).

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

0 голосов
/ 01 декабря 2008

Лучший способ сделать это (и в основном любой уровень доступа к базе данных на самом деле в целом) - использовать инструмент O / RM. Я предпочитаю ActiveRecord, который является оберткой вокруг nHibernate ...

Вот пример исходного кода для чего-то, использующего AR; код для объекта оператора в Stacked

0 голосов
/ 01 декабря 2008

Платформы ORM помогут вам создать независимую от RDBMS инфраструктуру, но вам все равно придется поддерживать отдельные DAL, если вы работаете с UDF и хранимыми процедурами. Как следствие, вы, вероятно, не будете использовать триггеры, T-SQL, обновляемые представления и размещенный в CLR код C #. Вы бы просто отобразили объекты и объекты.

ADO.NET будет хорошо работать в большинстве проектов. Если вам нужно переключиться между MSSQL или MySQL, вы можете действительно легко получить доступ к провайдеру, как этот:

    private static DbProviderFactory _provider = DbProviderFactories.GetFactory(WebConfigurationManager.ConnectionStrings["database"].ProviderName);
    private static string _connectionString = WebConfigurationManager.ConnectionStrings["database"].ConnectionString;


    public static DbParameter CreateParameter(string name, object value)
    {
        DbParameter parameter = _provider.CreateParameter();
        parameter.ParameterName = name;
        parameter.Value = value;
        return parameter;
    }

    public static DataTable SelectAsTable(string query, DbParameter[] parameters)
    {
        using (DbConnection connection = _provider.CreateConnection())
        {
            connection.ConnectionString = _connectionString;
            using (DbDataAdapter adapter = _provider.CreateDataAdapter())
            {
                adapter.SelectCommand = connection.CreateCommand();
                adapter.SelectCommand.Parameters.AddRange(parameters);
                adapter.SelectCommand.CommandText = query;

                DataTable table = new DataTable();
                adapter.Fill(table);
                connection.Close();
                return table;
            }
        }
    }
0 голосов
/ 12 ноября 2008

С помощью инструмента построения диаграмм ERD создайте чисто логический дизайн, а затем сгенерируйте DDL для каждого из ваших вариантов.

Вы можете проверить DBDesigner ...

http://www.fabforce.net/downloads.php

0 голосов
/ 06 ноября 2008

Ну, как уже отмечали другие, постарайтесь абстрагироваться от реальных классов. Это может включать использование интерфейсов, как указывает AHd54, или что-то подобное.

Это только даст вам половину пути.

SQL, который вам нужно выполнить, также будет иметь различия, такие как:

  • Синтаксис имени параметра
  • Позиционные параметры и именованные параметры
  • Имена функций
  • Некоторые синтаксические различия, например, как указать , дайте мне только первые N строк

Если вам нужно охватить все эти вещи, и вы не можете или не будете использовать ORM (хотя они редко дают вам 100%), то одним из способов будет создание ваших собственных классов, которые абстрагируют не только задействованы фактические классы, но также выполняет некоторый тип переписывания SQL для обработки различий в коде.

Я пошел по пути переписывания, поэтому, если вам нужны указатели на него, добавьте комментарий к этому ответу с вопросами, и я обновлю ответ соответствующим образом.

0 голосов
/ 06 ноября 2008

Используйте библиотеку абстракций ADODB для MySQL. Собственные вызовы библиотеки MySQL довольно уродливы и примитивны, поэтому вам, вероятно, понадобится что-то более высокого уровня в любом случае.

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