Нейтральный поставщик SQL - PullRequest
4 голосов
/ 15 апреля 2010

В настоящее время я работаю над проектом для веб-приложения, которое может быть установлено на нескольких разных серверах с различными конфигурациями программного обеспечения. Я хочу сделать свое приложение максимально гибким, позволяя пользователю устанавливать различные SQL-серверы. Проблема в том, что синтаксис SQL, используемый любыми двумя поставщиками серверов, не совпадает. Для простого примера, вот тот же оператор SELECT для MS SQL и MySQL:

MS SQL - SELECT TOP 1 * FROM MyTable ORDER BY DateCreated DESC

MySQL - SELECT * FROM MyTable ORDER BY DateCreated DESC LIMIT 1

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

Дополнительная информация: я пишу свое приложение we на vanilla ASP, работающее на сервере Windows.

Спасибо, Спара

Ответы [ 3 ]

4 голосов
/ 15 апреля 2010

Вы можете соответствовать ANSI SQL 92. Все основные РСУБД, которые я знаю, будут поддерживать это.

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

Возможно, вам придется разветвляться в коде в зависимости от СУБД, к которой вы подключаетесь, и сгенерировать / выбрать соответствующий оператор SQL на этом этапе.

Лучшим вариантом будет создание DAL для каждой поддерживаемой СУБД. Реализуйте интерфейс DAL через DAL, чтобы сделать их единообразными. Это должно быть проще, чем переключение кода.

Я предлагаю вместо того, чтобы пытаться угодить всем, вы должны написать свой код таким образом, чтобы поддерживать одну или две верхние системы, на которые вы рассчитываете развернуть, и добавить поддержку других СУБД по мере необходимости.

2 голосов
/ 15 апреля 2010

Я предлагаю вам использовать ORM (linq, nhibernate и т. Д.), Чтобы абстрагироваться от диалекта SQL, а не пытаться писать простой ванильный SQL.

Редактировать: Есть ли OR / M для Classic ASP?

0 голосов
/ 16 апреля 2010

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

SELECT MAX(*) FROM mytable ORDER BY datecreated DESC;

В ansi будут обходные пути, потому что на самом деле все специфические для db конструкции - это способы сократить или сократить существующие способы получения или описания данных. Другим вариантом может быть ограничение доступа к различным базам данных для хранимых процедур и пользовательских функций. Таким образом, вы можете написать сценарии для нескольких известных вам БД, которые будут использоваться с требованием, чтобы ваш конкретный БД был запущен до того, как приложение заработает. Просто идея.

...