ORM Dictionary, FireBird, Oracle и ODBC

Jan 18, 2011 12:47

В ORM библиотеке словаря переделан класс доступа к FireBird, добавлен класс для доступа к словарю в Oracle и класс для работы со словарем через ODBC.


FireBird

С FireBird все достаточно просто. Прежняя реализация на ODBC переделана на использование официального .NET провайдера, доступного на сайте FireBird: http://www.firebirdsql.org/index.php?op=devel&sub=netprovider&id=faq

Скачиваем 7zip-архив, там внутри находится сборка FirebirdSql.Data.FirebirdClient.dll. Она содержит все необходимые классы в пространстве имен FirebirdSql.Data.FirebirdClient. Достаточно включить этот файл в References проекта и можно наслаждаться версионной архитектурой FireBird и стройной системой транзакций этой СУБД.

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

SELECT gen_id(имя_генератора,1) FROM rdb$database
Oracle

С Oracle лишь немного сложнее, так как сама инфраструктура классов .NET скрывает технические детали OCI. Провайдер для Oracle ставится вместе с клиентом, так что остается только включить в References проекта Oracle.DataAccess.

Среди основных трудностей, с которыми пришлось столкнуться при разработке Oracle_DataAccessLayer, отмечу использование NUMBER как типа для целочисленных столбцов. Для получения соответствующих значений в IDataReader нельзя использовать метод GetInt, он кидает исключение по несовместимости типов. необходимо использовать GetDecimal, то есть получать не Int32, а Decimal, и уже затем преобразовывать его в целое число.

Пришлось добавить в базовый класс IDataAccessLayer перегружаемый метод GetInt32( IDataReader, индекс_поля ), который для "нормальных" СУБД дергает IDataReader.GetInt32, а для Oracle вызывает IDataReader.GetDecimal с последующей конвертацией.

Генерация первичных ключей для Oracle очень похожа на FireBird. Специальные объекты базы данных, называемые тут SEQUENCE, с помощью обычного запроса отдают последовательные значения:

SELECT имя_последовательности.NEXT_VAL FROM DUAL
ODBC

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

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

SELECT COALESCE( MAX(id)+1, 1 ) FROM имя_таблицы
Разумеется, этот подход категорически неприемлем для многопользовательского режима модификации словаря из-за неизбежных коллизий. Но если нужно только читать из словаря, то класс ODBC_DataAccessLayer вполне можно взять за основу.

SQL словарь, orm

Previous post Next post
Up