Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:
Свойство SQL

Все же TQuery имеет некоторую уникальную функциональность. Например, у TQuery имеется свойство с именем SQL. Свойство SQL используется для хранения SQL-запроса. Ниже приведены основные шаги для составления запроса, где все служащие имеют зарплату свыше $50,000.

1. Создайте объект TQuery

2. Задайте псевдоним свойству DatabaseName. (Данный пример использует псевдоним IBLOCAL, связанный с демонстрационной базой данных employee.gdb).

3. Выберите свойство SQL и щелкните на кнопке с текстом - '…' (три точки, Инспектор Объектов — В.О.). Должен появиться диалог редактора списка строк (String List Editor).

4. Введите: Select * from EMPLOYEE where SALARY>50000. Нажмите OK.

5.

Выберите в Инспекторе Объектов свойство Active и установите его в TRUE.

6. Разместите на форме объект TDatasource.

7. Установите свойство Dataset у TDatasource в Query1.

8. Разместите на форме TDBGrid.

9. Установите его свойство Datasource в Datasource1.

Свойство SQL имеет тип TStrings. Объект TStrings представляет собой список строк, и чем-то похож на массив. Тип данных TStrings имеет в своем арсенале команды добавления строк, их загрузки из текстового файла и обмена данными с другим объектом TStrings. Другой компонент, использующий TStrings — TMemo. В демонстрационном проекте ENTRSQL.DPR (по идее, он должен находится на отдельной дискетте, но к "Советам по Delphi" она не прилагается — В.О.), пользователь должен ввести SQL-запрос и нажать кнопку "Do It" ("сделать это"). Результаты запроса отображаются в табличной сетке. В Листинге 1 полностью приведен код обработчика кнопки "Do It".

Листинг 1

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

 Query1.close; {Деактивируем запрос в качестве одной из мер предосторожности }

 Query1.SQL.Clear; {Стираем любой предыдущий запрос}

 If Memo1.Lines[0] <> '' {Проверяем на предмет пустого ввода} then

Query1.SQL.Add(Memo1.Text) {Назначаем свойству SQL текст Memo}

 else begin

messageDlg('Не был введен SQL-запрос', mtError, [mbOK], 0);

exit;

 end;

 try {перехватчик ошибок}

Query1.Open; {Выполняем запрос и открываем набор данных}

 except {секция обработки ошибок}

 On e : EDatabaseError do {e – новый дескриптор ошибки}

messageDlg(e.message, mtError, [mbOK],0); {показываем свойство message объекта e}

 end; {окончание обработки ошибки}

end;

Свойство Params

Этого должно быть достаточно для пользователя, знающего SQL. Тем не менее, большинство пользователей не знает этого языка. Итак, ваша работа как разработчика заключается в предоставлении интерфейса и создании SQL-запроса. В Delphi, для создания SQL-запроса на лету можно использовать динамические запросы. Динамические запросы допускают использование параметров. Для определения параметра в запросе используется двоеточие (:), за которым следует имя параметра. Ниже приведе пример SQL-запроса с использованием динамического параметра:

select * from EMPLOYEE

where DEPT_NO = :Dept_no

Если вам нужно протестировать, или установить для параметра значение по умолчанию, выберите свойство Params объекта Query1. Щелкните на кнопке '…'. Должен появиться диалог настройки параметров. Выберите параметр Dept_no. Затем в выпадающем списке типов данных выберите Integer. Для того, чтобы задать значение по умолчанию, введите нужное значение в поле редактирования «Value».

Для изменения SQL-запроса

во время выполнения приложения, параметры необходимо связать (bind). Параметры могут изменяться, запрос выполняться повторно, а данные обновляться. Для непосредственного редактирования значения параметра используется свойство Params или метод ParamByName. Свойство Params представляет из себя массив TParams. Поэтому для получения доступа к параметру, необходимо указать его индекс. Для примера,

Query1.params[0].asInteger := 900;

Свойство asInteger читает данные как тип Integer (название говорит само за себя). Это не обязательно должно указывать но то, что поле имеет тип Integer. Например, если тип поля VARCHAR(10), Delphi осуществит преобразование данных. Так, приведенный выше пример мог бы быть записан таким образом:

Query1.params[0].asString := '900';

или так:

Query1.params[0].asString := edit1.text;

Если вместо номера индекса вы хотели бы использовать имя параметра, то воспользуйтесь методом ParamByName. Данный метод возвращает объект TParam с заданным именем. Например:

Query1.ParamByName('DEPT_NO').asInteger := 900;

В листинге 2 приведен полный код примера.

Листинг 2

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

 Query1.close; {Деактивируем запрос в качестве одной из мер предосторожности }

 if not Query1.prepared then

Query1.prepare; {Убедимся что запрос подготовлен}

 {Берем значение, введенное пользователем и заменяемим параметр.}

 if edit1.text <> '' {Проверяем на предмет пустого ввода} then

Query1.ParamByName('DEPT_NO').AsString := edit1.text

 else Begin

Query1.ParamByName('DEPT_NO').AsInteger := 0;

edit1.text := '0';

 end;

 try {перехватчик ошибок}

Query1.Open; {Выполняем запрос и открываем набор данных}

 except {секция обработки ошибок}

 On e : EDatabaseError do {e – новый дескриптор ошибки}

messagedlg(e.message, mtError, [mbOK],0); {показываем свойство message объекта e}

 end; {окончание обработки ошибки}

end;

Обратите внимание на процедуру, первым делом подготовливающую запрос. При вызове метода prepare, Delphi посылает SQL запрос на удаленный сервер. Сервер выполняет грамматический разбор и оптимизацию запроса. Преимущество такой подготовки запроса состоит в его предварительном разборе и оптимизации. Альтернативой здесь может служить подготовка сервером запроса при каждом его выполнении. Как только запрос подготовлен, подставляются необходимые новые параметры, и запрос выполняется.

Источник данных

В предыдущем примере пользователь мог ввести номер отдела, и после выполнения запроса отображался список сотрудников этого отдела. А как насчет использования таблицы DEPARTMENT, позволяющей пользователю легко перемещаться между пользователями и отделами?

Примечание: Следующий пример использует TTable с именем Table1. Для Table1 имя базы данных IBLOCAL, имя таблицы – DEPARTMENT. DataSource2 TDatasource связан с Table1. Таблица также активна и отображает записи в TDBGrid.

Поделиться с друзьями: