- •Bde та ado
- •Введение
- •Введение в базы данных
- •Типы субд
- •Стандарт odbc
- •Технологии взаимодействия delphi с бд
- •Особенности технологии bde
- •Особенности технологии ado
- •Таблицы бд и связи между ними
- •Первичные ключи и индексы
- •Демонстрационная бд "поставщик книг"
- •Использование odbc для подключения источника данных. Внешний псевдоним бд
- •Создание внешнего псевдонима бд
- •Создание проекта с бд в технологии bde
- •Особенности использованияbdeдля соединения с источником данных
- •Структура проекта с бд и визуальными компонентами
- •Активизация проекта
- •Главная форма проекта
- •Модуль данных
- •Создание модуля данныхTDataModule
- •Создание компонента tDatabase
- •Создание компонента tTable
- •Создание компонентаTDataSource
- •Связь модуля главного окна с модулем данных
- •Связь сеткиTdbGrid и навигатораDbNavigatorcисточником данныхTDataSource
- •Связь главный-детальный между наборами данных
- •Задание реляционной связи между наборами данных
- •Активизация наборов данных
- •Недостатки полученных решений и пути их устранения
- •Объекты-столбцы сетки dbGrid
- •Объекты-поля наборов данных
- •Создание объектов-полей
- •Присоединение к наборам данных новых полей
- •Присоединение полей из других таблиц. Подстановочные поля
- •Вычисляемые поля
- •Обработчики событий компонент работы с бд
- •Обработчики событий OnGetText полей нд и компонента визуализации данныхTdbGrid
- •Установка системных переменных в обработчике событяOnCreate
- •Бизнес-правила иобработчики событий компонент работы с бд
- •Implementation
- •Sql запросы к бд
- •КомпонентtQuery
- •СозданиекомпонентаtQuery
- •ИспользованиякомпонентаtQuery
- •Свойство sql
- •Методы Open и ExecSql
- •Параметрические запросы
- •Параметрические запросы и свойство DataSource компонента tQuery
- •Связь главный-детальный с компонентомTQuery в качестве детального набора данных
- •Доступ к полям запроса
- •Обращение к значению поля при помощи свойств объектов-полейValueиAsXxxx
- •Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •Обращение к значению поля при помощи функции набора данных FieldByName
- •Программный доступ к данным запроса
- •Общая схема программного доступа к данным запроса
- •Последовательная навигация по записям
- •Обзор событий компонентаtQuery
- •Хранимые процедуры и триггеры
- •Хранимые процедуры
- •Создание хранимых процедур
- •Вызов хранимых процедур
- •Триггеры
- •Наборы данных
- •Обзор событий класса tdbDataSet
- •Реализация каскадных изменений и бизнес-правил
- •Другие события
- •Технология ado
- •Основные особенности технологии ado
- •Реализация технологии ado в Delphi
- •Создание проекта с бд в технологии ado. Установка связи с бд
- •Создание модуля данных
- •Начало настройки связи
- •Выбор провайдера
- •Настройка провайдера
- •Настройка провайдераMicrosoftJet4.0oledbProvider
- •Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •Завершение настройки связи
- •Настройка оставшихся компонент модуля данных
- •Особенности использования компонентов ado
- •Базовые объекты ado
- •ОбъектRecordset
- •ОбъектCommand
- •ОбъектParameter
- •Компонент tadoCommand
- •Свойства, методы и события ado компонентов-наборов
- •Общие свойства с bde-компонентами
- •Специфические свойства
- •Методы класса tCustomAdoDataSet
- •События класса tCustomAdoDataSet
- •Компонент tadoDataSet
- •Компонент tadoTable
- •Компонент tadoQuery
- •Компоненты визуализации данных вDelphi
- •Компонент tdbGrid
- •Свойства
- •Дополнительные возможности сетки
- •Компоненты визуализации полей текущей записи
- •Компонент tdbText
- •Компонент tdbEdit
- •Компонент tdbCheckBox
- •Компонент tdbRadioGroup
- •Списочные компоненты
- •Компонент tdbMemo
- •Компонент tdbRichEdit
- •Компонент tdbCtrlGrid
- •Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
ИспользованиякомпонентаtQuery
Свойство sql
Свойство
property SQL: TStrings;
является центральным для компонентаTQuery и является коллекцией (набором) строк, в которую на этапе разработки или прогона программы помешается текст запроса.
Рисунок 4.45 – СвойстваSQL
Для введения текста запроса на этапе разработки нужно раскрыть и использовать связанный со свойством SQL многострочный текстовый редактор (рисунок 7.5). Приведенный текст запроса совпадает с текстом запроса рисунка 7.2 и почти в точности, за исключением названий двух полейFNameиTName,повторяетНДtbNakls, отображаемый в сеткеDBGrid1программы из раздела3:
Рисунок 4.46 – Текст запроса в окне редактора свойстваSQLс текстом запроса
Кроме того, если щелкнуть на кнопке Code Editor, то для формирования текста запроса можно использовать кодовый редактор среды Delphi (рисунок 4.6).
Рисунок 4.47 – Текст запроса в окне редактора кода средыDelphi
Как видно из рисунка 4.6, кодовый редактор Delphi автоматически выделяет в тексте зарезервированные слова SQL.
Закрыть окно кодового редактора можно нажатием клавиш Ctrl+F4 или выбором команды Close Page в его контекстном меню.
Примечание. Для некоторых БД в текст SQL-запроса можно включать комментарии, например для БД PostgreSql.
При любом изменении свойств компонента-запроса он автоматически переходит в неактивное состояние (его свойство Active получает значение False). После изменения текста компонент следует открыть заново, то есть установить Active=True.При этом автоматически будет проверен синтаксис запроса и он будет отправлен на выполнение.
Примечание 1. Синтаксис SQL-операторов проверяется при установке свойства Active = true или при их выполнении методом Open или ExecSQL.
Примечание 2. Если текст запроса размещен на этапе разработки программы, для такого запроса можно создать объекты-поля.
Примечание 3. Присоединение к запросам полей из других запросов или таблиц и соответственно создание объектов-столбцов для их отображения смысла не имеет.
Текст SQL-запроса, заданный в окне редактора кода средыDelphi, является запросом по умолчанию. Т.е. такой запрос будет автоматически выполняться, если он не будет изменен в процессе выполнения программы (см. ниже).
Методы Open и ExecSql
Помимо установки свойства Active = true компонент TQuerу имеет 2-ва метода Open и ExecSQL для выполнения запроса во время выполнения программы.
Метод Open используется для активизации запроса, возвращающего НД, то есть для активизации запроса SELECT. Например, для запроса quNakls, расположенного в модуле DM, получим:
DM.quNakls.Open;
а для запроса quNakls, расположенного на главной форме fmNakls, получим:
quNakls.Open;
Метод ExecSQL используется для активизации запросов, не возвращающих данные, то есть для активизации запросов CREATE, INSERT, DELETE, UPDATE, DROP и т.п.
Следует подчеркнуть:
при любом изменении свойств компонента-запроса, в том числе при занесении в свойство SQL нового запроса, он автоматически переходит в неактивное состояние (его свойство Active получает значение False). Для выполнения введенного запроса компонент следует открыть заново, то есть выполнить метод Open или ExecSQL, либо установить Active = True.
синтаксис SQL-операторов проверяется только при их выполнении методом Open или ExecSQL или при установке свойства Active = true.
Примечание 1. Размещение компонент работы с БД в отдельном модуле данных является рациональным во многих отношениях. Однако компонент TQuery можно размещать на форме, к которой он относится. При этом в свойстве DatabaseName компонента-запроса необходимо указывать не локальный псевдоним БД в программе - BiblData, а псевдоним БД в BDE – BiblDataMdb.
Примечание 2. Последующие примеры выполнены из расчета использования СУБД Access. При использовании другой СУБД возможны некоторые отличия. Так для СУБД PostgreSQL требуется имена таблиц и полей заключать в двойные кавычки.
Схема программного формированияSQL-запроса
Ниже приводится традиционная схема программного формирования и активизации SQL-запроса. Она состоит в следующих шагах:
Закрытие текущего запроса, если ранее он был открыт на этапе проектирования или выполнения программы;
Очистка текста – свойства SQL, текущего запроса;
Формирование нового текста SQL-запроса;
Заненсение текста SQL-запроса в свойство SQL компонента TQuery;
Открытие или активизация запроса;
В случае результативного выполнения запроса Select выполняется переход к первой записи временной таблицы, содержащей результат запроса.
Ниже приводится соответствующий фрагмент текста программы. При этом компонент quNakls расположен на главной форме.
var SQLTxt: string;
…
begin
quNakls.Close; // Закрытие запроса
quNakls.SQL.Clear; // Очистка запроса
// Формирование нового текста запроса
SQLTxt := 'SELECT NaklID, NDate, FName, TName, NSum, NFirm, ' +
'NPayedSum, NRetSum, NCoeff, NretDate ' +
'FROM Nakls, Firms, TypeNakl ' +
'WHERE FirmID = NFirm AND TypeID = NType AND ' +
'NSum > 10000 AND NType IN (0, 6) AND ' +
'NDate = "02.03.2000" ';
quNakls.SQL.Add(SQLTxt); //Занесение нового текста запроса в свойство SQL
quNakls.Open; // Открытие запроса
quNakls.First; //Переход к первой записи результата запроса
end;