Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие СУБД 2011.pdf
Скачиваний:
68
Добавлен:
10.06.2015
Размер:
2.75 Mб
Скачать

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 основного кода программы сразу после инициализации приложения.

Ставропольский государственный университет, кафедра КБ