StoredProc становится удобнее

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Павел

Примерно через неделю после того, как программист впервые сталкивается с компонентом TStoredProc, предназначенным для вызова хранимых процедур БД, приходит понимание, что для работы с процедурами, которые не возвращают наборов данных (курсоров) лучше работать через один и тот же компонент, просто перенастраивая его. Итогом становится нагромождение однотипных строк кода, которые делают одно и то же. Сэкономлю вам еще одну неделю и предложу метод, который позволяет, как минимум, сократить количество строк, которые надо писать для вызова хранимых процедур.

Решение

Из чего же состоит процесс работы с компонентом TStoredProc? Часто это расподготовка (UnPrepare), присвоение имени хранимой процедуры, подготовка к запуску (Prepare), установка параметров, запуск и, наконец, получение результата.

Автоматизировать данные действия я предлагаю с помощью одной процедуры и одной функции, которыми и сам нередко пользуюсь. Рекомендую их прописать в DataModule, в котором же находятся прочие ваши невизуальные компоненты для работы с БД (что, кстати говоря, является неплохим стилем).

Процедура инициализации

procedure Tdm.InitSProc(var aProc: TStoredProc; const ProcName: string);

begin

aProc.UnPrepare;

aProc.StoredProcName := ProcName;

aProc.Prepare;

end;

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

Функция запуска

function Tdm.ExecSProc(var aProc: TStoredProc): integer;

begin

Result := -1;

aProc.Prepare;

aProc.ExecProc;

try

if aProc.Params.FindParam(‘Result’) nil then

Result := aProc.ParamByName(‘Result’).AsInteger;

except

Result := -1;

end;

end;

Эта функция запускает ранее заданную хранимую процедуру и, в случае ошибки или, если хранимая процедура возвращает не числовой результат (не возвращает его вовсе), возвращает -1. Во всех остальных случаях функция возвращает значение параметра «Result», то есть, ответ хранимой процедуры.

Пример

with dm do

begin

InitSProc(‘PKPG_CONSREPS.CHECK_ENABLED_VERSION’);

pExec.ParamByName(‘xTypeID’).Value := eType.KeyValue;

i := ExecSProc;

if i > 0 then

begin

ModalResult := mrCancel;

ErrorMessage(SomeMsg, mtWarning, ‘Проблема’);

exit;

end;

end;

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

Всем успехов.

{/codecitation}

Добавить комментарий