Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 833

•  TDictionary Custom Sort  6 827

•  Fast Watermark Sources  6 606

•  3D Designer  9 572

•  Sik Screen Capture  6 946

•  Patch Maker  7 393

•  Айболит (remote control)  7 343

•  ListBox Drag & Drop  6 200

•  Доска для игры Реверси  98 192

•  Графические эффекты  7 515

•  Рисование по маске  6 798

•  Перетаскивание изображений  5 654

•  Canvas Drawing  6 032

•  Рисование Луны  5 824

•  Поворот изображения  5 273

•  Рисование стержней  3 866

•  Paint on Shape  3 020

•  Генератор кроссвордов  3 977

•  Головоломка Paletto  3 153

•  Теорема Монжа об окружностях  3 992

•  Пазл Numbrix  2 636

•  Заборы и коммивояжеры  3 447

•  Игра HIP  2 361

•  Игра Go (Го)  2 279

•  Симулятор лифта  2 676

•  Программа укладки плитки  2 238

•  Генератор лабиринта  2 794

•  Проверка числового ввода  2 399

•  HEX View  2 733

•  Физический маятник  2 427

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

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

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








Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте