Страница 1 из 1

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

Добавлено: 11.03.2016 22:53:04
velaskes
Все привет! Пишу довольно сложный проект, впервые засев за 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:

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

Добавлено: 11.03.2016 23:28:16
Jargar
Лучше использовать

Код: Выделить всё

SQLTransaction.StartTransaction;

вместо

Код: Выделить всё

SQLTransaction.Active := True;

Лишнее

Код: Выделить всё

SQLModule.SQLTransaction.Active := False; //НУЖНО ЛИ?

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

Добавлено: 11.03.2016 23:41:13
velaskes
Ага, т.е. Commit или RollBack в конечном итоге и завершают транзакцию, я правильно понял?

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

Добавлено: 12.03.2016 00:01:03
Jargar
Да.