2008-11-06 1 views
2

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

+0

бонусные баллы, если он также обрабатывает оракул. – 2008-11-06 16:13:23

+0

AFAIK он обрабатывает Oracle прямо из коробки. Добавление mySQL прост, даже без предустановленного провайдера, найденного в CodePlex. – ProfK 2008-11-07 13:30:27

ответ

4

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

0

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

1

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

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

Это поможет вам только на полпути.

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

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

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

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

0

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

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

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

0

рамки ОРМ поможет вам достичь RDBMS агностик инфраструктуры, но вы все равно придется держать индивидуальный DAL, если вы будете работать с ОДС и хранимые процедуры. Как следствие, вы, вероятно, не будете использовать триггеры, 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

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

Вот пример исходного кода для чего-то, использующего AR; code to operator object in Stacked

0

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

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

Смежные вопросы