Понадобилось однажды быстро отчет сделать для смежного отдела, вроде все просто, но вся беда в том, что база находится на Firebird.
Это не проблема когда под рукой есть хороший провайдер.
В качестве решения было принято использовать SQL Server 2012 Express Advanced Services вместе со службой сервера отчетов.
Доступ к данным настраивался через связанный сервер.
- Для разработки понадобятся сам сервер Firebird , качаем нужную версию.
- Устанавливаем сервер вместе с клиентскими компонентами.
- Для работы с Firebird понадобится IBExpert personal - GUI оболочка для администрирования и выполнения скриптов. Качаем и устанавливаем.
- Триальная версия oledb провайдера IBProvider для изучения внутренней структуры базы.
- Инструкция по созданию связанного сервера с использованием 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 ')