Средства разработки приложений




Часть II - часть 2


Эти свойства возвращают наиболее подходящую транзакцию для выполнения какого-либо запроса/процедуры.

Кроме того, каждый экземпляр любой сущности обладает унаследованным от TAIEssence методом с приятным названием Del(). Его функциональность очевидна: каждая сущность должна уметь удалить себя из БД (помимо умений прочитать и записать себя в БД).

Теперь опишем тип TAskIBTransaction, производный от TIBTransaction. Он позволяет более свободно работать с БД, и писать меньше кода; свойства PtrTranR, PtrTranW каждого компонента указывают именно на транзакцию этого типа.

Исходный код класса TAskIBTransaction совсем простенький, и позволяет организовать - нет, не вложенные транзакции, - а "вложенное" к ним обращение.

Мы можем в клиентском приложении написать следующий код: try { DM->TrW->StartTransaction(); ScreenToEnterprise(); Enterprise->Put(); PutContacts(); PutPersons(); PutPersContactsToDB(); PutContracts(); PutOffers(); PutDocs(); DM->TrW->Commit(); } catch(EIBInterBaseError &E) { DM->TrW->Rollback(); throw; }

А внутри метода Put() каждого компонента-сущности уже сгенерирован код: try { TranW->StartTransaction(); Prepare(PutProc, ettWrite); PtrStoredProc->ParamByName(P_ID)->AsInteger = ID; PtrStoredProc->ExecProc(); ID = PtrStoredProc->ParamByName("R_ID_ENTERPRISE")->AsInteger; PtrStoredProc->Close(); TranW->Commit(); } catch(EIBInterBaseError &E) { TranW->Rollback(); throw; }

То есть, если PtrTranW компонента указывает на DM->TrW (а обычно так оно и есть), мы можем не писать код, анализирующий, активна ли транзакция, и предпринимающий в соответствии с её состоянием, какие-либо действия.

Соответственно, подобный код не нужен и при завершении транзакции (Commit или Rollback).

Эта возможность обеспечивается отслеживанием глубины вызовов "старта" и окончания транзакции, и выполнением соответствующих методов (StartTransaction() и Commit() или Rollback()) только при первом (последнем) вызове.

Таким образом, этот простенький механизм позволяет не заморачиваться техническими вопросами, а спокойно ваять приложение, справедливо полагая, что механизм "вложенного" вызова транзакция сам во всём разберётся.

Вообще-то, осталось ещё несколько компонентов, облегчающих работу с БД InterBase/Firebird, но их описание отложим "на потом".

Программы, разработанные с использованием описанной методики, "живут" на сайте

К материалу прилагаются файлы:

(182 K)



Содержание  Назад