Firebird + Lazarus. Верна ли реализация?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Firebird + Lazarus. Верна ли реализация?

Сообщение velaskes » 11.03.2016 23:53:04

Все привет! Пишу довольно сложный проект, впервые засев за Lazarus и впервые задействовав Firebird.
Архитектура программы нехитрая: Около 15 форм с модулями и 1 глобальный модуль данных.
Компоненты доступа стандартные, из палитры Лазаруса: TIBConnection, TSQLTransaction, TSQLQuery
В общем, пытаюсь делать прозрачное взаимодействие с БД, т.е. чистый SQL и минимальный набор компонентов доступа,
которые я привел выше.

А вопрос мой таков - насколько верный подход в работе с БД с учетом контроля исключений/транзакции? Пример одной из моих процедур-оберток:
Код: Выделить всё
function TfrmPoruch.UpdEmptyPoruch: boolean;
var
  SQLError: boolean;
begin
SQLError := False;

try
   try
     with SQLModule do begin
       SQLTransaction.Active := True;
       SQLQuery.SQL.Text := 'update PORUCH set '+
                            'NPORUCH = :NPORUCH, '+
                            'FILIAL_CODE = :FILIAL, '+
                            'GOSRAB_CODE = :GOSRAB, '+
                            'OFORMLENIE = :OFORMLENIE, '+
                            'ISPOLNENIE = :ISPOLNENIE, '+
                            'STATUS = :STATUS where ID = :ID;';
       SQLQuery.ParamByName('NPORUCH').AsInteger   := poruchnum_flag;
       SQLQuery.ParamByName('FILIAL').AsInteger    := PoruchNum;
       SQLQuery.ParamByName('GOSRAB').AsInteger    := cbGosRaboti.ItemIndex;
       SQLQuery.ParamByName('OFORMLENIE').AsString := DateToStr(deDateOform.Date)+' '+TimeToStr(Time);
       SQLQuery.ParamByName('ISPOLNENIE').AsString := DateToStr(deSrokIspol.Date)+' '+TimeToStr(Time);
       SQLQuery.ParamByName('STATUS').AsInteger    := 0;
       SQLQuery.ParamByName('ID').AsInteger        := poruchid_flag;
       SQLQuery.ExecSQL;
     end;
   except
     on E: Exception do SQLError := True;
   end;
finally
   case SQLError of
     False: SQLModule.SQLTransaction.Commit;
     True:  SQLModule.SQLTransaction.Rollback;
   end;
   SQLModule.SQLQuery.Params.Clear;
   SQLModule.SQLTransaction.Active := False; //НУЖНО ЛИ?
   Result := SQLError; //TRUE = ОШИБКА
  end;
end;

Насколько правильно происходит обработка транзакции? Или не имеет смысла делать RollBack если происходит исключение?
Кстати, свойство Action компонента TIBConnection стоит в caNone. Ткните меня в мои собственные ошибки :roll:
velaskes
новенький
 
Сообщения: 24
Зарегистрирован: 11.03.2016 23:16:17

Re: Firebird + Lazarus. Верна ли реализация?

Сообщение Jargar » 12.03.2016 00:28:16

Лучше использовать
Код: Выделить всё
SQLTransaction.StartTransaction;

вместо
Код: Выделить всё
SQLTransaction.Active := True;

Лишнее
Код: Выделить всё
SQLModule.SQLTransaction.Active := False; //НУЖНО ЛИ?
Jargar
новенький
 
Сообщения: 21
Зарегистрирован: 06.11.2007 14:42:24

Re: Firebird + Lazarus. Верна ли реализация?

Сообщение velaskes » 12.03.2016 00:41:13

Ага, т.е. Commit или RollBack в конечном итоге и завершают транзакцию, я правильно понял?
velaskes
новенький
 
Сообщения: 24
Зарегистрирован: 11.03.2016 23:16:17

Re: Firebird + Lazarus. Верна ли реализация?

Сообщение Jargar » 12.03.2016 01:01:03

Да.
Jargar
новенький
 
Сообщения: 21
Зарегистрирован: 06.11.2007 14:42:24


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru