Вопрос

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

Это было полезно?

Решение

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

Другие советы

Одним из вариантов является кодирование с использованием классов 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 с примером кода.

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

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

Однако это поможет вам пройти только половину пути.

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

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

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

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

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

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

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

Платформы 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;
            }
        }
    }

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top