Архитектура программы нехитрая: Около 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. Ткните меня в мои собственные ошибки



