StoredProc становится удобнее
Автор: Павел
Примерно через неделю после того, как программист впервые сталкивается с компонентом 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 я не передаю, он у меня фиксированный). И, надо сказать, жизнь мне эти две простенькие функции сильно упрощают. На этом очередная маленькая хитрость подошла к концу.
Всем успехов.
|