Выполнение запросов
Для выполнения SQL-запросов по технологии InterBase Express служит компонент iBQuery. Этот компонент является аналогом компонента Query в технологии BDE. Рассмотрим кратко отличительные свойства компонента IBQuery.
Установить значение свойства sql типа TStrings, определяющего текст исполняемого SQL-запроса, можно с помощью редактора CommandText Editor, работа с которым описана в главе 9.
Параметры исполняемого SQL-запроса хранятся в свойстве Params типа TParams, а общее число параметров запроса возвращает свойство ParamCount типа word.
Специалисты рекомендуют использовать компонент Query в основном при переносе имеющихся приложений под BDE на платформу технологии InterBase Express. При разработке новых приложений взамен него предлагается использовать компонент iBDataSet.
Получение и редактирование данных
В рассматриваемой технологии для выполнения SQL-запросов по выборке, вставке, удалению и обновлению записей в таблицах и представления полученных наборов данных используется компонент IBDataSet. Этот компонент реализует практически все возможности описанных выше компонентов доступа к данным по рассматриваемой технологии, именно его и целесообразно использовать при разработке приложений БД.
На этапе разработки и при выполнении приложения для компонента IBDataSet доступны следующие свойства типа TStrings, задающие различные типы запросов:
InsertSql — на добавление записей в набор данных;
DeleteSQL — на удаление записей из набора данных;
ModifySQL — на изменение записей в наборе данных;
SelectSQL — запрос на выборку всех записей набора данных;
RefreshSQL — на обновление текущей записи набора данных.
Тип запроса к набору данных определяется с помощью свойства statementType типа TiBSQLTypes, который описан так:
type TiBSQLTypes = set of (SQLDnknown, SQLSelect, SQLInsert, SQLDpdate, SQLDelete, SQLDDL, SQLGetSegment, SQLPutSegment, SQLExecProcedure, SQLStartTransaction, SQLCommit, SQLRollback, SQLSelectForUpdate, SQLSetGenerator);
Здесь:
SQLCommit — фиксация текущей (активной) транзакции;
sqlddl — выполнение команды DDL;
SQLDelete — удаление записей в таблице или курсоре;
SQLExecProcedure — вызов хранимой процедуры;
SQLGetSegment — чтение сегмента BLOB;
SQLInsert — добавление записей в таблицу;
SQLPutsegment — мнись сегмента BLOB;
SQLRoiiback — восстановление состояния БД, предшествовавшего началу текущей транзакции;
SQLSetForOpdate — хранимая процедура, устанавливается для обновления;
SQLSetGenerator — установка нового значения для существующего генератора;
SQLSeiect — возвращение данных из одной или нескольких таблиц (SQL-запрос);
SQLStartTransaction — начало новой транзакции;
SQLDnknown — неизвестный тип SQL;
SQLDpdate — изменение записи в таблице, представлении или курсоре.
В целом компонент iBDataSet предназначен для выполнения модифицирующих запросов с целью изменения данных, полученных с помощью запроса на выборку, задаваемого в свойстве SelectSQL.
Рассмотрим технику выполнения модифицирующих запросов с использованием свойств ModifySQL, insertSQL, DeleteSQL и RefreshSQL компонента IBDataSet. Предположим, что с помощью запроса на выборку, заданного в свойстве SelectSQL, мы получили набор данных, содержащий записи с нужными полями заданной таблицы. Пусть нам требуется отредактировать содержимое одного из или нескольких полей некоторой записи. При этом после внесения изменений, например, в компоненте DBGrid, эти изменения будут внесены в локальный буфер, а в базе данных на сервере ничего не изменится. Для внесения соответствующих изменений в базе данных на сервере нужно выполнить оператор UPDATE языка SQL. Причем этот запрос должен быть указан в качестве значения свойства ModifySQL рассматриваемого компонента.
К примеру, если редактируемый набор данных для таблицы с именем ' country ' содержит поля с именами ' country 1 и 1 currency 1, то соответствующий запрос на изменение записи в свойстве ModifySQL может содержать следующий текст:
UPDATE COUNTRY SET
COUNTRY = :COUNTRY, CURRENCY = :CURRENCY where
COUNTRY = :OLD_COUNTRY
В приведенном запросе вместо значений указаны параметры, названия которых совпадают с названиями полей редактируемой таблицы. Это означает, что при изменении содержимого полей записи рассматриваемый компонент автоматически установит значения всех параметров через текущие значения полей или некоторым другим образом. Префикс old_ в названии параметра означает, что в параметр будет подставлено старое содержимое поля до его изменения пользователем.
Разработчик должен указать, каким именно образом происходит определение параметров. К примеру, возможный вариант вызова оператора UPDATE с заданием параметров в обработчике события нажатия кнопки может иметь следующий вид:
procedure TForml.ButtonlClick(Sender: TObject); begin {изменение записи} with IBDataSetl do begin Edit;
FieldByName('COUNTRY').AsString := Editl.Text;
FieldByName('CURRENCY').AsString := trim(FieldByName('CURRENCY').AsString);
Post;
end;
end;
Как видно из приведенного примера, вызов оператора UPDATE осуществляется с помощью метода Edit класса TiBDataSet. А именно, путем вызова метода Edit выполняется подготовка буфера текущей записи для редактирования, с помощью метода FieldByName задаются значения параметров оператора UPDATE и тем самым изменяются значения полей. С помощью метода Post осуществляется сохранение внесенных изменений в базе данных на сервере.
Для вставки и удаления записей в используемом нами классе TiBDataSetl служат методы insert и Delete соответственно. Для запросов, указываемых в свойствах insertSQL и DeleteSQL, задается аналогичная последовательность действий.
Рассмотренные нами запросы для компонента iBDataSet называют динамическими или "живыми " (live query).
Важным достоинством рассматриваемого компонента является то, что после выполнения любого действия по редактированию набора данных он выполняет запрос, указанный в свойстве RefreshSQL. Этот запрос выполняет возвращение из базы данных одной — текущей записи и предназначен для обновления полей этой записи после внесенных изменений. Для нашего примера в свойстве RefreshSQL должен быть следующий код:
Select COUNTRY, CURRENCY
from COUNTRY where
COUNTRY = :COUNTRY
Пояснить достоинство такого механизма можно следующим образом. Если в базе данных используются триггеры, модифицирующие значения полей базы данных, то внесенные в результате выполнения триггеров изменения пользователю не видны. Это означает, что для просмотра возможных изменений нужно выбрать нашу запись из базы данных с помощью оператора SELECT или полностью повторить выборку всех записей с помощью запроса из свойства SelectSQL. Такой вариант работы с измененными записями реализован при работе с помощью механизма BDE. Использование свойства RefreshSQL в рассматриваемой технологии позволяет избежать необходимости повторной выборки записей всего набора данных.
Для автоматизации построения модифицирующих запросов, т. е. задания свойств ModifySQL, InsertSQL, DeleteSQL и RefreshSQL компонентаIBDataSet, служит редактор. Вызов редактора выполняется с помощью команды Dataset Editor контекстного меню компонента IBDataSet. Причем делается это после того, как задано его свойство SelectSQL.
На вкладке Options окна редактора модифицирующих запросов (рис. 15.4) выполняется выбор таблицы из списка Table Name. Далее с помощью кнопки Get Table Fields осуществляется формирование списков Key Fields и Update Fields. В списке Key Fields нужно выделить ключевые поля, на основе которых будет задаваться условие WHERE в создаваемых запросах. Если в выбранной таблице ключевые поля существуют, то для их выделения нужно нажать кнопку Select Primary Keys.
] frmMain.lBDataSetl
Options j sql I
" sql Generation-Table Name:
I able
[CUSTOMER
Select
(Sellable Fields Dataset Defaults
Primary Keys j
Generate sql
I- fluote Identifiers
Key Fields:
Ы1Ы18М
CUSTOMER
CONTACT_FIRST
CONTACT_LAST
PH0NE_N0
ADDRESSJJNE1
ADDRESSJJNE2
CITY
STATE_PROVINCE COUNTRY P0STAL_C0DE ON HOLD
Update Fields:
|cust_N0
■ customer
|c0ntact_first i contact_last
|PH0NE_N0
addressjjnei Iaddress_line2
city
|state_province
■ country p0stal_c0de
onjhold
ok
Рис. 15.4. Окно редактора модифицирующих запросов
Выделение полей, для которых допускается редактирование, выполняется с помощью списка Update Fields. В состав этого списка нельзя включать вычисляемые поля, поскольку их содержимое редактировать не допускается.
Нажатие кнопки Generate SQL вызывает генерацию запросов. На вкладке SQL окна редактора отображаются тексты автоматически сгенерированных модифицирующих запросов, т. е. значения свойств ModifySQL, insertSQL, DeleteSQL и RefreshSQL компонента IBDataSet.
В компоненте IBDataSet реализованы обработчики трех событий:
property DatabaseDisconnected: TNotifyEvent; property DatabaseDisconnecting: TNotifyEvent; property DatabaseFree: TNotifyEvent;
Соответствующие события возникают после отключения БД, во время отключения БД и после высвобождения памяти компонентом соединения соответственно.