Практическое занятие № 22
Тема: "Создание окна регистрации для подключения к СУБД"
Цель работы: получить практические навыки по настройке и подключению к серверной СУБД
Ход работы
Настройте SQL Server на работу через сеть.
Указания: по умолчанию SQL Server Express не может работать через сеть, потому что эта функций не включена. Для ее активации запустите утилиту "Диспетчер конфигурации SQL Server". В окне в левой части выберите узел "Протоколы для SQLEXPRESS". В правой части откройте элемент "TCP/IP" (по умолчанию он будет отключен).

В новом окне из списка " Включено" выберите значение "Да".

На закладке " IP-адреса" для нужных сетевых карт активируйте их и удалите значение из полей "Динамические TCP-порты". В группе "IPAll" в поле "Порт" введите значение 1433 (можно и другое, но этот порт является стандартом для SQL Server).

После установки всех параметров сервер нужно перезапустить. Для этого в левой части окна выберите узел " Службы SQL Server". В правой части в контекстном меню элемента "SQL server" выберите команду "Перезапустить".

Настройте SQL Server на аутентификацию пользователей по учетным записям сервера.
Указания: Запустите утилиту "Среда Microsoft SQL Management Studio". Для подключения к серверу нужно ввести учетную информацию:
Имя сервера: имя вашего компьютера, 1433
Проверка подлинности: Проверка подлинности SQL Server
Имя входа: sa
Пароль: 111

После запуска в левой части отобразится дерево объектов сервера. В контекстном меню сервера выберите команду "Свойства". В окне перейдите на закладку "Безопасность", выберите переключатель "Проверка подлинности SQL Server and Windows" и щелкните на кнопке ОК.

На сервере SQL Server создайте новую учетную запись с именем "student", паролем "111".
Указания: Для создания учетной записи в дереве раскройте папку "Безопасность", в контекстном меню узла "Имена входа" выберите команду "Создать имя входа". В результате откроется окно, в котором нужно указать имя, выбрать переключатель "Проверка достоверности SQL Server" и дважды ввести пароль новой учетной записи.

Для того, чтобы созданная учетная запись имела права на создание БД надо предоставить ей роль "dbcreators". Для этого в левой части окне выберите узел "Роли сервера" и с помощью переключателя укажите нужную роль.

После задания всех параметров щелкните на кнопке ОК.
Используя созданную учетную запись подключитесь к серверу и создайте базу данных с именем "Baza".
Указания: Для работы под созданной учетной записью нужно пройти повторную аутентификацию. В контекстном меню сервера выберите команду "Отключить" для отключения от сервера. Для повторного подключения выполните команду "Файл - Подключить к обозревателю объектов...". Введите новый логин и его пароль.
Для создания БД в контекстном меню узла " Базы данных" выберите команду "Создать базу данных". В окне введите имя БД "baza" и щелкните на кнопке ОК.
В базе данных создайте таблицу с именем "Vidy" для хранения данных о видах игрушек.
Каждая группа описывается свойствами:
- код группы (ключевое, счетчик);
- номер группы (числовое);
- название группы (уникальное, обязательное).
Заполните таблицу 3 произвольными записями.
Указания: Для создания таблицы в левой части окна раскройте список элементов созданной БД и в контекстном узла "Таблицы" выберите команду "Создать таблицу". Откроется окно, в котором надо ввести поля таблицы. Для создания ключевого поля используйте кнопку "Создать первичный ключ". Если поле обязательное для ввода, снимите флажок "Разрешить значения Nulls".

Для создания счетчика в нижней части окна найдите параметр "Спецификация идентификатора" и укажите значение "Да".
Для выполнения требования уникальности для поля nazv_grup создадим индекс для поля. Щелкните на кнопке "Управление индексами и ключами". В окне щелкните на кнопке "Добавить" и в правой части укажите параметр "Уникальный" = да.

После задания всех параметров таблицы щелкните на кнопке "Сохранить" и введите имя таблицы "vidy".
Для заполнения таблицы найдите ее в дереве объектов, щелкните на ней правой кнопкой мыши и выберите команду "Изменить первые...".
В этой же базе данных создайте таблицу «Toys» для хранения данных об игрушках.
Каждая игрушка описывается свойствами:
- шифр игрушки (ключевое, счетчик);
- код группы (числовое, обязательное, для связывания с главной таблицей Vidy);
- название (обязательное);
- страна-производитель (обязательное);
- материал (не обязательное);
- дата производства (не обязательное);
- цена (точность до 2 знаков, обязательное);
- фото (не обязательное);
- описание (не обязательное).
Заполните таблицу 3 произвольными записями ( по одном записи для каждой группы, поля «Фото» и «»Описание» не заполнять).
Указания: Создание новой таблицы выполняется аналогично предыдущему пункту.
Для создания счетчика в нижней части окна найдите параметр "Спецификация идентификатора" и укажите значение "Да".

После ввода всех полей закройте окно, подтвердите сохранение изменений и введите имя таблицы "toys".
Поле "id_grup" надо заполнять только значениями, которые есть в главной таблице "vidy".
Организуйте связывание созданных таблиц с обеспечением каскадного обновления и удаления данных.
Указания: Для обеспечения каскадного обновления данных в контекстном меню подчиненной таблицы toys выберите команду "Проект". В окне редактирования структуры таблицы на панели инструментов щелкните на кнопке "Отношения".
В новом окне щелкните на кнопке "Добавить". В свойстве "Спецификация таблиц и столбцов" щелкните на кнопке с тремя точками. В окне укажите главную таблицы и поля, по которым таблицы связанны.

В нижней части окна найдите параметр "Спецификация Insert и Update" и укажите каскадное удаление данных (обновление задавать не нужно, потому что ключевое поле является счетчиком и не может изменяться).

Сохраните изменения кнопкой Сохранить.
В среде Delphi создайте программу для просмотра и редактирования данных.

Указания: Для подключения БД SQL Server в Windows есть встроен драйвер БД.
Нанесите на форму компонент ADOConnection (ADO) и задайте свойства: Connection=false, LoginPrompt=true. Раскройте свойство ConnectionString и щелкните на кнопке Build.
На первом шаге выберите строку "Microsoft OLE DB Provider for SQL Server" и щелкните Далее.

На следующем шаге в первом пункте введите имя сервера. Для создания приложения, которое работает в сети, здесь нужно ввести сетевое имя сервера или его IP-адрес и через запятую номер порта (по умолчанию 1433).
Во втором пункте в полях "Пользователь" и "Пароль" введите параметры созданной нами учетной записи и включите флажок "Разрешить сохранение пароля".
В третьем пункте из списка выберите созданную БД.

После задания всех параметров щелкните на кнопке ОК.
Подключение главной таблицы
На форме разместите компонент ADOTable (ADO) и задайте свойства: Connection=ADOConnection1, TableName=vidy.
На форме разместите компонент DataSource (Data Access) и задайте свойство DataSet=ADOTable1.
На форме разместите компонент DBGrid (Data Controls) и задайте свойство DataSource=DataSource1.
На форме разместите компонент DBNavigator (Data Controls) и задайте свойство DataSource=DataSource1.
В событии OnCreate формы введите код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.Active:=true;
end;
В событии OnDestroy формы введите код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
ADOconnection1.Connected:=false;
end;
Поле "id_grup" является счетчиком, поэтому оно будет заполняться автоматически и отображать его в сетке нет потребности.
Для скрытия полей щелкните два раза на компоненте ADOTable1, в окне вызовите контекстное меню и выберите команду "Add All Fields". Для поля "id_grup" укажите свойство Visible=false.
Подключение подчиненной таблицы
На форме разместите компонент ADOTable (ADO) и задайте свойства: Connection=ADOConnection1, TableName=toys.
На форме разместите компонент DataSource (Data Access) и задайте свойство DataSet=AdoTable2.
На форме разместите компонент DBGrid (Data Controls) и задайте свойство DataSource=DataSource2.
На форме разместите компонент DBNavigator (Data Controls) и задайте свойство DataSource=DataSource2.
В событии OnCreate формы добавьте код:
ADOTable2.Active:=true;
Поле "id_grup" является связанным с главной таблицей, поэтому оно будет заполняться автоматически и отображать его в сетке нет потребности.
Поля "photo" и "charact" есть "тяжелыми", поэтому их также не нужно отображать в сетке.
Для скрытия полей щелкните два раза на компоненте ADOTable2, в окне вызовите контекстное меню и выберите команду "Add All Fields". Для полей "id_grup", "photo" и "charact" укажите свойство Visible=false.
Связывание таблиц на форме
Для компонента ADOTable2 (ссылается на подчиненную таблицу) задайте свойства: MasterSource = DataSource1 (ссылается на главную таблицу), MasterFields = (id_grup=id_grup).
Редактирование поля "photo"
Нанесите на форму компонент DBImage (Data Controls) и задайте свойства: DataSource=DataSource2, DataField=photo, Stretch=true.
Нанесите на форму компонент OpenPictureDialog (Dialogs) и в свойстве Filter удалите все типы кроме *.bmp. Будем заполнять поле "photo" двойным щелчком на компоненте DBImage.
В событии OnDblClick компонента DBImage введите код:
procedure TForm1.DBImage1DblClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute=true then
begin
ADOTable2.Edit;
TBlobField(ADOTable2.FieldByName('photo')).LoadFromFile(OpenPictureDialog1.FileName);
end;
end;
Редактирование поля "charact"
Данное поле есть "тяжелым", потому что может содержать текст больших объемов (аналог поля типа Memo). Для работы с таким полем нанесите на форму компонент DBMemo (Data Controls) и задайте свойства: DataSource=DataSource2, DataField=charact.
Добавьте в проект форму для регистрации пользователя на сервере
Указания: добавьте в проект новую форму Form2 и задайте свойства: BorderIcons - biSystemMenu = false (скрыть кнопку закрытия в заголовке окна), BorderStyle=bsDialog, Caption=Регистрация, Position=poDesktopCenter.
Форма не должна создаваться автоматически. Выполните команду "Project - Options". В окне на закладке "Forms" перенесите форму в список "Available Forms".
На форме разместите 4 компонента Edit (Standard) для ввода регистрационной информации. Для поля Edit2 (ввод пароля) установите свойство PasswordChar=*.
На форме разместите 4 компонента Label (Standard) и в свойстве Caption введите надписи для полей формы.
На форме разместите две кнопки Button (Standard) и в свойстве Caption введите надписи на кнопках (ОК и Отмена). Кнопка ОК будет реагировать на клавишу Enter, задайте для нее свойство Default = true. Кннопка Отмена будет реагировать на клавишу Esc, задайте для нее свойство Cancel = true.
Кнопка "Отмена" просто завершает работу программу. Для нее напишем код:
procedure TForm2.Button2Click(Sender: TObject);
begin
ExitpRocess(0);
end;
Кнопка "ОК" закрывает окно и передает параметры регистрации главной форме. Для обмена данными между формой регистрации и главной формой опишите глобальные переменные.
login, password, server, port:string;
Для кнопки напишем код:
procedure TForm2.Button1Click(Sender: TObject);
begin
login:=Edit1.Text;
password:=Edit2.Text;
server:=Edit3.Text;
port:=Edit4.Text;
close;
end;
Добавим на форму визуальные эффекты открытия и закрития. В событии OnShow формы добавьте код:
procedure TForm2.FormShow(Sender: TObject);
begin
Left:= (Screen.Width - Width)div 2;
Top:= (Screen.Height - Height)div 2;
AnimateWindow(Handle, 1000, $10 or $20000);
end;
В начало события OnClose формы добавьте команду:
AnimateWindow(Handle, 1000, $10 or $10000);
Форма регистрации должна появляться перед запуском главной программы. Для этого с помощью команды Project - View Source откройте код проекта и после оператора begin добавьте команды отображения формы регистрации.
form2:=TForm2.Create(nil);
form2.ShowModal;
На главной форме для компонента ADOConnection1 отключите свойство LoginPrompt.
Для использования глобальных переменных, в которых сохранены параметры соединения, и которые описаны на форме Form2, надо в коде главной формы подключить модуль формы Form2. Для этого выполните команду File - Use Unit.
В событии OnCreate формы внесите изменения, которые используют при подключении заданные пользователем параметры подключения к БД:
procedure TForm1.FormCreate(Sender: Tobject);
begin
ADOConnection1.Connected:=false;
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password='+password+';Persist Security Info=True;User ID='+login+';Initial Catalog=baza;Data Source='+server+','+port;
try
ADOConnection1.Connected:=true;
ADOTable1.Active:=true;
ADOTable2.Active:=true;
except
begin
Application.MessageBox('Неверные регистрационные данные',
'Ошибка подключения',MB_OK+MB_IconError);
ExitProcess(0);
end;
end;
end;
При успешном подключении к БД сохраните в INI файл логин, сервер и порт подключения.
Указания: в коде главной формы подключите модуль IniFiles. В событии формы OnCreate внесите изменения. Опишите локальную переменную для работы с INI фалом:
var ini:TIniFile;
В конце раздела try добавьте код вида:
//создаем в памяти переменную и связываем ее с
//открытым или созданным INI файлом в папке с проектом
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'settings.ini');
//записываем в INI файл указанные параметры
ini.WriteString('Connection','login',login);
ini.WriteString('Connection','server',server);
ini.WriteString('Connection','port',port);
//удаляем из памяти созданую переменную
ini.Free;
При открытии формы регистрации прочитайте сохраненные параметры и отобразите их в полях формы.
Указания: в коде формы регистрации подключите модуль IniFiles. В событии формы OnCreate введите код:
procedure TForm2.FormCreate(Sender: TObject);
//переменная для работы с INI файлами
var ini:TIniFile;
begin
//открытым или созданным INI файлом в папке с проектом
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'settings.ini');
//считываем из INI файла сохраненные параметры
//и записываем их в поля на форме
edit1.text:=ini.ReadString('Connection','login','');
edit3.text:=ini.ReadString('Connection','server','');
edit4.text:=ini.ReadString('Connection','port','');
//удаляем из памяти созданую переменную
ini.Free;
end;
Если поле Логин при открытии формы регистрации заполнено (значение прочитано из INI файла), то курсор нужно установить в поле Пароль. Для этого в событии OnShow формы регистрации введите код:
//если поле Логин заполнено, то ставим курсов в поле Пароль
if edit1.text<>'' then
edit2.Setfocus;