БД Firebird. Подключение, чтение, просмотр — сделать по-быстрому


Заметки и опыт по итогам решения одной задачи. Подключение к БД Firebird, чтение/просмотр структуры таблиц, чтение/просмотр данных БД.

Понадобилось мне тут данные вытащить из одной программки, написанной на БД Firebird. И оказалось, что да, в интернете полно примеров, где маститые гуру, выпятив губу, демонстрируют новичкам, как подключаться к Огнептице, но всё обрывочно и скомканно. На ИС нашлось несколько публикаций, вроде //infostart.ru/public/85844/ — но и там полезного крайне мало. Поскольку иногда бывает надо быстро «взять и сделать», то предлагаю материалы, которые помогли мне выполнить задачу, а также решение, которое достаточно универсально, чтобы применяться в самых разных жизненных случаях. Всё это без привязки к конкретному софту вроде всяких автосервисов или запчастей. Рассказываю на прикладном уровне (т.е. подробного изложения, чем ODBC отличается от ADO DB или что такое MDAC, не ждите). Есть задача «прочитать данные», её решаем.

FB здесь и далее, понятно дело, не фейсбук)

Описывается случай FB 2.0 как наиболее общий, обычно справедливо и для более поздних версий.

Необходимое:

1. На компьютере (на сервере либо локальном ПК, откуда идёт подключение к FB) должен быть источник данных ODBC, позволяющий работать провайдеру. Его один раз надо установить, зарегистрировать и запустить. При установке FB некоторых дистрибутивов он ставится сразу, но, увы, не всегда. Мы из 1С подключаемся к этому провайдеру и командуем, что нам надо сделать с БД FB. Дальше — не наша забота.  Нас даже, в общем, не волнует граница ответственности между провайдером и собственно сервером FB. Провайдеров много, не все одинаково полезны) Дистрибутив того, который легко «взлетел» у меня, прилагаю.

2. На компьютере (на сервере либо локальном ПК, откуда идёт подключение к FB) желательно установить сервер FB. Запускать его после инсталляции как службу не обязательно.  Сам по себе тихо крутится, интерфейса обычно не имеет. Установка его полезна тем, что даёт нам некоторые примитивные консольные утилиты для управления БД. Есть действия, которые вообще без этих утилит не сделать. Ну и документация там тоже есть. Дистрибутив прилагаю.

3. Собственно читаемая база — один или несколько файлов, обычно формата FDB или GDB. Сама база может лежать любом месте — главное, правильно указать путь; но лучше всё же (во избежание лишних причин для сбоев) положить её локально.

Замечу, что можно спокойно ставить под 64-разрядную ОС обычный 32-разрядный провайдер. У меня как раз такой вариант и работает.

Порядок действий.

1. Устанавливаем провайдер (драйвер ODBC), устанавливаем сервер FB. Это всё довольно просто — запустили инсталлятор, ответили на пару вопросов. Подвохов там нет. Ставим/распаковываем базу куда-то туда, куда у нас и 1С в нашем аккаунте полный доступ. Единственно что, лучше не на примапленный диск.
2. Настраиваем авторизацию. Тут есть подводный камень: помимо всякой вторичной авторизации, которую обеспечивают софтины на FB, есть собственно авторизация к БД. По умолчанию бывает 3 варианта — либо будет логин SYSDBA и пароль «masterkey» (учтите, иногда его обрезает до «masterke», 8 символов); либо сгенерится некий пароль и запишется в подпапку /OPT того места, куда ставили сервер FB, в спецфайлик; либо просто что-то втихаря сделает. И вот если случится так, то используйте утилиту GSEC из подпапки /BIN установленного FB, см. скрин и пояснения на нём (подробности см. в OdbcFb.chm. Советую поменять пароль на какой-то ваш, чтобы уже не путаться потом.
2. В 1С создаём объект ADODB.Connection и работаем через него. Ему передаём текст запроса на языке FB, от него получаем выборку результата этого запроса, т.е. штатно работаем с FB из 1С.
Для успешного соединения с базой самое важное — правильно скомпоновать строку команды соединения. Эта строка включает указание провайдера, авторизацию, настройки соединения. Именно с ней обычно возникают проблемы. Подробное описание этого дела см. в файле OdbcFb.chm из папки Firebird_ODBC в разделах «Connection attributes» и «Connection examples». Свойство «CursorLocation» желательно ставить равным 3, свойство «ConnectionTimeOut» я ставлю равным 180.

Есть любители работать через DSN — по сути, это поименованное пакетное описание всех тонкостей подключения. В этом случае сначала в настройках ODBC создаётся системный/пользовательский DSN, где всё прописывается один раз, и уже на его имя ссылаются в строке подключения. Я этим не пользуюсь, поэтому подробно рассказывать не буду. Отмечу, что DSN полезен, когда соединение из 1С не срабатывает — можно попробовать сделать DSN с такими же настройками и пощёлкать «Проверить соединение» — если не взлетит и оно, тогда проблема с драйвером и СУБД, с доступом итд, а если сработает — то накосячено что-то в коде 1С.

Пример подключения и инициализации переменной модуля:

&НаКлиенте
Процедура ПодключитьсяКБазе();
мСоединение=Новый COMОбъект("ADODB.Connection");

мСоединение.ConnectionString="driver=Firebird/InterBase(r) driver;
|Dialect=3;
|CHARSET=NONE;
|Uid=SYSDBA;
|Pwd=123;
|Dbname="+СокрЛП(ПутьКБазе);
мСоединение.ConnectionTimeOut=180; // и хватит
мСоединение.CursorLocation=3;

Попытка
мСоединение.Open(мСоединение.ConnectionString);
ПоказатьОповещениеПользователя("ОК",,"Соединение успешно установлено!");
Исключение
Сообщить("Ошибка при установке соединения: "+ОписаниеОшибки());
мСоединение=Неопределено;
КонецПопытки;
КонецПроцедуры


Запрос к БД FB представляет собой по сути диалект SQL, поэтому в нём можно разобраться, просто зная язык запросов 1С. Есть токность: алиасы регистрочувствительны.

Я сделал единую функцию для передачи запросов в неё:

&НаКлиенте
Функция ВыполнитьЗапрос(тз)
Попытка
мрез=Новый Массив;
Если мСоединение=Неопределено Тогда Возврат мрез КонецЕсли;
рез=мСоединение.Execute(тз);
Пока не рез.EOF() Цикл
ОбработкаПрерыванияПользователя();
соот=Новый Соответствие;
Для й=0 По рез.Fields.Count-1 Цикл
итем=рез.Fields(й);
соот.Вставить(СокрЛП(итем.Name),итем.Value);
КонецЦикла;
мрез.Добавить(соот);
рез.MoveNext();
КонецЦикла;
Возврат мрез;
Исключение
Сообщить("Ошибка при выполнении запроса. Текст запроса:"+Символы.ПС+тз+Символы.ПС+"Описание ошибки: "+ОписаниеОшибки());
Возврат Новый Массив;
КонецПопытки;
КонецФункции

Разумеется, для написания запросов надо знать имена и свойства таблиц БД, имена и типы их полей, а также конкретику наполнения. Для этого есть множество вьюшек, отдельных утилит и приблуд, но я написал свою исключительно потому, что хотелось подробнее разобраться и сразу иметь возможность как-то обработать прочитанные данные. Поэтому прилагаю обработку под УФ, которая умеет читать данные о таблицах и их полях, читать содержимое таблиц, исполнять ваши запросы (эдакая мини-консоль запросов FB). Всё в ней изложенное спокойно заработает и на обычных формах.

Закончив работу, не забывайте сделать мСоединение.Close() или просто очистить переменную.

Пока не копал вопрос реляционных связей между таблицами, ключей и индексов. Будет время — постараюсь дополнить эту публикацию и приложенную обработку.

Типы полей имеют цифровую нотацию, которая в обработке представлена — как преобразование в более человекочитаемый вид.

Вот, собственно, и всё. Чтобы быстро изучить базу и вытащить из неё нужные данные, больше ничего и не требуется.

Поскольку ресурсы Интернета имеют свойство исчезать, а ссылки — биться, то основной софт вложен в публикацию.

Полезные ссылки:

http://www.ibase.ru/components/ — разные дистрибутивы софта; наиболее советую http://www.firebirdsql.org/en/odbc-driver/

http://www.firebirdsql.com/file/documentation/reference_manuals/user_manuals/Firebird-1.5-QuickStart-Russian.pdf  — быстрый обзор;

http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird_Language_Reference_RUS.pdf — полное руководство;

http://firebirdsql.su/doku.php?id=sistemnye_tablicy — сведения о системных таблицах (метаданные базы FB), и вообще там много полезного.

НЕ советую связываться с IBProvider. Эта навороченная штуковина себе на уме, легко и просто — с ней может не выйти, возни с ней бывает неоправданно много.

Удачи в интеграции) Авось кому пригодится.

5 Comments

  1. DrAku1a

    Делал такое через самописную ВК (Native API, на Delphi, использует gdi32.dll), не требует дополнительных настроек на клиенте и установки. Если 1С и FB на разных серверах — не требует никаких танцев с бубном. Единственный минус — работает медленно.

    Reply
  2. Yashazz

    (1) Так это ещё надо заморачиваться, ВК писать… И не на каждом компе гарантированно взлетит, ВК, они такие.

    Reply
  3. 1С_Мастер

    А внешние источники данных огнептицу не умеют?

    Reply
  4. Yashazz

    (3) Теоретически должны бы, на практике, лично у меня, не взлетело. Провайдер, вишь, не тот.

    Reply
  5. fuel56

    Спасибо за информацию.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *