Биты и байты.

Биты и байты.

понедельник, 16 февраля 2015 г.

Достучаться до Firebird..

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


В качестве решения было принято использовать SQL Server 2012 Express Advanced Services вместе со службой сервера отчетов.
Доступ к данным настраивался через связанный сервер.

  1. Для разработки понадобятся сам сервер Firebird , качаем нужную версию.
  2. Устанавливаем сервер вместе с клиентскими компонентами.
  3. Для работы с Firebird  понадобится IBExpert personal  - GUI оболочка для администрирования и выполнения скриптов. Качаем и устанавливаем.
  4. Триальная версия oledb провайдера IBProvider для изучения внутренней структуры базы.
  5. Инструкция по созданию связанного сервера  с использованием IBProvider. Читаем и настраиваем

! Обязательно проверяем соединение скриптом из инструкции выше,  клиентскую библиотеку fbclient.dll копируем в корень каталога windows.

      6.       После того как настроили все по инструкции проверяем соединение.

begin distributed transaction;
select * from FB_TEST...TEST_TABLE;
commit;

      7.      Если все хорошо приступаем к изучению базы по системным таблицам

--список всех таблиц
select rdb$relation_name
from FB_TEST...RDB$RELATIONS t
where rdb$view_blr is null
and (rdb$system_flag is null or rdb$system_flag = 0);

--список всех столбцов
select f.rdb$relation_name, f.rdb$field_name
from  FB_TEST...RDB$RELATION_FIELDS f
join  FB_TEST...RDB$RELATIONS r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
order by 1, f.rdb$field_position;

--проверка индексов
SELECT RDB$INDEX_NAME
FROM FB_TEST...RDB$INDICES
WHERE RDB$RELATION_NAME='TEST_TABLE'
--AND RDB$UNIQUE_FLAG IS NULL
--AND RDB$FOREIGN_KEY IS NULL;          

--детальная информация по индексам
SELECT RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS field_name,
RDB$INDICES.RDB$DESCRIPTION AS description,
(RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION + 1) AS field_position
FROM FB_TEST...RDB$INDEX_SEGMENTS
LEFT JOIN FB_TEST...RDB$INDICES ON RDB$INDICES.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
LEFT JOIN FB_TEST...RDB$RELATION_CONSTRAINTS ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
WHERE UPPER(RDB$INDICES.RDB$RELATION_NAME)='TEST_TABLE'         -- имя таблицы
AND UPPER(RDB$INDICES.RDB$INDEX_NAME)='APC_TEST_TABLE' -- название индекса
AND RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE IS NULL
ORDER BY RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION

P.S После того как необходимые запросы будут написаны и вы разберетесь со структурой базы, настраиваем связанный сервер  через ODBC качаем  с оф.  сайта провайдер

Настраиваем ODBC, системный DSN

Проверяем соединение.Переписываем запросы на OpenQuery если это необходимо и наслаждаемся!
SELECT *
FROM  openquery(fbnew,'select CH.FLASTNAME, CH.FFIRSTNAME , CH.FMIDDLENAME  ,CH.FID1, CH.FID0 from TEST_TABLE CH ')

About