- •Введение
- •Содержание
- •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
- •Задание
65
Строку соединения допускается хранить в специальном файле связи с данными (UDLфайле). Для создания такого файла достаточно создать пустой текстовый файл и заменить расширение txt на udl. Запуск такого файла автоматически вызовет редактор настройки соединительной строки.
Соединение с хранилищем данных, компонент TADOConnection
Хотя основной задачей компонента считается установка соединения с базой данных ADO, но, ко всему прочему, TADOConnection умеет:
•регистрировать пользователя в СУБД;
•управлять транзакциями;
•отправлять в адрес СУБД различные команды (инструкции SQL);
•взаимодействовать с подчинёнными компонентами – наборами данных ADO;
•получать от БД информацию об её объектах и особенностях соединения.
Установка соединения
Для описания параметров подключения к БД текст соединительной строки направляется в свойство:
property ConnectionString: WideString;
Если в строке отсутствует информация о поставщике услуг OLE DB, то его необходимо определить в свойстве:
property Provider: WideString;
По умолчанию роль провайдера исполняет MSDASQL.
Процесс соединения с указанной в соединительной строке базой данных инициируется посредством обращения к методу Open(). В простейшей ситуации процедура даже не требует параметров.
procedure Open; overload;
В перегружаемой версии процедуры Open() предусмотрена возможность передачи в адрес сервера имени и пароля пользователя. Но это только для случая, когда эта информация не включена в соединительную строку.
procedure Open(const UserID: WideString;
const Password: WideString); overload;
Если вы полагаете, что при подключении к базе данных пользователь обязан пройти регистрацию и своими собственными руками ввести имя и пароль, то целесообразно установить в True свойство:
property LoginPrompt: Boolean;
В результате перед соединением с базой вызывается стандартное диалоговое окно регистрации.
Для проверки факта подключения компонента TADOConnection к БД контролируют состояние свойства:
property Connected: Boolean;
С процессом установки соединения связана строгая последовательность событий (см. табл. 11.2) позволяющая программисту практически на всех этапах помогать или мешать приложению получать доступ к БД.
Ставропольский государственный университет, кафедра КБ
|
|
|
66 |
|
|
|
|
|
|
|
|
Таблица 11.2. Последовательность событий при соединении TADOConnection с набором данных |
||
|
|
|
|
|
|
Событие |
Описание |
||
|
|
|
|
|
|
1. |
property BeforeConnect: TNotifyEvent; |
Вызывается перед началом соединения |
|
|
2. |
property OnWillConnect: TWillConnectEvent; |
Генерируется после отправки запроса на соединение |
|
|
3. |
property OnLogin: TLoginEvent; |
Регистрация пользователя |
|
|
4. |
property OnConnectComplete : |
Процесс соединения завешается |
|
|
|
TConnectErrorEvent; |
|
|
|
5. |
property OnInfoMessage: TInfoMessageEvent; |
Вызывается после успешного соединения, в тот мо- |
|
|
|
|
мент, когда провайдер возвращает дополнительную |
|
|
|
|
информацию о соединении |
|
|
6. |
property AfterConnect: TNotifyEvent; |
Вызывается по окончанию всего процесса соедине- |
|
|
|
|
ния |
Пример соединения без регистрации пользователя
Благодаря тому, что параметры соединения ADO содержатся в обычной текстовой строке, программист получает отличную возможность управлять процессом подключения к любому хранилищу данных просто редактируя параметры соединительной строки. Предлагаю вашему вниманию пример, позволяющий пользователю выбирать расположение исходного файл с данными в момент старта приложения настольной БД.
Допустим, что в нашем распоряжении имеется база данных в формате Microsoft Access. В составе форм проекта Delphi есть модуль данных frmDM:TDataModule на котором размещён компонент ADOConnection1 :TADOConnection. Перечень других компонентов и форм проекта сейчас для нас несущественен, наша задача предоставить пользователю возможность самостоятельно указать место расположения файла с БД.
Вполне очевидно, что для выбора файла БД в момент старта приложения следует выводить окно, уточняющее путь к файлу. Для этого дополняем наш проект новой формой (см. рис. 11.3) и размещаем на её поверхности следующий перечень компонентов:
•Строка ввода TEdit для редактирования пути к файлу. Переименовываем компонент в
edFilePath.
•Диалог открытия файла OpenDialog1. Для того, чтобы компонент реагировал только на
файлы Access следует отредактировать отвечающее за фильтрацию файлов свойство Filter:= Моя БД Access 2003|бд.mdb|Моя БД Access 2007| бд.accdb|Все файлы Mi-
crosoft Access|*.mdb; *.accdb.
•Справа от строки ввода расположите кнопку TButton и переименуйте её в btnChange-
FilePath. Щелчок по этой кнопке будет пробуждать от сна диалог открытия файла OpenDialog1.
•Два последних компонента – кнопки класса TBitBtn. Первую кнопку называем btnOK и её свойство Kind установим в bkOK. Свойству Kind второй кнопки присвоим bkCancel.
Рисунок 11.3. Форма ввода пути к БД
Ставропольский государственный университет, кафедра КБ
67
Сохраняем только что созданную форму, предварительно переименовав её в frmConnectToDB. Теперь напишем два простых обработчика события. Первое из событий вызывается щелчком по кнопке btnChangeFilePath.
procedure TfrmConnectToDB.btnChangeFilePathClick(Sender: TObject); begin
if OpenDialog1.Execute then edFilePath.Text:=OpenDialog1.FileName;
end;
В рамках события OnClick() мы выводим на экран диалог открытия файла (в котором пользователь выберет имя файла с БД) и передаём имя и путь к файлу в строку
edFilePath.
Второе событие отвечает за то, чтобы кнопка btnOK активизировалась только в случае, если текст в компоненте edFilePath действительно содержит верный путь к файлу. Эта предосторожность исключит ввод в строку ввода некорректных данных.
procedure TfrmConnectToDB.edFilePathChange(Sender: TObject); begin
btnOK.Enabled:=FileExists(edFilePath.Text); end;
Теперь наступает самый важный этап нашей работы. Вывод формы frmConnectToDB, спрашивающей у пользователя путь к файлу должен предварять запуск всех остальных форм приложения, но при этом её не стоит делать главной формой проекта. В таком случае целесообразно внести коррективы в головной модуль проекта.
Для вызова исходного текста головного модуля на экран выберите пункт меню Project – View Source. По умолчанию листинг модуля выглядит примерно так.
Program <НАЗВАНИЕ ВАШЕЙ ПРОГРАММЫ>;
uses
Forms,
main in 'main.pas' {frmMain},
dm in 'dm.pas' {frmDM: TDataModule},
ConnetcToDB in 'ConnetcToDB.pas' {frmConnectToDB}, {ДРУГИЕ МОДУЛИ ПРОЕКТА};
{$R *.res}
begin
Application.Initialize; {инициализация приложения} Application.MainFormOnTaskbar := True; Application.CreateForm(TfrmMain, frmMain); {создание главной формы} Application.CreateForm(TfrmDM, frmDM); {создание модуля данных} {СОЗДАНИЕ ДРУГИХ ФОРМ ПРОЕКТА}
Application.Run; {запуск приложения} end.
В списке uses перечисляется перечень используемых в проекте программных модулей и в составном операторе begin..end осуществляется инициализация и старт приложения и автоматически создаваемых форм проекта.
Нам предстоит провести некоторые доработки в главный модуль проекта. Вопервых, добавляем в список используемых модулей uses ссылки на модули SysUtils, Registry и Controls. Во-вторых, создаём функцию ConnectToDB(), она возьмёт на себя обязанности по вызову только что разработанной нами формы настройки соединения с базой данных. В-третьих, внесём незначительные изменения в процесс создания форм проекта.
Ставропольский государственный университет, кафедра КБ
68
program <НАЗВАНИЕ ВАШЕЙ ПРОГРАММЫ>;
uses
Forms, SysUtils, Registry, Controls, main in 'main.pas' {frmMain},
dm in 'dm.pas' {frmDM: TDataModule},
ConnetcToDB in 'ConnetcToDB.pas' {frmConnectToDB}, {ДРУГИЕ МОДУЛИ ВХОДЯЩИЕ В ПРОЕКТ};
{$R *.res}
Function CoonectToDB:boolean;
var RI:TRegIniFile; //переменная для работы с реестром begin
RI:=TRegIniFile.Create('Software'); {обращаемся к реестру} {!!! Переменная FilePath объявляется в секции VAR модуля данных frmDM!!!}
FilePath:=RI.ReadString('bookshop','path','');
frmConnectToDB:=TfrmConnectToDB.Create(application); if FileExists(FilePath)=true then frmConnectToDB.edFilePath.Text:=FilePath;
if frmConnectToDB.ShowModal=mrOK then //если нажата кнопка "OK" begin
FilePath:=frmConnectToDB.edFilePath.Text;//читаем путь
Result:=TRUE; //путь к файлу существует и находится в FilePath end
else Result:=False;
frmConnectToDB.Release; //уничтожаем форму выбора файла RI.Free; //освобождаем реестр
end;
begin
Application.Initialize; //инициализация приложения Application.MainFormOnTaskbar := True;
if CoonectToDB=true then //если соединение корректно, то
begin //создаём все формы и стартуем приложение
Application.CreateForm(TfrmMain, frmMain); Application.CreateForm(TfrmDM, frmDM); {СОЗДАНИЕ ДРУГИХ ФОРМ ПРОЕКТА} Application.Run;
end
else Application.Terminate; //если соединение не корректно
end.
Обсудим функцию ConnectToDB() подробнее. Задача функции заключается в запросе у пользователя пути к файлу с БД и передаче полученной строки компоненту соединения ADOConnection1. Для того, чтобы избавить пользователя от каждодневного рутинного поиска файла с данными сразу после старта функция обращается к системному реестру Windows. Для этого мы создаём экземпляр класса TRegIniFile и готовим его к чтению текстовых данных из подраздела реестра
HKEY_CURRENT_USER\Software\bookshop, в предположении, что там, в текстовом па-
раметре path содержится информация о пути к файлу с БД. Полученная с помощью метода ReadString() текстовая строка передаётся в объявленную в разделе var модуля данных frmDM глобальную переменную FilePath. После перечисленных действий функция создаёт описанный двумя страницами ранее экземпляр формы frmConnectToDB и выводит его на экран в модальном режиме. Пользователь уточняет путь к файлу и нажимает кнопку “ОК” на форме. Если все подготовительные операции завершились корректно – наша функция возвращает true.
Вызов функции ConnectToDB() осуществляется внутри составного оператора begin..end основного кода программы сразу после инициализации приложения.
Ставропольский государственный университет, кафедра КБ