Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
24 вопр с учебн.docx
Скачиваний:
3
Добавлен:
31.08.2019
Размер:
40.07 Кб
Скачать

Выполнение запросов

Для выполнения 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;

Соответствующие события возникают после отключения БД, во время отклю­чения БД и после высвобождения памяти компонентом соединения соответ­ственно.