Odbc firebird как подключить

Odbc firebird как подключить

Имя сервера и путь

Если Вы вдруг решили переместить образец базы данных на другой диск, убедитесь, что он физически подключен к компьютеру. Разделяемые (shared), присоединенные (mapped) диски или (на Unix) смонтированные (mounted) SMB (Samba) файловые системы не будут работать. Это правило касается любых создаваемых Вами баз данных.

При использовании TCP/IP строка подключения состоит из двух частей: имя сервера и путь к файлу. Формат строки имеет следующий вид:

Пример для Linux или другой Posix-системы с именем serverxyz:

Пример для Windows:

Оператор CONNECT

Используем isql

Важно

Если, используя Classic Server под Linux, не указать имя хоста, будет предпринята попытка организовать прямое локальное соединение. Что, в свою очередь, может закончиться неудачей в случае отсутствия у текущей учетной записи Linux необходимых прав доступа к файлу базы данных. В этом случае попробуйте подключиться к localhost: /

. В этом случае файл будет открывать серверный процесс (который в Firebird 1.5 обычно работает от имени firebird). С другой стороны, попытка сетевого соединения может закончиться неудачно, если пользователь создавал базу данных при локальном подключении и у сервера нет необходимых прав.

В случае использования Classic Server под Windows, Вы должны указывать имя хоста (это может быть localhost) и полный путь, в противном случае подключиться не получиться.

Замечание

Несмотря на то, что в Firebird « нормальными » символами разделения строк являются одинарные кавычки, в примере, при указании пути к базе данных, использовались двойные кавычки. Это необходимо, так же как и в некоторых других утилитах командной строки, при указании путей, содержащих пробелы. Одинарные кавычки будут работать для путей, не содержащих пробелы.

Кавычки вокруг « SYSDBA » и « masterkey » необязательны. Также не обязательно заключать в кавычки путь к базе данных, не содержащий пробелов.

Далее isql сообщит о том, что Вы подключились:

Теперь Вы можете продолжить эксперименты с базой employee.fdb. isql означает interactive SQL [utility] (интерактивный SQL). Вы можете использовать её для извлечения данных, получения метаинформации, создания объектов базы данных, запуска скриптов и многого другого.

Для того, чтобы вернуться в командную строку наберите

За дополнительной информацией об использовании isql обращайтесь к Using Firebird, глава 10: Interactive SQL Utility (isql).

Используем графические утилиты

Замечание

Существуют средства, в которых имя сервера + полный путь ожидаются в виде одной строки

Помните, что на Linux и других Posix-системах имена файлов и названия команд являются чувствительными к регистру

Источник

Подключение к InterBase или Firebird из Excel через ODBC

Для начала нужно установить драйвер ODBC для Firebird или InterBase (разумеется, перед этим нужно убедиться, что на компьютер уже установлена клиентская часть InterBase или Firebird).

Пример для InterBase DataDirect ODBC

Разумеется, если Firebird или InterBase (как сервер) установлены у вас на компьютере, вы можете указывать параметр «База данных» как c:\dir\data.gdb или localhost:c:\dir\data.gdb

Указание localhost: избавит вас от проблем, если вы запутались с клиентскими библиотеками Firebird и InterBase (и получили ошибку unavailable database).

Если на локальной машине Firebird или InterBase нет, то вместо localhost вы указываете имя сервера.

Нажмите на кнопку «Проверка соединения». Если все указано правильно, драйвер сообщит, что соединение прошло успешно. Нажмите Ok. В списке System DSN появится алиас EMPLOYEE.

Помните, что в цепочке приложение-драйвер-клиент все должно быть одной разрядности. Например, 32-разрядный Excel не будет работать с 64разрядным ODBC, а 32разрядный ODBC не будет работать с 64-разрядным клиентом Firebird или InterBase.

Запустите Excel. Выберите меню Данные, Импорт внешних данных, Создать запрос.

Выберите алиас EMPLOYEE.

Теперь можно выбрать таблицы и их столбцы, входящие в запрос.

Можно особо не мучиться, выбрать один столбец любой таблицы и пару раз нажать Next. На третий раз появится диалог:

Легче построить запрос в Microsoft Query, чем заполнять столбцы в самом первом диалоге Мастера запросов.

Здесь уже намного легче выбрать столбцы, добавить условия, добавить таблицы, определить между ними связи, или вообще ввести готовый оператор SQL вручную.

После проверки запроса необходимо обязательно сохранить запрос (кнопка с изображением дискеты). Запрос будет сохранен вместе со всеми параметрами алиаса, поэтому для «распространения» запроса на несколько компьютеров вовсе необязательно создавать алиас ODBC на каждом (конечно, ODBC-драйвер и клиентскую часть IB/FB все равно придется устанавливать на этих компьютерах).

По умолчанию Microsoft Query сохраняет запросы в каталог C:\Documents and Settings\Administrator\Application Data\Microsoft\Запросы в виде текстового файла с расширением qry (вместо Administrator в пути может быть имя пользователя данного компьютера).

После формирования запроса (и его сохранения) нужно нажать на кнопку с изображением двери

И после нажатия OK мы получим данные в таблице Excel:

Для изменения запроса можно вернуться в меню Данные, Импорт внешних данных, Изменить запрос. Предупреждающее сообщение про Мастер запросов можно игнорировать – откроется Microsoft Query, в котором можно будет визуально изменить исходный запрос.

Надо заметить, что сделать вид данных ближе к пользователю можно (похоже что) только в третьем диалекте, например, заменив имя столбцов Last_Name и First_Name на имена в двойных кавычках – «Фамилия» и «Имя».

Источник

Работа с FireBird из 1С. Сборник проверенных рецептов


Здравствуйте.
Этот материал призван обобщить и показать основные техники и приемы для работы с базами данных InterBase/FireBird из программ, запускаемых на платформе 1С. Почти все, что изложено здесь, так или иначе встречается в других интернет-источниках. Однако в этой статье материал достаточно полный. Возможно, что-то из заявленной темы и упущено, но все равно, изложенного материала (в моем понимании) достаточно для решения большинства задач (кстати, кое-что не получилось – может кто-нибудь подскажет решение, и можно будет дополнить материал). Кроме того, демонстрационный пример, приложенный к статье, может быть использован желающими в качестве каркаса для разработки собственных подобных программ. Несмотря на то, что большинство задач по доступу из 1С к сторонним базам ограничиваются необходимостью загрузить какие-либо данные из смежной информационной системы, мы покажем здесь более разнообразные варианты доступа к базам, в том числе различные виды записи информации в БД.
В этой публикации будет рассказано о том:
— как подключиться к серверу (базе) и отключиться при завершении работы;
— как выполнять SQL-запросы (принимать и передавать данные, в том числе и те, которые не могут быть размещены непосредственно в тексте запроса (длинные строки, BLOB-поля));
— как выполнять преобразование данных, в т.ч. текстовых кодировок, при передаче данных в базу и из базы;
— как обращаться к серверной логике базы (вызывать хранимые процедуры);
— как защитить свою программу от автоматического разрыва TCP-соединения сервером БД;
— прочие интересные приемы, связанные с программированием вообще (как сделать все вышеперечисленные действия удобно, надежно и переносимо).

Демонстрационный пример получился весьма большим. Тем не менее, структура программы достаточно четкая – так что разобраться вполне реально.
В программе (это внешняя обработка) активно используется особый прием структурного программирования, условно названный «ООП в 1С» (подробнее описано здесь). По сути, почти весь общий модуль обработки (часть программы, не связанная непосредственно с интерфейсом пользователя) состоит из таких структур.
Также использована такая интерфейсная «приспособа», как «список информационных сообщений» (подробнее описано здесь).

Программа проверялась на версиях FireBird 1.5 и FireBird 2.1. Скорее всего, будет работать и для любой другой версии СУБД. Данный механизм доступа к базе использует технологию ADO. Соответственно, на компьютере, где запускается клиент 1С, должен быть установлен драйвер «Firebird_ODBC», а также клиентская библиотека «gds32.dll».

Полные исходные тексты программы приводить не буду (даже исходные тексты отдельных классов будут приведены с сокращениями). Для просмотра исходных текстов лучше открыть тестовый пример непосредственно в 1С – качество просмотра будет гораздо выше, чем то, что доступно средствами HTML-публикации.

READ  Как подключить ноут к сети через кабель

Постановка задачи (суть демонстрационного примера).

Будем в качестве примера рассматривать несложную информационную систему, условно названную «Записная книжка». Она чем-то будет подобна справочнику, который можно создать в платформе. У нас будет справочник контактной информации. В справочнике будет дерево групп (каталогов) – можно будет создавать произвольное дерево любой вложенности. В качестве элементов такого справочника будут выступать так называемые «Карточки», т.е. собственно сами записи с контактной информацией. Кроме того, в этой информационной системе будут пользователи (учетные записи) со своими правами доступа. Поиска нет (только ввод данных и навигация по дереву групп). Какой-либо привязки пользователей к тем данным, что они вводили (наподобие поля ОсновнойОтветственный в документах типовых решений 1С) тоже нет, а также нет логирования (журнализации) действий пользователей. Для демонстрации работы с базой этого функционала достаточно, а еще более усложнять реализацию пользовательского интерфейса просто не хотелось.

Вот как это приложение будет выглядеть (покажем на серии слайдов-скриншотов):
Главное окно программы:

Вверху находится главное меню и панель инструментов с командами.
В середине находятся основные элементы отображения справочника контактов: в левой колонке – дерево групп справочника, а в правой колонке – содержимое (группы и элементы) текущей (выделенной в левой колонке) группы.
Внизу находится поле для вывода сообщений, возникающих в процессе работы программы (в данном случае, это сообщения об ошибках).

Далее будем считать, что:
— «Текущая группа» — это группа, выбранная в дереве групп (в левой колонке);
— «Содержимое текущей группы» — это список групп и элементов, отображаемый в правой колонке;
— «Текущий объект текущей группы» — это группа или элемент, выбранный в правой колонке;

Все команды (добавить, редактировать, удалить, переместить) относятся к содержимому правой колонки (либо к текущей группе, либо к текущему элементу текущей группы) – как и в стандартном интерфейсе работы со справочниками 1С.

Диалог выполнения подключения:
(Команда: «База»→«Подключение»)

Окно программы после подключения к базе:

Диалог настройки профилей подключения к базам:
(Команда: «Настройки»→«Профили подключения»)

Диалог смены пароля:
(Команда: «Настройки»→«Смена пароля»)

Настройки списка пользователей:
(Команда: «Настройки»→«Список пользователей»)

Редактирование группы справочника контактов:
(Команды: «Действия»→«Новая группа», «Действия»→«Скопировать», «Действия»→«Изменить»)

Редактирование элемента справочника контактов (карточки):
(Команды: «Действия»→«Добавить», «Действия»→«Скопировать», «Действия»→«Изменить»)

Диалог выбора группы в дереве групп:
Используется для указания родительской группы в диалогах редактирования группы и карточки, а также для указания группы на значения при перемещении текущего объекта текущей группы (объекта, выбранного в правом списке главного окна программы) в новую группу.

Структура базы данных.

Основные сущности системы:
1. Справочник пользователей системы (учетных записей). Состоит только из элементов (учетных записей). Соответственно в базе представляется одной таблицей.
2. Собственно сам целевой справочник контактной информации. Состоит из групп (дерево справочника) и элементов (карточек). В базе справочник будет представлен отдельной таблицей групп (в ней будет храниться дерево уровней справочника) и отдельной таблицей элементов (в ней будут храниться сами карточки с контактами).

В базе данных создадим следующие таблицы:
— таблица «GROUPS» — хранение дерева групп;

Название поля Тип данных Описание
GRID INTEGER Идентификатор записи в таблице – идентификатор узла дерева (все значения >0).
PGRID INTEGER Идентификатор родительского узла. Таким образом, устанавливается связь между узлами в единое дерево. Значение 0 означает, что данный узел входит в «корень» дерева. Сам корень в базе не хранится (он всегда есть в программе – его нельзя изменить).
GRNAME VARCHAR(255) Наименование узла дерева. Уникальность этих значений (в пределах таблицы) не отслеживается, как и в справочниках 1С.

— таблица «CARDS» — хранение элементов справочника – карточек с контактными данными;

Название поля Тип данных Описание
CDID INTEGER Идентификатор записи в таблице – идентификатор карточки (все значения >0).
GRID INTEGER Идентификатор родительского узла дерева (ссылка на GROUPS.GRID). Таким образом, устанавливается связь карточки с деревом. Значение 0 означает, что данная карточка входит в «корень» дерева (хотя в таблице GROUPS записи с GRID=0 нет).
GRNAME VARCHAR(255) Наименование карточки. Уникальность этих значений (в пределах таблицы) не отслеживается, как и в справочниках 1С.
CDDESCRIPT VARCHAR(255) Поле карточки «Описание».
CDCONTACTS BLOB (TEXT – 1) Контактная информация. По факту текстовое поле в виде типа MEMO – большой текст переменной длины, хранимый отдельно от основной таблицы. К нему применяются все правила автоматической работы с кодировками (как у CHAR и VARCHAR).
CDNOTE BLOB (BINARY – 0) Примечания. По факту текстовое поле, но описано как бинарный BLOB. Так делать не следует, но поскольку формат базы данных часто выбираем не мы, то такой вариант вполне возможен. На этом примере покажем, как работать с текстом (кодировками) в случае, если база данных не знает о том, что это текст.
CDIMAGE BLOB (BINARY – 0) Здесь хранится изображение, прикрепленное к карточке. По факту содержит тоже самое, что и соответствующий графический файл.

— таблица «USERS» — учетные данные информационной системы;

Название поля Тип данных Описание
UID INTEGER Идентификатор записи в таблице.
UNAME VARCHAR(255) Название учетной записи пользователя (логин). Программа контролирует уникальность (в пределах таблицы) этого поля (без учета регистра символов – т.е. при наличии пользователя «admin», учетную запись «AdMiN» создать нельзя).
UPWD VARCHAR(255) Пароль пользователя (хранится в открытом виде, т.к. функция md5 отсутствует в младших версиях FireBird, а реализация этого алгоритма в 1С тоже объемная – не хотелось «заморачиваться»).
URIGHTS VARCHAR(255) Полномочия пользователя – строка из символов «0» и «1», которые находясь в соответствующей позиции, показывают отсутствие («0») или наличие («1») соответствующих полномочий у пользователя.
В данной версии используются следующие права пользователя:
-позиция 1 – возможность просматривать данные;
-позиция 2 – возможность редактировать данные;
-позиция 3 – возможность редактировать список пользователей (администрирование)

Также в базе будут размещены следующие хранимые процедуры:

Название процедуры Название параметра Тип параметра Описание
SAVE_GROUP Процедура выполняет сохранение (добавление или обновление) группы в базу.
Входные параметры:
GRID INTEGER Идентификатор сохраняемой группы (0, если группа не сохранялась ранее)
PGRID INTEGER Идентификатор родительской группы
GRNAME VARCHAR(255) Название группы
Выходные параметры:
RESULT INTEGER Идентификатор сохраненной группы, если ее удалось сохранить;
0 — если группа не была сохранена
ERRMSG VARCHAR(255) Текст сообщения об ошибке, если ошибка произошла (RESULT=0)
DELETE_GROUP Процедура выполняет удаление группы из базы.
Входные параметры:
GRID INTEGER Идентификатор удаляемой группы
Выходные параметры:
RESULT INTEGER Идентификатор удаленной группы, если ее удалось удалить;
0 — если группа не была удалена
ERRMSG VARCHAR(255) Текст сообщения об ошибке, если ошибка произошла (RESULT=0)
MOVE_GROUP_TO_GROUP Процедура выполняет перенос указанной группы и всего ее содержимого (подгрупп и вложенных карточек) в другую указанную группу.
Входные параметры:
SRC_GRID INTEGER Идентификатор группы, которую нужно перенести
DST_GRID INTEGER Идентификатор группы, в которую нужно перенести исходную группу
Выходные параметры:
RESULT INTEGER Идентификатор группы (SRC_GRID), если она была перенесена;
0 — если перенос группы не состоялся (она не была перенесена)
ERRMSG VARCHAR(255) Текст сообщения об ошибке, если ошибка произошла (RESULT=0)
MOVE_GROUP_CONTENTS_TO_GROUP Процедура выполняет перенос содержимого указанной группы (подгрупп и вложенных карточек) в другую указанную группу. При этом сама исходная группа остается на прежнем месте.
Входные параметры:
SRC_GRID INTEGER Идентификатор группы, содержимое которой нужно перенести
DST_GRID INTEGER Идентификатор группы, в которую нужно перенести содержимое группы
Выходные параметры:
RESULT INTEGER Идентификатор группы (SRC_GRID), если ее содержимое было перенесено;
0 — если перенос содержимого группы не состоялся
ERRMSG VARCHAR(255) Текст сообщения об ошибке, если ошибка произошла (RESULT=0)
MOVE_CARD_TO_GROUP Процедура выполняет перенос карточки в указанную группу.
Входные параметры:
SRC_CDID INTEGER Идентификатор карточки, которую нужно перенести
DST_GRID INTEGER Идентификатор группы, в которую нужно перенести карточку
Выходные параметры:
RESULT INTEGER Идентификатор карточки (SRC_CDID), если она была перенесена;
0 — если перенос карточки не состоялся (она не была перенесена)
ERRMSG VARCHAR(255) Текст сообщения об ошибке, если ошибка произошла (RESULT=0)
TEST_GROUP_PARENT_HIERARCHY Процедура проверяет, является ли группа PGRID иерархическим (возможно через несколько промежуточных узлов) родителем группы GRID или нет. Данная процедура не вызывается из программы, а используется в других процедурах.
Входные параметры:
GRID INTEGER Идентификатор группы, вхождение которой в группу PGRID нужно проверить
PGRID INTEGER Идентификатор группы, вхождение в которую группы GRID нужно проверить
Выходные параметры:
RESULT SMALLINT Результат проверки:
1 — если группа PGRID является иерархическим родителем группы GRID;
0 — если группа PGRID не является родителем группы GRID
READ  Sanoff выключатель как подключить

Процедур для работы с карточками (SAVE_CARD, DELETE_CARD) и пользователями (SAVE_USER, DELETE_USER) не будет. Реализуем их функционал непосредственно в 1С, чтобы показать вызов из 1С не только хранимых процедур, но и разнообразных запросов.

Представление сущностей информационной системы в программе.

В нашей системе есть следующие информационные сущности:
группа справочника контактов (набор групп, образующих дерево (поддерево) групп – полное или частичное представление данных таблицы GROUPS);
элемент (карточка) справочника контактов (набор карточек – полное или частичное представление данных таблицы CARDS);
учетная запись системы (набор учетных записей – полное или частичное представление данных таблицы USERS)

Модель представлена в коде 1С следующими классами:
BaseObj (БазоваяСущность) – класс – абстрактный родитель для всех остальных классов из данной группы. Содержит общие поля и методы.
ObjGroup (СущностьГруппа) – потомок от BaseObj, представляет собой реализацию сущности «группа справочника контактов».
ObjCard (СущностьКарточка) – потомок от BaseObj, представляет собой реализацию сущности «элемент справочника контактов».
ObjUser (СущностьПользователь) – потомок от BaseObj, представляет собой реализацию сущности «пользователь системы».
ObjSet (НаборОбъектов) – тоже потомок от BaseObj, но является не сущностью, а универсальной коллекцией сущностей, которой можно представить набор из объектов любого типа (ObjGroup, ObjCard, ObjUser). Естественно, что нельзя смешивать в одном наборе сущности разных типов.

Соответствующая реализация этих классов в 1С будет выглядеть так:

Работа с базой данных. Технология ADO.

Для доступа к базе мы используем технологию, которая наиболее хорошо описана в Интернете применительно к 1С – «Microsoft ADO». И это конечно разумно, т.к. данная технология самая стабильно доступная на компьютерах с Windows. Это не только 1С касается, а также других средств разработки, например «Visual Studio». Это программисты Delphi привыкли к разнообразию технологий работы с БД. У остальных разработчиков выбор средств более ограничен. Описывать ADO как таковую я не буду, так как в Интернете очень много отличных статей накопилось, за последние 10-15 лет. Мы рассмотрим те интерфейсы и типы данных, которые понадобятся нам для реализации, описанной в этой статье (подробности смотрите в документации MSDN).

Название интерфейса Описание Используемые свойства и методы
Connection Обеспечивает подключение к базе данных. State (свойство) — показывает текущее состояние подключения (установлено или нет);

Open (метод) — позволяет установить подключение к базе;
Close (метод) – выполняет отключение от базы

Command Обеспечивает выполнение команд (нас интересуют только SQL-запросы) в рамках указанного подключения (Connection). ActiveConnection (свойство) – указывает на подключение, с которым связан объект выполнения команд;
CommandType (свойство) – указывает тип команды (нас интересует тип – «SQL-запрос»);
CommandText (свойство) – текст команды (в нашем случае – текст запроса);
Parameters (свойство) – коллекция параметров команды (запроса) для передачи данных в базу;

Execute (метод) – выполняет команду (запрос). Возвращает результирующий набор данных;
CreateParameter (метод) – позволяет создать новый параметр команды (запроса)

Recordset Набор данных (таблица), получаемый в результате выполнения запроса. Обеспечивает передачу данных из базы в клиентское приложение. State (свойство) – показывает состояние набора данных (доступен или нет);
EOF (свойство) – признак конца набора данных (показывает, стоит внутренний указатель на последней строке набора или нет);
Fields (свойство) – коллекция полей – доступ к колонкам текущей строки набора;

MoveNext (метод) – сдвигает внутренний указатель набора на одну строку в направлении конца набора;
Close (метод) – закрывает набор данных

Fields Коллекция полей, обеспечивающая доступ к полям текущей строки набора данных. Fields(FieldInd), Fields(FieldName) – доступ к конкретному полю Field по его индексу (порядковому номеру) или по имени (строковое значение имени поля)
Field Поле, обеспечивающее доступ к колонке текущей строки набора данных. Value (свойство) – значение поля (дает доступ к значению соответствующей колонки текущей строки связанного набора Recordset)
Parameters Коллекция значений, представляющая собой параметры запроса – для передачи данных от клиентского приложения в базу. Count (свойство) – показывает количество параметров в коллекции;

Append (метод) – добавляет параметр в конец коллекции;
Delete (метод) – удаляет указанный параметр из коллекции

Полное описание типов данных ADO, используемых в этой программе, приведено ниже:

Работа с базой данных. Подпрограммы на 1С.

Для удобства работы пользователей с несколькими базами предусмотрены «Профили подключения», т.е. группы параметров, связанных с базой, объединенные под одним именем. Чаще всего это параметры подключения к СУБД (адрес сервера БД, имя базы, логин и пароль для подключения к базе на уровне СУБД), но возможно добавить какие-то другие параметры
Для работы с профилями существуют классы: «ПрофильПодключенияКБазе» и «ПрофилиПодключенияКБазам» в главном модуле обработки, а также форма «ФормаНастройкиПрофилейПодключений», реализующая диалог для редактирования профилей. Все это можно посмотреть в демонстрационном примере. Область применения данного функционала – это программы для доступа к любой внешней базе на любой СУБД.

Основной класс для работы с базой данных – это класс «ПодключениеКБазе». Он позволяет выполнять подключение-отключение к БД и выполнять запросы.

Также удобным вспомогательным средством является класс «НаборПараметровЗапроса». Этот набор позволяет удобным образом встраивать различные значения в текст SQL-запросов. Мы готовим шаблон запроса, добавляем в набор именованные значения (параметры), а затем обрабатываем шаблон текста запроса, содержащий указания на то, в каком месте вставлять то или иное значение запроса. Набор обрабатывает шаблон запроса, подставляет в него конкретные значения и таким образом получает окончательный текст запроса. В шаблоне запроса место подстановки значения параметра указывается как : имя_параметра (двоеточие, а затем название параметра – так это делается в Delphi).
Вот как это выглядит на примере:

Более подробно использование этого механизма (шаблоны запросов) можно посмотреть в демонстрационном примере в подпрограммах класса «ПодкБазе», начиная с функции «ПодкБазе_SelectGroup».

Набор параметров анализирует тип значения (понимает «Неопределено», «Число», «Строка», «Дата», «Булево») и подставляет значения в запрос в синтаксисе, корректном для данной СУБД.

Исходный текст класса «НаборПараметровЗапроса»:

Итак, рассмотрим, наконец, основной класс работы с БД – класс «ПодключениеКБазе».
Класс имеет в своем составе следующие подпрограммы:

Название подпрограммы Описание Примечание
Группа подпрограмм общего назначения. Здесь конструктор объекта, подпрограммы подключения к БД и отключения от БД, а также подпрограммы, возвращающие текущие значения общих свойств объекта.
Функция ПодкБазе_СоздатьОбъект() Создание структуры объекта
Функция ПодкБазе_Конструктор() Конструктор объекта
Процедура ПодкБазе_Деструктор(ПодкБазе) Деструктор объекта
Функция ПодкБазе_GetDBAddr(ПодкБазе) Возвращает адрес базы данных
Функция ПодкБазе_GetDBUserName(ПодкБазе) Возвращает имя пользователя сервера БД, с помощью которого подключились
Функция ПодкБазе_GetConnect(ПодкБазе) Возвращает признак установки соединения с базой
Функция ПодкБазе_ConnectToDB(ПодкБазе, FBDBAddr, FBUserName, FBUserPass) Выполняет подключение к серверу БД
Процедура ПодкБазе_Disconnect(ПодкБазе) Производит отключение от базы
Функция ПодкБазе_GetUserRegister(ПодкБазе) Возвращает признак регистрации пользователя
Функция ПодкБазе_RegisterUser (ПодкБазе, UserName, UserPass) Выполняет регистрацию пользователя Проверяет учетные данные пользователя в системе
Процедура ПодкБазе_UnregisterUser(ПодкБазе) Закрывает сеанс текущего пользователя
Функция ПодкБазе_GetRegLogin(ПодкБазе) Возвращает логин пользователя в системе, указанный при авторизации
Функция ПодкБазе_GetUserID(ПодкБазе) Возвращает идентификатор учетной записи в базе для текущего зарегистрированного пользователя
Функция ПодкБазе_GetUserName(ПодкБазе) Возвращает название учетной записи в базе для текущего зарегистрированного пользователя
Функция ПодкБазе_GetUserRights(ПодкБазе) Возвращает маску прав текущего пользователя
Функция ПодкБазе_TestUserRight(ПодкБазе, RightIndex) Проверяет, обладает ли текущий пользователь указанным правом
Функция ПодкБазе_GetErrorMsg(ПодкБазе) Возвращает сообщение о последней возникшей ошибке.
Группа подпрограмм, предназначенных для непосредственного выполнения команд ADO – непосредственного выполнения запросов без каких-либо дополнительных логических проверок. Однако выполняется проверка существования соединения с БД (защита от разрыва соединения).
Процедура ПодкБазе_ClearCommandParameters(ПодкБазе) Выполняет очистку набора параметров ADODB.Command
Функция ПодкБазе_ExecSQL(ПодкБазе, ТекстЗапроса) Выполняет SQL-запрос, не
возвращающий набор данных
Функция ПодкБазе_GetRecordSet(ПодкБазе, ТекстЗапроса) Выполняет SQL-запрос, который
возвращает набор данных
Функция ПодкБазе_CheckRestConnect(ПодкБазе, ТестОбязат=Ложь) Выполняет проверку работоспособности соединения с сервером.
Группа подпрограмм для выполнения запросов к базе более высокого логического уровня, по сравнению с предыдущей группой. Здесь проверяется права пользователя на доступ к данным.
Функция ПодкБазе_CheckRights(ПодкБазе, RightsMask=»») Выполняет проверку прав доступа к информации в базе.
Функция ПодкБазе_SelectDataSet(ПодкБазе, ТекстЗапроса, DstDataSet, RightsMask=»») Выполняет операцию по выборке данных из базы в набор данных
Функция ПодкБазе_SelectSingleVal(ПодкБазе, ТекстЗапроса, OutVal, OutValName, RightsMask=»») Выполняет операцию по выборке из базы одного единственного значения
Функция ПодкБазе_SelectPair(ПодкБазе, ТекстЗапроса, OutVal1, OutVal2, OutValName1, OutValName2, RightsMask=»») Выполняет операцию по выборке из базы пары значений
Функция ПодкБазе_SelectList(ПодкБазе, ТекстЗапроса, List, RightsMask=»») Выполняет операцию по выборке данных из базы в список значений
Функция ПодкБазе_SelectListPair(ПодкБазе, ТекстЗапроса, List, RightsMask=»») Выполняет операцию по выборке данных из базы в список пар значений
Функция ПодкБазе_SelectObject(ПодкБазе, ТекстЗапроса, Obj, RightsMask=»») Выполняет операцию по выборке данных из базы в объект
Функция ПодкБазе_SelectObjects(ПодкБазе, ТекстЗапроса, ClassID, ObjectsSet, RightsMask=»») Выполняет операцию по выборке данных из базы в набор объектов
Функция ПодкБазе_WriteQuery(ПодкБазе, ТекстЗапроса, RightsMask=»») Выполняет операцию по записи в базу данных без возврата результата
Группа непосредственно прикладных вызовов, с помощью которых функционал верхнего уровня выполняет необходимые действия с моделью данных.
Функция ПодкБазе_SelectGroup(ПодкБазе, GRID, ObjGroup) Загружает поля указанной группы
Функция ПодкБазе_SelectGroups(ПодкБазе, PGRID, ObjSetGroups) Загружает набор групп, входящих в указанную группу
Функция ПодкБазе_SelectCard(ПодкБазе, CDID, ObjCard) Загружает поля указанной карточки с контактной информацией
Функция ПодкБазе_SelectCardsNames(ПодкБазе, GRID, ObjSetCards) Загружает набор карточек, входящих в указанную группу Загружаются только заголовки карточек (BLOB-поля не загружаются)
Функция ПодкБазе_SelectUser(ПодкБазе, UID, ObjUser) Загружает поля указанного пользователя
Функция ПодкБазе_SelectUsers(ПодкБазе, ObjSetUsers) Загружает набор пользователей — все пользователи системы
Функция ПодкБазе_SaveGroup(ПодкБазе, ObjGroup) Сохраняет в базу группу — выполняет INSERT для нового объекта и UPDATE для уже существующего
Функция ПодкБазе_DeleteGroup(ПодкБазе, GRID) Удаляет из базы группу и все её содержимое (подгруппы и карточки)
Функция ПодкБазе_SaveCard(ПодкБазе, ObjCard) Сохраняет в базу карточку — выполняет INSERT для нового объекта и UPDATE для уже существующего.
Функция ПодкБазе_DeleteCard(ПодкБазе, CDID) Удаляет из базы указанную карточку
Функция ПодкБазе_MoveGroupToGroup(ПодкБазе, SrcGRID, DstGRID) Перемещает указанную группу и все ее содержимое в другую группу. Сама группа при этом остается на прежнем месте.
Функция ПодкБазе_MoveGroupContentsToGroup(ПодкБазе, SrcGRID, DstGRID) Перемещает содержимое указанной группы в другую группу. Сама группа при этом остается на прежнем месте.
Функция ПодкБазе_MoveCardToGroup(ПодкБазе, SrcCDID, DstGRID) Перемещает указанную карточку в другую группу.
Функция ПодкБазе_UpdatePassword(ПодкБазе, OldPassword, NewPassword) Выполняет обновление (перезапись в базу) пароля текущего пользователя сеанса.
Функция ПодкБазе_SaveUsers(ПодкБазе, ObjSetUsers, DelUsersIDs) Сохраняет в базу набор пользователей — выполняет INSERT для новых объектов и UPDATE
для уже существующих. Также удаляет указанных пользователей — выполняет DELETE.

Рассмотрим основные подпрограммы, непосредственно связанные с работой через ADO:
установление соединения и регистрация пользователя (имеется в виду не пользователь БД, а внутренний пользователь системы) – функции «ПодкБазе_ConnectToDB», «ПодкБазе_RegisterUser».
Установление соединения проходит следующие этапы (переход к последующему этапу происходит при успешном окончании предыдущего, а иначе весь процесс завершается с ошибкой):
— подключение к СУБД через «ADODB.Connection»;
— создание объекта выполнения команд «ADODB.Command» через установленное подключение. Все наши команды – это всегда произвольные SQL-запросы (CommandType = CommandTypeEnum.adCmdText). Другие типы команд (таблицы, хранимые процедуры и т.д.) никогда не используем;
— проверка корректности базы, того что подключенная база именно данной информационной системы (в нашем случае просто проверяем наличие нужных таблиц в базе).
Регистрация пользователя состоит из проверки наличия указанной при регистрации учетной записи и ее пароля в базе. Если такой пользователь в базе существует, то в объекте подключения выставляются соответствующие поля в значение успеха авторизации пользователя.
Исходный текст описанных функций:

Вспомогательные подпрограммы для работы с BLOB-параметрами.

В InterBase/FireBird существует 2 типа BLOB-полей: TEXT и BINARY.
TEXT – это по сути тоже, что и MEMO в других СУБД. Это текст неопределенной размерности, который хранится отдельно от основной таблицы. С ним через ADO можно работать также, как и с CHAR/ VARCHAR – как с текстовой строкой (все перекодировки выполняются автоматически). На уровне SQL – можно делать сравнение с другими текстовыми строками (операторы сравнения и LIKE). В нашей базе есть одно такое поле – это «CARDS.CDCONTACTS».
BINARY – это классический BLOB, как в других СУБД. Набор произвольных байт неопределенной размерности, который хранится отдельно от основной таблицы. Значение такого поля между 1С и СУБД («ADO.Recordset», «ADO.Parameters») в обоих направлениях передаются через массив COMSafeArray (массив одинарной размерности из однобайтовых чисел).
Текст в таких полях лучше не хранить, но в реальности это встречается сплошь и рядом. Для примера и в нашей базе есть такое поле – это «CARDS.CDNOTE». База ничего не знает о том, что в этом поле текст – все перекодировки нужно выполнять вручную. В базе будем хранить текст в кодировке WIN-1251, а у 1С тип данных «Строка» – в кодировке UTF-8. Для преобразования текста будем использовать следующие подпрограммы:

