Что лучший способ состоит в том, чтобы поддерживать несколько баз данных для продукта.NET?

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

11
задан Danny Beckett 26 June 2013 в 04:54
поделиться

10 ответов

Для ваших текущих потребностей я согласен с NHibernate ...

Просто хочу указать на кое-что с вашей иерархией классов ...

Лучше использовать интерфейс

Например (просто проверьте точный синтаксис в документации или в Интернете)

Interface IDBParser  
    Function1  
    Function2  

class MSSQLParser : IDBParser  
    Function1  
    Function2  

class MySQLParser : IDBParser  
    Function1  
    Function2 

Затем в своем коде вы можете использовать интерфейс

Main()  
    IDBParser dbParser;  
    if(...)  
       dbParser = new MSSQLParser();  
    else  
       dbParser = new MySQLParser();  

    SomeFunction( dbParser );  

// the parser can be sent by parameter, global setting, central module, ...  
    SomeFunction( IDBParser dbParser)  
      dbParser.Function1();  

Таким образом, им будет легче управлять, и ваш код не будет полон того же условия if / else . Также будет намного проще добавить другие БД. Еще одно преимущество состоит в том, что он может помочь вам с модульным тестированием, отправив имитацию объекта.

2
ответ дан 3 December 2019 в 04:52
поделиться

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

Без сомнения, вы должны использовать NHibernate . Это объектно-реляционный преобразователь, который делает доступ к базе данных прозрачным: вы определяете набор классов DAL, которые представляют каждую таблицу в вашей базе данных, и используете поставщиков NHibernate для выполнения запросов к вашей базе данных. NHibernate будет динамически генерировать SQL, необходимый для запроса базы данных и заполнения ваших объектов DAL.

В NHibernate хорошо то, что он генерирует SQL на основе того, что вы указали в файле конфигурации. Из коробки он поддерживает SQL Server, Oracle, MySQL, Firebird, PostGres и несколько других баз данных .

10
ответ дан 3 December 2019 в 04:52
поделиться

Я бы использовал NHibernate .

Вот хороший учебник для начинающих

5
ответ дан 3 December 2019 в 04:52
поделиться

Если вам нужно кодировать его самостоятельно и не использовать продукт, обеспечивающий унифицированный доступ, помните, что такие объекты, как SqlDataAdapter и OracleDataAdapter, наследуются от общего DbDataAdapter (по крайней мере, в более поздних версиях среды выполнения). Если вы перейдете к DbDataAdapter, вы можете написать код, который будет работать с обеими базами данных в тех местах, где вы сделали бы то же самое для обеих баз данных. Некоторая часть вашего кода будет выглядеть примерно так:

DbDataAdapter adapter = GetOracleDataAdapter() as DbDataAdapter;

После того, как вы сбросили код, он не будет ' Не имеет значения, является ли это SqlDataAdapter или OracleDataAdapter. Вы можете назвать это так же.

Однако помните, что кодирование для двух баз данных означает использование функций, которые существуют только в обеих базах данных, и при этом необходимо работать над недостатками обеих. Это не очень хорошая идея.

2
ответ дан 3 December 2019 в 04:52
поделиться

Если вам нужно сопоставление записей базы данных с объектами, я предлагаю вам использовать другое уже предложенное решение: NHibernate. Если это кажется излишним для вашего приложения, и вы хотите использовать подход Ado.net и не нуждаетесь в O / RM-soultion, вам следует взглянуть на то, что сделали ребята из Spring.net, и узнать о Абстракция поставщика Ado.Net.

2
ответ дан 3 December 2019 в 04:52
поделиться

Существуют уровни объектно-реляционного сопоставления, которые будут поддерживать несколько технологий баз данных, например Entity Spaces .

1
ответ дан 3 December 2019 в 04:52
поделиться

Что всегда хорошо в таких случаях, так это создание многоуровневой архитектуры, где все, что связано с БД, ТОЛЬКО находится на уровне доступа к данным. Тогда у вас могут быть разные реализации вашего уровня DAO, одна для Oracle, SQL Server и т. Д.

Вы должны отделить бизнес-уровень от уровня DAO с помощью интерфейсов, чтобы ваш бизнес-уровень просто использовал их для доступа к уровню DAO. . Таким образом, вы могли бы прекрасно заменить базовую реализацию уровня DAO для работы в Oracle DB или любой другой системе, которая вам нравится.

Еще одно хорошее предложение - взглянуть на объектно-реляционные преобразователи, такие как уже предложил Скотт. Я бы посмотрел на NHibernate или Entity framework.

1
ответ дан 3 December 2019 в 04:52
поделиться

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

Плюсы: наборы данных в .Net хорошо написаны, просты в использовании и мощны, а также отлично справляются с предоставлением методов и инструментов для работы с данными на основе таблиц.

Минусы: этот метод может быть проблематичным, если вашему приложению необходимо работать с очень большими наборами данных на стороне клиента.

0
ответ дан 3 December 2019 в 04:52
поделиться

В настоящий момент у Microsoft Entity Framework есть несколько недостатков, некоторые из которых могут быть препятствиями, в зависимости от предполагаемой архитектуры приложения.

Из того, что я сделал. видел и читал о версии V2, которая будет поставляться с .Net 4, я думаю, что она определенно заслуживает внимания.

0
ответ дан 3 December 2019 в 04:52
поделиться

Многие люди предложили структуру отображения O / R, такую ​​как NHibernate. Это вполне разумный подход, если вы по какой-то причине не хотите использовать преобразователь O / R. Что-то вроде NHibernate, вероятно, даст вам 95% + пути, но вам может потребоваться написать собственный SQL. Не паникуйте, если это так; вы все равно можете сделать специальное решение для остального.

В этом случае возьмите биты, для которых действительно нужен пользовательский SQL, и разделите их в модуль подключаемого модуля для конкретной платформы. Напишите плагины Oracle, MySQL, SQL Server (и т. Д.) По мере необходимости для отдельных платформ баз данных, которые вы хотите поддерживать.

ADO.Net позволяет довольно легко оборачивать sprocs, поэтому вы можете переместить уровень, зависящий от платформы, в некоторые хранимые процедуры, представляя более или менее согласованный API для среднего уровня. По-прежнему существуют некоторые зависимости платформы (например, префикс '@' в именах переменных SQL Server), поэтому вам нужно будет создать общий механизм оболочки sproc (что не так уж и сложно).

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

0
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: