Лекция 5.7. Реляционный способ доступа к БД
Реляционный способ доступа основан на использовании обращений к БД на языке структурированных запросов – SQL (Structured Query Language). Использование реляционного способа доступа значительно расширяет возможности приложения.
SQL-запросы можно использовать как для обращения к локальным БД, так и для обращения к SQL-серверам БД (Oracle, Informix, Sybase, DB2, InterBase, Microsoft SQL Server). Причем при формировании SQL-запросов не имеет особого значения, какая СУБД используется, т.к. команды языка SQL стандартизированы (ANSI SQL 92), но все же имеются свои реализации.Для работы с локальными БД (Paradox, dBase, FoxPro) в Delphi используются своя, усеченная, реализация языка (Local SQL) стандарта SQL92. При работе с SQL-серверами обработка запросов выполняется на стороне сервера, поэтому особенности реализации языка SQL определяются используемым SQL-сервером.
Язык SQL-не имеет средств создания пользовательского интерфейса, а ориентирован только на доступ к данным, поэтому его обычно включают в средства разработки приложений и называют встроенным. Для реализации возможности использования SQL-запросов в Delphi включены специальные компоненты, такие как TQuery, TADOQuery, TIBQuery они реализуют разные механизмы доступа к БД. Продолжим рассмотрение доступа с использованием механизма BDE.
Компонент класса TQuery
Благодаря общим родителям компонент класса TQuery имеет много общих свойств методов и событий с компонентом класса TTable относительно работы с НД. Основные отличия заключаются в способе получения данных, компонент класса TQuery получает данные как результат выполнения SQL-запросов. Применение SQL-запросов позволяет решать задачи, которые невозможно решить при использовании навигационного доступа к данным реализованным в компоненте класса TTable. Поэтому компонент класса TQuery является более гибким и мощным инструментом для работы с БД, единственным недостатком является относительно низкая производительность SQL-запросов но при обработке больших объемов данных.
Прежде чем приступить к описанию основных свойств класса рассмотрим обязательные свойства:
· DatabaseName: String - путь к БД или псевдоним;
· SQL: TStrings – текст SQL-запроса. Компонент не будет работать без указания SQL-запроса.
Основные свойства класса TQuery:
· DataSource: TDataSource – источник данных связанный с НД поля которого могут использоваться в качестве параметров SQL-запроса;
· ParamCheck: Boolean – определяет, надо ли обновлять параметры запроса при изменении свойства SQL во время выполнения программы;
· ParamCount: Word – количество параметров в запросе;
· Params[Index: Word]: TParams – массив параметров используемых в запросе;
· Prepared: Boolean – определяет готовность запроса к выполнению;
Класс имеет ряд часто используемых методов:
· procedure ExecSQL – используется для выполнения запросов действия, которые не возвращают НД (INSERT, UPDATE, DELETE и CREATE TABLE);
· function ParamByName (const Value: String): TParam – предоставляет доступ к параметру SQL-запроса по имени параметра;
· procedure Prepare – отправляет запрос в BDE для подготовки к выполнению, что повышает скорость при многократном использовании запроса.
· procedure UnPrepare – освобождает ресурсы занятые под подготовленный запрос.
Реализация запросов средствами Delphi
В Delphi различают два вида запросов:
· Статический SQL-запрос включается в исходный код программы на этапе разработки приложения и в процессе его выполнения не изменяется.
· Динамический SQL-запрос изменяется вовремя работы приложения, обычно зависит от действий пользователя.
Как правило, пользователи используют один и тот же шаблон запроса изменяя только передаваемые в запрос значения, которые используются в качестве условий отбора. Для упрощения передачи значений в запрос в компоненте класса TQuery реализован массив параметров (Params), а запросы их использующие называют параметрическими.
Для реализации статических запросов используется редактор свойства SQL компонента TQuery, в который на этапе разработки приложения вводится код SQL-запроса (рисунок 5.7.1)
Рисунок 5.7.1 - Использование редактора SQL-запроса
Динамически запросы можно формировать несколькими способами.
Например, использование класса TStrings для свойства SQL позволяет загружать запросы из файлов, что может повысить гибкость и расширяемость приложения. Один и тот же компонент способен выполнять, во время работы приложения, различные запросы, подгружаемые из файлов. Пример загрузки запроса из файла и его выполнения:Query1.Close;
Query1.SQL.LoadFromFile(‘MyQuery1.sql’);
Query1.Open;
Пример непосредственного добавления кода SQL-запроса:
with Query1 do
begin
Active:= false;
SQL.Clear;
SQL.Add(‘SELECT * FROM Country’);
SQL.Add(‘WHERE Name=:Name’);
Active:= true;
end;
Во всех вышеуказанных примерах использовались параметрические запросы, где параметром является часть, перед которой поставлен символ «:» (:Name).
Запросы на выборку (DQL) включаются и выключаются с использованием свойства Active или при использовании методов Open и Close. Запросы группы DML не возвращают информации и выполняются только при вызове метода ExecSQL, например:
Query1.SQL.Clear;
Query1.SQL.Add(‘DELETE FROM Country WHERE Name=’+ QuotedStr(‘Canada’));
Query1.ExecSQL;
Рассмотрим создание простого редактора SQL-запросов, позволяющего выбирать БД и выполнять по отношению к ней SQL-запросы (рисунке 5.7.2).
Выполнение запроса осуществляется кнопкой «Выполнить». Флажок «Запрос на выборку» позволяет управлять способом выполнения запроса, если флажок установлен, то запрос выполняется через свойство Active (метод Open), в противном случае запрос считается модифицирующим и выполняется методом ExecSQL. При наличии ошибки в SQL-запросе автоматически генерируется исключительная ситуация. Для реализации примера выполните следующие действия:
1. Создайте главную форму приложения
2. Разместите на форме компоненты для работы с БД классов TDBGrid, TDataSource и TQuery.
3. Разместите на форме раскрывающийся список (класс TComboBox), для выбора псевдонима БД, список (класс TListBox) для отображения полей выбранной БД, многострочный редактор (класс TMemo) для ввода текста SQL-запроса и флажок (класс TCheckBox) для управления способом выполнения SQL-запроса.
Рисунок 5.7.2 - Пример редактора SQL-запросов.
4. Разместите на форме три надписи (класс TLabel), для поясняющих надписей и кнопку «Выполнить» (класс TButton)
5. Создайте метод загрузки списка доступных таблиц procedure GetTables, для этого сделайте его объявление в разделе Private формы и нажмите Ctrl+Shift+C. Впишите в него следующий код:
Session.GetTableNames(ComboBox1.Text, '*.db',False,
False, ListBox1.Items);
В коде используется имя псевдонима, выбранное в поле со списком -ComboBox1.Text, список доступных таблиц помещается в ListBox1.Items
6. Создайте метод получения списка псевдонимов procedure GetAliases, для этого сделайте его объявление в разделе Private формы и нажмите Ctrl+Shift+C. Впишите в него следующий код:
with ComboBox1, Session do
begin
Session.GetAliasNames(Items); //получаем список псевдонимов
if Items.Count > 0 then ItemIndex:= 0; // выбираем 1-й псевдоним
GetTables; // загрузка списка доступных
//таблиц
end;
7. Напишите обработчик OnClick кнопки «Выполнить»:
Query1.Active:= false; // отключаем НД
Query1.DatabaseName:= ComboBox1.Text; // присваиваем имя
// псевдонима БД
Query1.SQL.Text:= Memo1.Lines.Text; // присваиваем текст
// SQL-запроса
if CheckBox1.Checked // определяем как выполнить запрос
then Query1.Active:= true // включаем запрос на выборку
else Query1.ExecSQL; // иначе выполняем через ExecSQL
8. Создайте обработчик OnCreate формы и впишите в него код:
GetAliases;
9. Создайте обработчик OnChange поля со списком и впишите в него следующий код:
GetTables;
10. Выполните компиляцию и тестирование приложения. Теперь вы можете отрабатывать написание SQL-запросов в собственном SQL-редакторе.
Вопросы для самоконтроля
1. Почему компонент класса TQuery называется компонентом реляционного доступа?
2. Какие основные свойства компонента класса TQuery вы знаете?
3. В чем отличие между подключением НД TQuery и НД TTable к БД?
4. В чем разница в использовании методов Open и ExecSQL?
5. Как реализуются статические запросы к БД?
6. Как реализуются динамические запросы к БД?
7. Как создаются параметрические запросы к БД?
Еще по теме Лекция 5.7. Реляционный способ доступа к БД:
- 3.4. Структура корпоративного права
- 61. СПОСОБЫ ОБЕСПЕЧЕНИЯ ОБЯЗАТЕЛЬСТВ
- Конфедерация и иные формы межгосударственных объединений (союзы, сообщества, содружества, ассоциации)
- 57 Понятие системы законодательства. Основные свойства российской системы законодательства: многообразие, государственная упорядоченность, иерархичность нормативных юридических актов.
- 59 Понятие систематизации нормативных юридических актов. Способы систематизации юридических актов: обработка (сбор актов), перегруппировка (создание сборников), изложение (объединение).
- 2. Роль фіскальної політики в державному регулюванні.