Главная » Delphi » Многопоточный доступ к базе данных

0

Несмотря на то что  создание приложений баз данных  обсуждается позднее, рас смотрим в этом  разделе некоторые  вопросы, касающиеся использования многопо точности в контексте доступа  к информации баз данных.  Если читатель не знаком  с основами программирования подобных приложений в среде  Delphi, то,  прежде чем приступить к изучению настоящего раздела, стоит  просмотреть главу, посвященную данной теме.

Пожалуй, наиболее важным  требованием к разработчикам приложений баз  дан ных в системе Win32 является умение обеспечивать выполнение сложных запросов и хранимых процедур в фоновых потоках. К счастью, этот  тип функций поддерживает ся 32 разрядным процессором баз данных  Borland (BDE —  Borland Database Engine) и довольно легко реализуется в Delphi.

К запуску в фоновом потоке запроса, выполняемого, например, с помощью компо

нента  TQuery, предъявляются только  два требования.

•  Каждый  поток  запроса должен  располагаться в собственном сеансе.  Чтобы обеспечить объект TQuery собственным сеансом, следует  разместить в форме компонент  TSession и  присвоить  его  имя  свойству   SessionName объекта TQuery. Т.е. для каждого  сеанса  объекта TQuery необходим отдельный экземп ляр компонента TDatabase.

•   Компонент TQuery не должен  быть  связан  с какими  бы то ни было  компонен тами TDataSource в тот момент, когда запрос открывается из вторичного по тока.  Если же запрос присоединен к компоненту TDataSource, то это должно быть реализовано в контексте основного (первичного) потока. Компонент TDataSource используется только  для подключения наборов данных  к элемен там  управления пользовательского интерфейса,  а  управление  пользователь ским интерфейсом должно осуществляться только  в основном потоке.

Для иллюстрации методов реализации фоновых запросов в собственных потоках подготовлен демонстрационный проект BDEThrd, главная  форма которого показана на рис. 5.8. С помощью этой  формы можно  задать  псевдоним базы данных, имя поль зователя, пароль для входа в конкретную базу данных, а также  ввести  сам запрос. При щелчке  на кнопке Go! запускается вторичный  поток  процесса обработки запроса, а результаты его работы отображаются в дочерней форме проекта.

Дочерняя форма TQueryForm показана на рис. 5.9. Обратите внимание: эта форма содержит  по  одному  экземпляру  каждого   из  компонентов —   TQuery,  TDatabase,TSession, TDataSource и TDBGrid. Следовательно, каждый  экземпляр TQueryForm

имеет собственные экземпляры этих компонентов.

end.В процедуре NewQuery() создается новый экземпляр дочерней формы TQueryForm, устанавливаются свойства каждого  из ее компонентов доступа к данным  и присваивают ся уникальные имена  ее компонентам TDatabase и TSession. Свойство запроса SQL заполняется значениями строк, переданных в качестве параметра Qry, затем запускает ся поток запроса.

Код класса TDBQueryThread не требуется большого объема.  Конструктор просто ус танавливает несколько переменных экземпляра, а сам запрос открывается в методе Execute(), откуда с помощью метода  Synchronize() вызывается процедура Hooku- pUI() для привязки запроса к источнику данных.  Следует также  обратить внимание на блок try..except внутри  процедуры Execute(), которая использует метод Synchro- nize() для отображения сообщений об исключениях в контексте основного потока.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии