В предыдущих разделах мы работали с удаленным модулем данных, построенным на компоненте Table. Теперь коротко рассмотрим возможности модуля данных, способного воспринимать произвольные запросы SQL. Такой модуль рассмотрен в конце разд. 9.1. Он реализован в серверном приложении RMDSQL. В модуле в свойство Options провайдера DataSetProviderl включена опция poAllowCom-mandText. Это позволяет клиентскому приложению передавать на сервер свои запросы SQL.

Передача запроса на сервер строится по следующей схеме: клиентский набор данных закрывается, в свойство CommandText заносится текст запроса и клиентский набор опять открывается. На рис. 9.14 приведен вид простого тестового приложения, использующего запросы SQL (проект ClientSQL в каталоге RMD на диске, приложенном к книге). Чтобы создать подобное приложение, поместите на форму уже многократно использовавшееся сочетание компонентов ClientDataSet, DCOMConnection, Data Source, DBGrid. Свяжите их обычным образом друг с другом, a DCOMConnectionl свяжите с удаленным сервером RMDSQL, а набор данных ClientDataSet свойством свойством RemoteServer свяжите с DCOMConnectionl, а свойством ProviderName с провайдером сервера DSPPers.

Рис. 9.14

Клиентское приложение с произвольными запросами SQL

9.8 Клиентские приложения с запросами SQL

Перенесите на форму также окно Edit, в котором пользователь сможет формировать свои запросы, и кнопку Button (выпадающий список справа внизу на рис. 9.14 будет рассмотрен позднее).

В обработчик события OnCreate формы введите оператор открытия набора данных, а в обработчике события OnClose закройте набор. В обработчик щелчка на кнопке введите операторы:

ClientDataSetl.Close;
ClientDataSetl.CommandText := Editl.Text;
ClientDataSetl.Open;

Эти операторы по рассмотренной выше схеме передают на сервер запрос, содержащийся в окне Editl.

Как видите, записав всего несколько операторов, вы получили мощное приложение. Выполнив его, вы убедитесь, что можете формулировать самые разнообразные запросы к серверу. В частности, вы можете связаться с какой-то другой таблицей, содержащейся в базе данных. Например, написав запрос "Select * from Dep", вы получите данные не из таблицы Pers, с которой работали до сих пор, а из таблицы Dep.

Спроектированное приложение отличается от рассмотренных ранее возможностью обрабатывать произвольные запросы SQL. А в остальном все, рассмотренное в предыдущих разделах, можно реализовать и в данном приложении. Вы можете, например, соединить с сервером RMDSQL приложения, разработанные в разд. 9.3, 9.4, 9.6, 9.7 и они будут нормально работать. Просто некоторые операции фильтрации и индексации можно, а иногда и проще, реализовать через соответствующий запрос.

В качестве примера введите в свое приложение выпадающий список (внизу справа на рис. 9.14), в котором пользователь смог бы выбирать поле, по которому хочет индексировать данные. Заполнение этого списка именами полей делается так же, как рассматривалось в примерах разд. 9.6. А обработчик события OnChan-ge списка ComboBoxl можно оформить следующим образом:

ClientDataSetl.Close;

ClientDataSetl.CommandText := 'Select * from Pers order by 1 +

ComboBoxl.Text;
ClientDataSetl.Open;
ClientDataSetl.Refresh;

Первый оператор закрывает набор данных. Второй формирует текст CommandText, используя имя поля, выбранное пользователем. Последний оператор открывает набор данных. Поскольку в нем задано значение CommandText, то именно этот запрос будет выполняться.

9.7 Индексация клиентского набора || Оглавление || 9.9 Доступ к удаленным данным из сервера Web


Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Февраль
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс