Свойства компонента-запроса

ПРАКТИЧЕСКАЯ РАБОТА

ЗАПРОСЫ

Для демонстрации работы компонента TADOQuery создадим совсем маленькое приложение - простейший SQL-монитор).

Создайте папку для нового приложения. В эту папку скопируйте базу данных primer.mdb, с которой мы работали. Создайте новый проект в Delphi, форму переименуйте в fMain, сохраните ее модуль под именем Main, а проект в целом как SQLMon. В свойстве Caption формы пропишите "Простой SQL-монитор".

Далее на форму установите панель. В свойстве Align панели выберите alTop, чтобы панель заняла весь верх, а ее высоту растяните примерно на полформы. Очистите свойство Caption. На эту панель установите компонент Memo, именно в нем мы будем писать наши SQL-запросы. Дважды щелкните по свойству Lines этого компонента, чтобы вызвать редактор текста, и очистите весь текст. Также не помешает дважды щелкнуть по свойству Font и изменить размер шрифта на 12 для лучшего восприятия текста. В свойстве Align выберите alLeft, чтобы компонент Memo занял всю левую часть панели.

В правой части панели установите две простые кнопки и компонент TDBNavigator с вкладки Data Controls панели инструментов. Для улучшения внешнего вида интерфейса ширину кнопок сделайте такой же, как у навигатора базы данных. В свойстве Caption первой кнопки напишите "Выполнить SQL-запрос", на второй кнопке напишите "Очистить компонент Memo". Собственно, мы могли бы очищать Memo сразу при выполнении SQL-запроса, и обойтись без второй кнопки. Но многие запросы похожи, и проще изменить часть текста запроса, чем писать весь запрос заново.

На нижнюю, свободную половину формы установите компонент TDBGrid с вкладки Data Controls для отображения данных. В свойстве Align сетки выберите alClient, чтобы сетка заняла все оставшееся место. У вас должна получиться такая картина:

Рис. 1. Внешний вид приложения

Еще нам потребуются три компонента: TADOConnection и TADOQuery с вкладки ADO для получения набора данных, и TDataSource с вкладки Data Access для связи сетки DBGrid и навигатора DBNavigator с этим набором данных.

Настройте компонент ADOConnection1 самостоятельно. В свойстве Connection компонента TADOQuery выберем ADOConnection1, а в свойстве DataSet компонента DataSource1 выберем наш НД ADOQuery1. Теперь набор данных ADOQuery1 соединен с базой данных, а DataSource1 - с этим набором данных.

В свойстве DataSource компонентов DBGrid1 и DBNavigator1 выберем DataSource1, чтобы они могли взаимодействовать с набором данных.

Нам осталось лишь запрограммировать обработчик события onClick для обеих кнопок. Щелкните дважды по кнопке "Выполнить SQL-запрос", чтобы сгенерировать это событие, и пропишите в нем такой код:

//проверим - есть ли текст в Memo. Если нет, выходим:

if Memo1.Text = '' then begin

ShowMessage('Вначале введите запрос!');

Memo1.SetFocus;

Exit;

end;

//текст есть. Очистим предыдущий запрос в наборе данных:

ADOQuery1.SQL.Clear;

//добавим новый запрос из Memo:

ADOQuery1.SQL.Add(Memo1.Text);

//открываем набор данных, т.е. выполняем запрос:

ADOQuery1.Open;

Комментарии здесь достаточно подробны, чтобы разобраться в происходящем. Заметим только, что набор данных ADOQuery1 обычно закрыт. После того, как мы изменяем его свойство SQL, прописывая туда новый SQL-запрос, этот набор данных открывается. В результате в БД передается SQL-запрос, получаются запрашиваемые данные, которые формируют набор данных ADOQuery1. Когда этот компонент активен, данные доступны.

Сгенерируйте событие нажатия на вторую кнопку, здесь мы должны просто очистить поле текста Memo1, и код совсем прост:

Memo1.Clear;

Вот и вся программа! Сохраните ее, скомпилируйте и запустите программу на выполнение. В поле Memo впишите следующие строки:

SELECT *

FROM Student;

После этого нажмите кнопку "Выполнить SQL-запрос". В сетке DBGrid отобразятся данные, которые представляют собой точную копию таблицы Student из базы данных primer.mdb.

Строки в примере написаны по правилам и рекомендациям языка SQL, то есть, операторы пишутся заглавными буквами, каждый оператор на отдельной строке, а в конце ставится точка с запятой. Однако рекомендации можно нарушать, а правила в Delphi более мягкие. Так, мы можем написать весь текст маленькими буквами, в одну строку, не ставить точку с запятой и не обращать внимания на регистр букв:

select * from student

Запрос все равно будет выполнен. Однако лучше придерживаться рекомендаций и традиционного синтаксиса SQL, ведь этот язык имеет стандарты, и вы можете применять его не только при работе с Delphi. В других языках программирования или в клиент-серверных СУБД правила могут несколько отличаться, но в любом случае запрос, написанный в стандартном стиле, будет выполнен. Поэтому лучше сразу приучать себя к стандартному синтаксису. Мы будем придерживаться рекомендаций SQL.