Также в поле типа BLOB(BINARY) мы храним графическое изображение (картинку) — «CARDS.CDIMAGE». Здесь уже перекодировки не нужны, но возникает проблема обмена данными между объектами классов «Картинка» и «COMSafeArray». «COMSafeArray» может обмениваться данными с объектом «Массив». «Картинка» может обмениваться данными либо с файлом на диске, либо с объектом «ДвоичныеДанные», который в свою очередь может обмениваться данными со строками в формате «BASE64» с помощью встроенных в платформу функций «Base64Значение» и «Base64Строка». Поначалу хотел обойтись оперативной памятью (не задействовав файлы) и решил работать по схеме: «COMSafeArray»«Массив»«ДвоичныеДанные»«Картинка». Для этого написал функции «МассивБайтВСтрокуBase64» и «СтрокаBase64ВМассивБайт».
Таким образом, получился следующий код:

Из этой затеи ничего не вышло, так как функции «МассивБайтВСтрокуBase64» и «СтрокаBase64ВМассивБайт» оказались слишком медленными, и преобразование картинок размером даже в несколько десятков килобайт выполнялось десятки секунд. Я так и не докопался до причины – можно ли было улучшить мой алгоритм или все упиралось в ограничения платформы (исполнение через интерпретатор + необходимость работы со строками через функцию «Сред» (т.к. нет индексного доступа к символам строки, т.к. типа данных «Символ» тоже нет), а также функцию «Найти»). В общем, в конечном итоге решил делать обмен данными «как все» «COMSafeArray»«Файл» «Картинка». Для сохранения в файл и загрузки из файла использовал также по рекомендациям из Интернета – COM-объект «ADO.Stream». В результате, преобразование выполняется практически мгновенно. Вот этот код:

Замечание по интерфейсу программы.

Как конкретно используются эти подпрограммы можно посмотреть в коде модулей соответствующих форм (например, модуля главной формы) из демонстрационного примера.

Еще одно замечание. Для сокращения времени построения дерева групп (имеет значение при деревьях большого размера), дерево не считывается из базы целиком сразу, а одновременно загружаются только 2 уровня вложенности в текущую раскрытую группу (1-й уровень вложенности соответственно виден пользователю как содержимое раскрытого узла, а 2-й уровень нужен для того, чтобы показать в интерфейсе, есть ли у узлов 1-го уровня содержимое – можно ли их раскрывать). Кроме того, уровни, которые уже были загружены из базы, не считываются из нее повторно. Полностью перестроить дерево можно только общей командой «Обновить». А так, в процессе навигации, сигналом для «догрузки» очередной порции дерева из базы в модель данных и интерфейс, является событие «ПередРазворачиванием» для узла группы. Все это реализуется несложно, как можно увидеть из демонстрационного примера.

Резюме по работе с FireBird.

Итак, соберем еще раз в кучу все приемы работы с FireBird из данной статьи:
1. Установка соединения с базой, работа с командами, отключение от базы:
— вначале при подключении к базе создаем один объект «ADO.Connection» и один объект «ADO.Command» и используем их на протяжении всего сеанса;
— всю работу с базой ведем только через SQL-запросы (другие виды команд не используем)

— при отключении от базы – закрываем соединение, проверяя, что оно не было закрыто ранее

Источник

Поделиться с друзьями
Как подключить и установить...
Adblock
detector