- •Введение
- •Содержание
- •1. Файловые системы
- •История развития
- •Файловые системы, принципы построения
- •Работа с типизированным файлом
- •Недостатки файловых систем
- •Задание
- •Реляционная таблица
- •Определение домена
- •Создание таблиц в среде Microsoft Access
- •Задание
- •Реляционные ключи
- •Связь между таблицами
- •Обеспечение целостности данных
- •Построение схемы данных средствами Microsoft Access
- •Мастер подстановок
- •Задание
- •Концепция ER-модели
- •Задание
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (BCNF)
- •Четвёртая нормальная форма (4NF)
- •Пятая нормальная форма (5NF)
- •Задание
- •Выборка значений из таблиц – SELECT
- •Порядок сортировки – ORDER BY
- •Ограничение набора данных – WHERE
- •Предикат существования EXISTS
- •Агрегатные функции
- •Группировка данных – Group By
- •Псевдонимы столбцов
- •Псевдонимы таблиц
- •Объединение нескольких таблиц
- •Построение запросов в среде Microsoft Access
- •Задание
- •Вставка новой записи – INSERT
- •Редактирование данных – UPDATE
- •Удаление записей – DELETE
- •Задание
- •Основные типы данных SQL-92
- •Язык определения данных – DDL
- •Задание
- •Подготовка отчёта в среде Access
- •Задание
- •3-х уровневая архитектура ANSI-SPARC
- •Создание форм для ввода данных в Microsoft Access
- •Задание
- •Строка соединения ADO
- •Соединение с хранилищем данных, компонент TADOConnection
- •Установка соединения
- •Пример соединения без регистрации пользователя
- •Информирование о БД
- •Задание
- •Базовый класс доступа к данным TDataSet
- •Открытие и закрытие набора данных
- •Обновление набора данных
- •Перемещение по набору данных
- •Создание закладок и переход к закладке
- •Редактирование записей в наборе
- •Фильтрация набора данных
- •Организация поиска данных
- •Взаимодействие с элементами управления данными
- •Задание
- •Поле таблицы – класс TField
- •Классификация полей по функциональному назначению
- •Классификация полей по типу обслуживаемых данных
- •Обращение к отдельному объекту-полю
- •Задание
- •Поля подстановки
- •Вычисляемые поля
- •Организация отношения главная-подчинённая таблица
- •Задание
- •Поля BLOB
- •Задание
- •Источник данных – компонент TDataSource
- •Общие черты компонентов отображения данных
- •Сетка базы данных – компонент TDBGrid
- •Статический текст – компонент TDBText
- •Строка ввода БД – компонент TDBEdit
- •Многострочный текстовый редактор БД – TDBMemo
- •Изображение БД – компонент TDBImage
- •Список БД – TDBListBox
- •Комбинированный список БД – TDBComboBox
- •Флажок БД – TDBCheckBox
- •Радиогруппа БД – TDBRadioGroup
- •Компонент – TDBCtrlGrid
- •Навигатор – TDBNavigator
- •Задание
- •Создание базы данных
- •Удаление базы данных
- •Создание таблиц
- •Пример создания таблиц средствами Transact SQL
- •Создание представлений
- •Задание
- •Определение и использование переменных
- •Операторы управления Transact-SQL
- •Базовые функции Transact-SQL
- •Хранимые процедуры
- •Триггеры
- •Задание
- •Запрос TADOQuery
- •Хранимая процедура TADOStoredProc
- •Транзакции и их изоляция
- •Управление транзакциями и компонент TADOConnection
- •Задание
- •Построение простейшего документа XML
- •Атрибуты
- •Определение документа DTD
- •Задание
69
Главная форма проекта frmMain, модуль данных frmDM подлежат созданию, только если функция возвратит (свидетельствующее о наличии файла с данными) значение true. В противном случае работа приложения прекращается.
Для завершения проекта нам остаётся сделать два последних штриха: создать строку соединения ADO и научить проект сохранять в реестре путь к файлу с данными. Эти задачи мы решим в модуле данных frmDM.
Работу с frmDM начинаем с объявления глобальной переменной FilePath. Именно она использовалась для хранения пути к файлу с данными. Затем воспользуемся двумя обработчиками событий модуля данных. Событие OnCreate() возникает в момент создания модуля данных, здесь мы заполним основные параметры соединительной строки ADO. Событие OnDestroy() вызывается при завершении работы модуля данных, оно нам пригодится для сохранения в реестре пути к базе данных.
var
frmDM: TfrmDM;
FilePath:string; //путь к базе данных implementation
{$R *.dfm}
procedure TfrmDM.DataModuleCreate(Sender: TObject); begin
{формируем соединительную строку} ADOConnec-
tion1.ConnectionString:='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+FilePath+';Persist Security Info=False'; ADOConnection1.Connected:=True;
end;
procedure TfrmDM.DataModuleDestroy(Sender: TObject); var RI:TRegIniFile;
begin
{сохраняем путь к файлу БД в реестре} RI:=TRegIniFile.Create('Software'); RI.WriteString('bookshop','path',FilePath); RI.Free;
end;
Проект завершён. Предложенное решение может оказаться полезным при работе не только с настольными СУБД, но и при разработке клиент-серверных проектов БД.
Информирование о БД
В состав методов компонента TADOConnection входит процедура способная предоставить нам системную информацию о базе данных
procedure OpenSchema(const Schema: TSchemaInfo; const Restrictions: OleVariant;
const SchemaID: OleVariant; DataSet: TADODataSet);
Первый параметр метода Schema: TSchemaInfo определяет какую именно информацию мы рассчитываем получить. Например, передав в параметр константу siIndexes – мы приобретём информацию об индексах БД, siTables – таблицах, siViews – представлениях. Второй параметр Restrictions представляет собой массив ограничений на запрашиваемую информацию. Третий по счёту параметр SchemaID применяется только в ситуации, когда глобальный уникальный идентификатор GUID провайдера данных не определён в стандартной спецификации OLE DB. Как правило, такая необходимость возникает в случаях, когда аргумент Schema установлен в siProviderSpecific. И, наконец, последний параметр DataSet является ссылкой на
Ставропольский государственный университет, кафедра КБ
70
элемент управления класса TADODataSet, в его множество записей Recordset будут направлены результаты выполнения процедуры. Полученные данные программист может обрабатывать по своему усмотрению, например, просто отобразить их в сетке
TDBGrid.
Апробируем приобретенные знания на практике. Разместите на форме (см. рис. 11.4) нового проекта компоненты:
•соединение ADO – ADOConnection1;
•набор данных ADO – ADODataSet1;
•источник данных – DataSource1;
•сетку – DBGrid1.
Перейдите к инспектору объектов. С помощью свойства Connection элемента управления ADODataSet1 свяжите компонент с ADOConnection1. Затем выберите источник данных DataSource1 и, воспользовавшись свойством DataSet, соедините его с ADODataSet1. В заключении подключите сетку DBGrid1 к источнику данных DataSource1. На этом манипуляции с инспектором объектов завершились.
Рисунок 11.4. Сбор данных о системной БД Microsoft SQL Server
Переходим к программированию. На своё усмотрение создайте строку соединения с интересующей вас базой данных. В этом примере мы соединяемся с системной базой данных Master из состава СУБД Microsoft SQL Server, размещённой на сервере MSSQLSERVER_HOST. Для этого опишем событие создание формы так, как предложено в следующем листинге:
procedure TForm1.FormCreate(Sender: TObject); begin
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Master; Data Source=MSSQLSERVER_HOST';
ADOConnection1.Open;
ADOConnection1.OpenSchema(siTables, EmptyParam, EmptyParam, ADODataSet1);
end;
Если всё сделано безошибочно, то в результате запуска проекта мы получим данные обо всех таблицах системной БД Master.
На основе процедуры OpenSchema() построен ряд справочных методов, способных снабдить нас данными о таблицах, полях таблиц и хранимых процедурах базы данных.
Ставропольский государственный университет, кафедра КБ
71
procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);
procedure GetFieldNames(const TableName: String; List: TStrings); procedure GetProcedureNames(List: TStrings);
Результаты выполнения процедур передаётся в список строк List.
Задание
1.В среде проектирования Delphi (C Builder) на основе компонента TADOConnection создайте приложение, соединяющееся с разработанной вами БД MS Access.
2.Предусмотрите в своём проекте возможность регистрации пользователя в БД.
3.Предусмотрите в своём проекте возможность сбора служебной информации о БД (имена доступных таблиц и их полей).
Ставропольский государственный университет, кафедра КБ
72
XII. Общие черты компонентов доступа к данным среды
Delphi
Вид занятия – практическое занятие. Время занятия – 2 часа.
Более десятка визуальных элементов управления среды программирования Delphi предназначены для решения вопросов отображения содержимого отдельных полей, или коллекции строк из набора данных, многие из них обучены редактировать данные, а кое-кто даже способен управлять процессом ввода/удаления данных из таблиц. Благодаря этим компонентам, мы, не написав ни одной строки кода, сможем строить несложные приложения, работающие с базой данных. Для проверки этого утверждения дополните разработанный на лабораторной работе 11 проект новой формой и разместите на главной форме следующий перечень элементов управления:
1.Таблица ADOTable1, этот компонент вы обнаружите на страничке dbGo палитры компонентов.
2.Источник данных DataSource1 (страничка Data Access).
3.Навигатор данных DBNavigator1 (страничка Data Controls).
4.Сетка для отображения данных DBGrid1 (страничка Data Controls).
Рисунок 12.1. Внешний вид первого проекта БД
Разместив все перечисленные компоненты на форме проекта (см. рис. 12.1), выберите таблицу – компонент ADOTable1. Нам предстоит проделать наиболее важную операцию – подключить компонент таблицу к физической таблице, которая в разработанном вами файле БД. Для этого выберите свойство Connection компонента и подключите его к компоненту-соединителю ADOConnection1.
Закончив настройку строки соединения мы получаем возможность подключить компонент ADOTable1 к файлу с таблицей. Для этого в инспекторе объектов находим свойство TableName и вводим имя любой таблицы из вашей БД, например TableName:=SUPPLIERS. Настройка подключения завершена, нам осталось только активи-
© Осипов Д.Л., 2011