2010-04-15 3 views
4

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

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

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

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

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

Спасибо, Spara

+0

ASP или ASP.NET? – RedFilter

+0

vanilla ASP. Нет. NET – Sparafusile

+3

* Почему вы пишете новое веб-приложение на несуществующем и полностью устаревшем и неподдерживаемом языке сценариев? –

ответ

4

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

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

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

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

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

+3

Стандарт SQL 92 имел несколько уровней, и все они соответствовали только «начальному уровню», что делало его ограниченным. – Andrew

+0

Использование стандартного синтаксиса как можно больше, безусловно, хорошее начало. Но это на самом деле терпит неудачу на простом примере, который я дал выше (TOP vs LIMIT). Что касается вашего разветвления и добавления поставщиков на более поздний срок - это кажется безумным количеством работы. Создание ветки для каждого утверждения, а затем возвращение и обновление их позже звучит утомительно. Я начинаю думать о хранении инструкций где-то и получать правильный, когда это необходимо ... но я думаю, что однажды прочитал об этом на thedailywtf.com. – Sparafusile

+0

@Sparafusile: отредактирован ответ, чтобы добавить DAL и интерфейс. –

2

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

Edit: Is there an OR/M for Classic ASP?

+0

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

0

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

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

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

+1

Это не действительная инструкция MS SQL. Я не проверял MySQL. – Sparafusile

+0

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