Опубликован: 07.05.2010 | Доступ: свободный | Студентов: 2867 / 291 | Оценка: 4.49 / 4.19 | Длительность: 25:58:00
Лекция 23:

Стандартные функции InterBase. UDF

< Лекция 22 || Лекция 23: 12 || Лекция 24 >

UDF

В практике программирования нередко встречаются ситуации, когда программисту недостаточно того набора функций, который предоставлен сервером InterBase. К счастью, InterBase дает возможность создавать и подключать к базе данных собственные функции, которые называются UDF ( User Defined Functions - Функции, определенные пользователем). Прелесть этого механизма в том, что такие функции можно написать на любом языке программирования, включая Delphi, который позволяет делать библиотеки DLL ( Dynamic Link Library - Динамически подключаемые библиотеки). Программист может реализовать в одном или нескольких DLL -файлах множество необходимых ему функций практически любой сложности, затем поместить этот файл (файлы) там, где установлен InterBase. Останется только подключить описанные функции к рабочей базе данных, после чего любую из этих функций можно использовать в запросах на любых клиентских ПК.

Для демонстрации этой возможности как нельзя лучше подойдет функция Upper_Rus, описанная В.В.Фароновым в книге "Программирование баз данных в Delphi7. Учебный курс". Функция преобразует все символы строки в верхний регистр, но в отличие от стандартной Upper, она корректно сработает и с другими наборами символов и порядком сортировки.

Для начала нам нужно создать DLL -файл. Откройте Delphi. В нашем случае нам нужно будет создать отдельный DLL -файл, поэтому создавать его нужно как отдельный проект. Выберите команду меню < File -> Close All >, чтобы закрыть новое приложение, которое Delphi запускает автоматически. Затем выберем команду < File -> New -> Other >. Откроется окно, в котором на вкладке New нам нужно выбрать DLL Wizard:

Выбор "мастера" DLL

Рис. 23.2 . Выбор "мастера" DLL

При этом откроется окно модуля без всяких форм, которое содержит лишь следующий код (комментарии опущены):

library Project1;

uses
  SysUtils,
  Classes;

{$R *.res}

begin
end.

Выберем команду < File -> Save All >, где нам предложат сохранить проект без всяких модулей. Создайте для проекта отдельную папку, а проект назовите Udf_Dll. Далее приводится весь код библиотеки Udf_Dll (без комментариев):

library Udf_Dll;

uses
  SysUtils, Classes;

{$R *.res}

function Upper_Rus(InpString: PChar): PChar; cdecl;
//Функция преобразует буквы входной строки в заглавные
begin
  Result := PChar(ANSIUpperCase(String(InpString)));
end;

exports Upper_Rus;

begin
end.

Поскольку это DLL -проект, который не может работать самостоятельно, выбирать команду Run не нужно. Вместо этого нажмите < Ctrl+F9 >, либо выберите команду < Project -> Compile Udf_Dll >. В результате в указанной вами папке появится файл Udf_Dll.dll.

В приведенном выше коде мы создали функцию Upper_Rus, которая имеет входной и выходной строковые параметры типа PChar (строковый тип Windows ). Кроме того, для правильной работы с InterBase, эта экспортируемая функция задекларирована как cdecl (соглашение о передаче входных параметров). В теле функции входная строка преобразуется в верхний регистр функцией WinAPI ANSIUpperCase, благодаря чему ЛЮБОЙ набор символов (не обязательно русский) будет корректно преобразован в верхний регистр.

В конце мы указываем, что описанная функция Upper_Rus предназначена для экспорта.

Delphi можно закрыть. Полученный файл динамической библиотеки Udf_Dll.dll скопируйте в каталог UDF сервера InterBase (по умолчанию - C:\Program Files\Borland\InterBase\UDF). Если скопировать файл в другой каталог, InterBase его не найдет.

Теперь эту функцию нужно зарегистрировать в базе данных First (сервер InterBase должен быть запущен, утилита IBConsole открыта, база данных First выделена и запущена утилита Interactive SQL ). В окне запросов Interactive SQL укажите следующий запрос:

DECLARE EXTERNAL FUNCTION UPPER_RUS
CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'Upper_Rus'
MODULE_NAME 'UDF_DLL';
COMMIT;

Здесь указан тип строк InterBase CSTRING, что соответствует типу PChar в Delphi, и установлено ограничение в 256 символов. Теперь, если вы посмотрите в дереве серверов IBConsole в разделе " External Functions " нашей БД First, вы увидите зарегистрированную функцию UPPER _RUS.

В Interactive SQL мы можем ввести запрос, показывающий разницу между стандартной функцией UPPER и нашей функцией UPPER _RUS (может потребоваться перезагрузка IBConsole, или хотя бы закрытие ( Disconnect ) и открытие ( Connect ) базы данных First ):

SELECT UPPER(Nazvanie COLLATE WIN1251), UPPER_RUS(Nazvanie COLLATE WIN1251)
FROM Tovar;
Разница работы стандартной UPPER и UPPER_RUS

Рис. 23.3 . Разница работы стандартной UPPER и UPPER_RUS

Как видно из рисунка, там, где стандартная функция UPPER не смогла преобразовать текст в верхний регистр, функция UPPER _RUS с этой задачей справилась. Далее эту функцию можно использовать в пределах базы данных First на любом пользовательском ПК, который подключен к InterBase.

< Лекция 22 || Лекция 23: 12 || Лекция 24 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Максим Козинда
Максим Козинда
Россия, Тюмень, ТюмГАСА, 2009