- •Технології проектування баз даних в delphi
- •6.051001 - Метрологія та інформаційно-вимірювальні технології
- •Технології проектування баз даних в delphi
- •6.051001 - Метрологія та інформаційно-вимірювальні технології
- •1Введение
- •2Введение в базы данных
- •2.1Типы субд
- •2.2Стандарт odbc
- •2.3Технологии взаимодействия delphi с бд
- •2.3.1Особенности технологии bde
- •2.3.2Особенности технологии ado
- •2.4Таблицы бд и связи между ними
- •2.5Первичные ключи и индексы
- •2.6Демонстрационная бд "поставщик книг"
- •3Использование odbc для подключения источника данных. Псевдонимы бд
- •3.1Внешний и внутренний псевдонимы бд
- •3.1.1Создание внешнего псевдонима
- •3.1.2Проверка работоспособности внешнего псевдонима в среде Delphi
- •3.2Внутренний псевдоним бд
- •3.2.1Назначение внутреннего псевдонима бд
- •3.2.2Создание внутреннего псевдонима
- •3.2.3Преимущества использования внутреннего псевдонима и проблемы перехода на другие субд
- •4Создание проекта с бд в технологии bde
- •4.1Особенности использования bde для соединения с источником данных
- •4.2Структура проекта с бд и визуальными компонентами
- •4.3Активизация проекта
- •4.4.4Компоненты tdbGrid
- •4.5Модуль данных
- •4.5.1Создание модуля данных tDataModule
- •4.5.2Связь модуля главного окна с модулем данных
- •4.5.3Создание компонента tDatabase
- •4.5.4Создание компонента tTable
- •4.5.5Создание компонента tDataSource
- •4.5.6Связь модуля главного окна с модулем данных
- •4.5.7Связь сетки tdbGrid и навигатора dbNavigator c источником данных tDataSource
- •4.5.8Связь главный-детальный между наборами данных
- •4.5.9Задание реляционной связи между наборами данных
- •4.5.10Активизация наборов данных
- •4.5.11Недостатки полученных решений и пути их устранения
- •4.6Объекты-столбцы сетки dbGrid
- •4.6.1Создание объектов-столбцов
- •4.6.2Редактирование объекта-столбца
- •4.7Объекты-поля наборов данных
- •4.7.1Назначение объектов-полей
- •4.7.2Создание объектов-полей
- •4.7.3Присоединение к наборам данных новых полей
- •4.7.4Присоединение полей из других таблиц. Подстановочные поля
- •4.7.5Вычисляемые поля
- •4.8Обработчики событий компонент работы с бд
- •4.8.1Обработчики событий OnGetText полей нд и компонента визуализации данных tdbGrid
- •4.8.2Установка системных переменных в обработчике событя OnCreate
- •4.9Бизнес-правила и обработчики событий компонент работы с бд
- •5Sql запросы к бд
- •5.1Компонент tQuery
- •5.2Создание компонента tQuery
- •5.3Использования компонента tQuery
- •5.3.1Свойство sql компонента tQuery
- •5.3.2Методы Open и ExecSql
- •5.3.3Схема программного формирования sql-запроса
- •5.3.4Параметрические запросы
- •5.3.5Параметрические запросы и свойство DataSource компонента tQuery
- •5.3.6Связь главный-детальный с компонентом tQuery в качестве детального набора данных
- •5.4Доступ к полям запроса
- •5.4.1Обращение к значению поля при помощи свойств объектов-полей Value и AsXxxx
- •5.4.2Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •5.4.3Обращение к значению поля при помощи функции набора данных FieldByName
- •5.5Программный доступ к данным запроса
- •5.5.1Общая схема программного доступа к данным запроса
- •5.5.2Последовательная навигация по записям
- •5.6Обзор событий компонента tQuery
- •6Хранимые процедуры и триггеры
- •6.1Хранимые процедуры
- •6.2Создание хранимых процедур
- •6.3Вызов хранимых процедур
- •6.4Триггеры
- •7Наборы данных
- •7.1Обзор событий класса tdbDataSet
- •7.1.1Реализация каскадных изменений и бизнес-правил
- •7.1.2Другие события
- •8Технология ado
- •8.1Основные особенности технологии ado
- •8.2Реализация технологии ado в Delphi
- •8.3Создание проекта с бд в технологии ado. Установка связи с бд
- •8.3.1Создание модуля данных
- •8.3.2Начало настройки связи
- •8.3.3Выбор провайдера
- •8.3.4Настройка провайдера
- •8.3.5Настройка провайдера Microsoft Jet 4.0 ole db Provider
- •8.3.6Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •8.3.7Завершение настройки связи
- •8.3.8Настройка оставшихся компонент модуля данных
- •8.4Особенности использования компонентов ado
- •8.4.1Базовые объекты ado
- •8.4.2Объект Recordset
- •8.4.3Объект Command
- •8.4.8Связной компонент tadoConnection
- •8.4.9Компонент tadoCommand
- •8.5.2Специфические свойства
- •8.5Свойства, методы и события ado компонентов-наборов
- •8.5.1Общие свойства с bde-компонентами
- •8.5.3Методы класса tCustomAdoDataSet
- •8.5.4События класса tCustomAdoDataSet
- •8.6Компонент tadoDataSet
- •8.7Компонент tadoTable
- •8.8Компонент tadoQuery
- •9Компоненты визуализации данных в Delphi
- •9.1Компонент tdbGrid
- •9.1.1Свойства
- •9.1.2Дополнительные возможности сетки
- •9.2Компоненты визуализации полей текущей записи
- •9.2.1Компонент tdbText
- •9.2.2Компонент tdbEdit
- •9.2.3Компонент tdbCheckBox
- •9.2.4Компонент tdbRadioGroup
- •9.2.5Списочные компоненты
- •9.2.6Компонент tdbMemo
- •9.2.7Компонент tdbRichEdit
- •9.2.8Компонент tdbCtrlGrid
- •9.2.9Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
5Sql запросы к бд
Характерной особенностью компонента TQuery (запрос) является использование в нем языка SQL. С помощью этого языка программист составляет SQL-запрос, который помещается в предназначенное для этого свойство SQL компонента TQuery.
После активизации свойства Active = True либо вызова методов Open или ExecSQL компонента TQuery этот запрос передается машине баз данных BDE, которая имеет встроенный интерпретатор SQL, позволяющий ей выполнять описанные в запросе действия.
Если запрос требует получения из БД нужных сведений (запрос SELECT), сформированные с помощью BDE данные помещаются в локальную (временную) таблицу в виде временного файла в каталоге запуска программы, и компонент TQuery становится владельцем этой таблицы.
Данные из временной таблицы через компонент-посредник TDataSource передаются визуальным компонентам, например TDBGrid, и отображаются в них точно так же, как если бы они были получены компонентом TTable. Однако, в отличие от компонента TTable в компоненте TQuery, пользователь не может изменять данные, полученные из БД, так как они представляют собой лишь копию реальных данных.
Для изменения хранящейся в БД информации формируются специальные запросы (INSERT, UPDATE, DELETE и т.д.). В этом случае BDE не формирует новые и никак не использует ранее созданные временные таблицы, но лишь интерпретирует запрос и уведомляет программу о том, насколько успешно прошло его выполнение в БД. Таким образом, необходимость программного запроса на изменения данных в случае модификации НД является другим характерным отличием компонента TQuery от компонента TTable.
5.1Компонент tQuery
Компонент TQuery, как и компонент TTable, порожден от родительского класса TDBDataSet, рассматриваемого в разделе 5, и наследует от него основные методы, события и свойства.
Таким образом, компонент TQuery может рассматриваться как эквивалент компонента TTable, который отличается только тем, что состав его данных определяется содержимым SQL-запроса и располагается во временной таблице. Следовательно, процесс создания в модуле данных компонента TQuery и организация его связи с компонентом TDataSource остается таким же, как и у компонента TTable.
Так же как и компонент TTable компонент TQuery имеет собственные свойства, методы и события, наиболее важные из которых рассматриваются в этом разделе.
Ниже рассматривается процесс подключения компонента TQuery к проекту.
5.2Создание компонента tQuery
Создание компонента TQuery практически мало чем не отличается от создания компонента TTable.
Создание компонента TQuery может быть выполнено одним из 2-х способов:
Для создания компонента TQuery (вкладка BDE) откройте эту вкладку и щелкните на изображении компонета, а затем щелкните на псевдониме BiblData в окне дерева объектов.
Компонент TQuery появится в окне модуля данных, а в окне дерева объектов слева от компонента TQuery появится красный знак вопроса, означающий, что компонент TQuery еще не готов к работе.
Рисунок 4.49 – Окно дерева объектов
Примечание. Имеет смысл называть имена НД именами связанных с ними таблиц физической БД с соответствующим префиксом. Например, для таблицы NAKLS физической БД имя компонента TQuery следует дополнить префиксом quNakls (Рисунок 4 .50).
Внимание! В окне инспектора объектов в свойстве DatabaseName нового компонента TQuery автоматически появится имя локального псевдонима BiblData.
Рисунок 4.50 – Окно инспектора объектов для таблицы quNakls
Для создания компонента TQuery (вкладка BDE) откройте эту вкладку и щелкните на изображении компонета а затем щелкните непосредственно в окне модуля данных DM. В результате, как и в первом случае, в этом окне модуля данных появится новый компонент TQuery, а в окне дерева объектов слева от компонента TQuery появится красный знак вопроса, означающий, что компонент TQuery еще не готов к работе. Но в этом случае необходимо в окне инспектора объектов Object Inspector самому заполнить свойство DatabaseName компонента TQuery.
Красный знак вопроса слева от компонента TQuery в окне дерева объектов, означает, что компонент TQuery еще не готов к работе.
Компонент TQuery фактически является набором данных (НД). Однако в отличие от компонента TTable компонент TQuery используется для доступа к данным не какой-либо таблицы БД, а некоторого, определяемого программистом источника данных. Таким образом, компоненту TTable сопоставляется конкретная таблица физической БД, а компоненту TQuery результат SQL-запроса, указанного в свойстве SQL компоненту TQuery.
После определения SQL-запроса исчезнет красный знак вопроса слева от компонента в окне дерева объектов, что свидетельствует о готовности компонента к работе (Рисунок 4 .51).
Рисунок 4.51 – Окно дерева объектов с компонентом quNakls
Примечание 1. Как и для набора данных TTable свойство Active = True запроса TQuery позволяет активизировать запрос на этапе проектирования или выполнения программы.
Чтобы в главном окне программы сетка TDBGrid могла отображать данные из запроса quNakls, этому запросу нужно сопоставить собственный источник данных TDataSource. Для этого выделите компонент TDataSource на вкладке Data Access палитры компонентов и затем щелкните на запросе quNakls в окне дерева объектов. В результате будут сформированы поля DataSet и Name Инспектора объектов для этого компонента (Рисунок 4 .52).
Рисунок 4.52 – Окно инспектора объектов для компонента DataSource3
Примечание 2. Если компонент TDataSource сразу поместить на форму, то придется самостоятельно в свойстве DataSet этого компонента указать имя локального псевдонима базы данных BiblData.
Окончательный вид модуля данных приведен на Рисунок 4 .53.
Рисунок 4.53 – Вид модуля даных
Для визуализации результатов запроса необходимо связать компонент DataSource3 с сеткой - компонент TDBGrid, на главной форме.
В общем случае каждому запросу сопоставляется своя сетка - компонент TDBGrid. Способ ее создания и использования аналогичен описанному выше при работе с компонентом TTable. Однако можно использовать уже существующую сетку, но только, если результат запроса получает данные из тех же полей, что были сопоставлены столбцам выбранной сетки.
С целью уменьшения затрат на создание нового варианта главной формы свяжем уже существующий компонент DBGrid1 с компонентом DataSource3. Для этого необходимо выбрать соответствующее имя в поле DataSource компонента DBGrid1 (Рисунок 4 .54).
Рисунок 4.54 – Окно инспектора объектов для компонента DBGrid1
Примечание 3. Если бы к этому моменту программист сформировал в свойстве SQL (см. раздел 4.3.1) текст запроса (Рисунок 4 .55) и установил свойство Active = True запроса quNakls, то сетка DBGrid1 тут же наполнилась бы данными, в соответствии с этим запросом и содержимым источника данных DataSource1, связанным с набором данных НД Nakls.
Примечание 4. Выбор уже существующей сетки DBGrid1 породил одно неудобство, которое сразу видно при выполнении действий из примечания 1 и которое легко преодолевается. Дело в том, что 2-ва столбца этой сетки связаны с подстановочными полями таблицы Nakls. Однако запрос может обратиться только к реальным полям таблиц БД. Поэтому соответствующие столбцы сетки не заполняются данными. Для устранения этого недостатка необходимо связать запрос с реальными полями, которые были положены в основу создания подстановочных полей (см. ниже).