Что же написано у нас в этом запросе? Оператор SELECT означает "выделить", звездочка означает "все поля", оператор FROM означает "из…". Таким образом, запрос означает:

ВЫДЕЛИТЬ все поля ИЗ таблицы Student

Но такой запрос ничем не отличается от применения табличных компонентов, а ведь мы можем создавать и гораздо более сложные запросы! Предположим, нам нужно получить фамилию, имя студента, а также город его проживания. Основные данные находятся в таблице Student. В этом случае запрос будет выглядеть так:

SELECT Sername, Name, City

FROM Student;

Как видите, в операторе SELECT поля перечисляются через запятую.

Теперь предположим, что в одном наборе данных нам нужно получить записи из двух таблиц, связанных релятивной связью один-ко-многим. Так, у одного студента может быть несколько оценок. В этом случае придется смириться, что некоторые данные будут продублированы. Например, запрос:

SELECT Surname, Mark

FROM Student, ExamMark

WHERE Student.Student_ID=ExamMark.Student_ID;

выдаст нам набор данных, в котором фамилия студента будет дублироваться для каждой его оценки.

Свойства компонента-запроса

Constrained - Свойство логического типа. Если свойство имеет значение True, то в изменяемом наборе данных на модифицируемые записи накладываются ограничения блока WHERE оператора SELECT.

DataSource - Указывает тот компонент TDataSource, который используется для формирования параметрического запроса.

Local - Свойство логического типа. Если свойство имеет значение True, это означает, что компонент-запрос работает с локальной или файл-серверной базой данных.

ParamCheck - Логическое свойство. При значении True список параметров автоматически обновляется при каждом программном изменении SQL-запроса.

Params - Свойство имеет тип TParams и содержит массив объектов-параметров этого типа. На этом типе данных следует остановиться подробнее:

Таблица 7.1. Свойства и методы типа TParams

Свойство Описание
Items Содержит массив параметров типа TParams и является свойством "по умолчанию". Индексация массива начинается с 0.
ParamValues() Открывает доступ к значению параметра по его имени, указанному в скобках.
Count Количество параметров в массиве.
   
Метод Описание
AddParam() Добавляет параметр в массив параметров.
CreateParam() Создает параметр и добавляет его к массиву.
FindParam() Ищет параметр по его имени, указанному в скобках.
RemoveParam() Удаляет параметр из массива.

Prepared - Свойство логического типа. Содержит значение True, если SQL-запрос был подготовлен методом Prepare.

RequestLive - Логическое свойство. Если компонент-запрос содержит изменяемый (живой) набор данных, то RequestLive содержит True.

RowsAffected - Свойство содержит количество записей, которые были удалены или отредактированы в наборе данных в результате выполнения SQL-запроса.

SQL - Свойство типа TStrings, то есть, набор строк. Содержит SQL-запрос, который выполняется, как только компонент-запрос становится активным (открывается). При изменении этого свойства, компонент-запрос автоматически закрывается, так что программисту требуется перевести свойство Active набора данных в True (или вызвать метод Open), чтобы запрос выполнился, и в НД появились запрошенные данные. Помещать строки запроса в свойство SQL можно как при проектировании, так и программно. В случае если программист создает запрос и открывает набор данных при проектировании приложения, он имеет возможность создать объекты-поля (см. предыдущую лекцию), и настраивать их свойства по своему усмотрению. При программном формировании НД такой возможности у него нет.

UniDirectional - Свойство логического типа. Содержит True, если курсор набора данных может перемещаться только вперед (типы курсоров см. в лекции №4). Это свойство используется, в основном, при работе с клиент-серверными СУБД, не поддерживающими курсоры, которые могут двигаться как вперед, так и назад.

Методы компонента-запроса

ExecSQL() - Выполняет модифицирующие запросы, то есть запросы на изменение, добавление или удаление записей, а также создание или удаление таблиц. В случае обычных запросов, выполненных с помощью оператора SELECT, используется метод Open, или присвоение значения True свойству Active набора данных.

ParamByName() - Метод дает доступ к значению параметра по его имени, указанному в скобках.

Prepare() - Метод используется для передачи SQL-запроса механизму доступа к данным, чтобы последний оптимизировал запрос. Оптимизация запроса происходит следующим образом: при выполнении любого запроса, механизм доступа к данным проверяет его синтаксис, что отнимает некоторое время. В случае многократного применения запроса, его можно выполнить методом Prepare(). При этом запрос компилируется и запоминается в буфере. При повторном выполнении этого запроса его синтаксис уже не проверяется.

UnPrepare() - Этот метод отменяет результаты действия метода Prepare(), и освобождает буфер от хранения компилированного запроса.


Дата добавления: 2015-12-19; просмотров: 15; Мы поможем в написании вашей работы!

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




Мы поможем в написании ваших работ!