Практическое занятие № 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;