Firebird + Lazarus. Верна ли реализация?
Добавлено: 11.03.2016 23:53:04
Все привет! Пишу довольно сложный проект, впервые засев за Lazarus и впервые задействовав Firebird.
Архитектура программы нехитрая: Около 15 форм с модулями и 1 глобальный модуль данных.
Компоненты доступа стандартные, из палитры Лазаруса: TIBConnection, TSQLTransaction, TSQLQuery
В общем, пытаюсь делать прозрачное взаимодействие с БД, т.е. чистый SQL и минимальный набор компонентов доступа,
которые я привел выше.
А вопрос мой таков - насколько верный подход в работе с БД с учетом контроля исключений/транзакции? Пример одной из моих процедур-оберток:
Насколько правильно происходит обработка транзакции? Или не имеет смысла делать RollBack если происходит исключение?
Кстати, свойство Action компонента TIBConnection стоит в caNone. Ткните меня в мои собственные ошибки
Архитектура программы нехитрая: Около 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. Ткните меня в мои собственные ошибки