Практическая работа по теме 6. "Методы программирования, применяемые в Web"

advertisement
Практическая работа по теме 6. "Методы
программирования, применяемые в Web"
Доступ к базе данных с помощью ASP.NET технологии. Привязка данных
элементу управления DataGrid. Обновление информации в базе данных
помощью элемента управления DataGrid. Отображение связанной информации
Web-формах. Создание страницы регистрации: реакция на события. Вычисления
Web-страницах.
к
с
в
в
Оглавление
Задание 1. Доступ к базе данных с помощью ASP.NET технологии
Задание 2. Привязка данных к элементу управления DataGrid
Задание 3. Обновление информации в базе данных с помощью элемента
управления DataGrid
Задание 4. Отображение связанной информации в Web-формах
Задание 5. Создание страницы регистрации: реакция на события
Задание 6. Выполнение вычислений на Web-страницах
Задание 1. Доступ к базе данных с помощью
ASP.NET технологии
Цель
Включить учетную запись ASP.NET в состав учетных записей SQL Server.
Решение
Использовать программу SQL Server Enterprise Manager для формирования
учетной записи.
Обсуждение
Безопасное подключение к базе данных в концепции .NET реализуется с
помощью пространства имен System.Data и строки подключения. Одним из
параметров этой строки является параметр TRUSTED_CONNECTION, который
означает применение надежного подключения, то есть пользователь должен быть
идентифицирован операционной системой Windows, а аутентифицирующая
информация о нем должна храниться в SQL Server.
Для
создания
надежного
подключения
на
основе
параметра
TRUSTED_CONNECTION необходимо иметь учетную запись операционной среды
Windows, которую следует включить в состав учетных записей SQL Server.
1. Откройте программу SQL Server Enterprise Manager (Пуск - Программы Microsoft SQL Server - Enterprise Manager). Раскройте узел используемой базы
данных и узел Security (Безопасность), как показано на рис. 6.1.
Рис. 6.1. Выбор узла Security в SQL Server Enterprise Manager
2. Щелкните правой кнопкой мыши на элементе Logins (Учетные записи) и
выберите команду New Login (Создать учетную запись). На экране появится
диалоговое окно SQL Server Login Properties - New Login (Свойства учетных
записей SQL Server - Создать учетную запись), как показано на рис. 6.
Рис. 6.2. Диалоговое окно SQL Server Login Properties - New Login
3. Во вкладке General в текстовом поле Name укажите учетное имя
пользователя, выбрав его с помощью щелчка на кнопке с многоточием, или
введите в одном из форматов: "компьютер/ пользователь", "домен/ пользователь"
(рис.6.3).
Рис. 6.3. Выбор учетного имени пользователя
4. Найдите в списке учетную запись ASPNET и выберите ее.
5. В списке Database выберите свою базу данных (рис.6.4).
Рис. 6.4. Выбор базы данных в списке Database вкладки General
6. На вкладке Database Access установите флажок против имени вашей базы
данных. В списке Database Roles for "Имя базы" установите флажок роли public
(рис. 6.5).
Рис. 6.5. Выбор базы данных и роли пользователя
7. Выберите роль public и щелкните на кнопке Properties (рис. 6.6).
Рис. 6.6. Свойства роли public
8. Щелкните по кнопке Permissions. Убедитесь в том, что выбран
переключатель List all objects, и прокрутите список до конца, чтобы увидеть все
таблицы из вашей базы данных. Установите флажки всех таблиц в столбце
SELECT (рис. 6.7).
Рис. 6.7. Диалоговое окно для низкоуровневого указания разрешения пользователя
9. На этом этапе установите также флажки в столбцах INSERT, UPDATE и
DELETE, как показано на рис. 6.8. Это позволит пользователю модифицировать
записи базы данных.
Рис. 6.8. Установка разрешения на операции вставки, удаления и замены в таблицы
10. После выполнения этих действий для закрытия этого и двух других
диалоговых окон щелкните на кнопке OK в каждом из них. После этого в списке
учетных записей Logins в окне программы SQL Server Enterprise Manager появится
пользователь ASPNET (рис. 6.9).
Рис. 6.9. Список учетных записей Logins в окне программы SQL Server Enterprise
Manager
Итак, учетная запись ASPNET включена в список учетных записей SQL Server. В
следующем задании рассмотрим, как использовать созданную учетную запись для
подключения к базе данных без указания в строке подключения какой-либо
информации об имени и пароле учетной записи.
Самостоятельно
Сформируйте учетную запись для доступа к собственной базе данных на SQL
Server.
Задание 2. Привязка данных к элементу управления
DataGrid
Задача
Осуществить доступ к базе данных в Web-среде с помощью Web-браузера.
Решение
Применить параметр TRUSTED_CONNECTION для подключения к базе данных и
элемент управления DataGrid для отображения данных в Web-форме.
Обсуждение
Привязка данных к элементам управления вэб-форм во многом напоминает
привязку данных к формам Windows-приложений. Обе формы являются
достаточно гибкими и позволяют связывать множество свойств элемента
управления с данными из различных источников. Однако существуют некоторые
различия между этими формами, которые необходимо изучить.
В первую очередь, по своему назначению вэб-формы обычно являются
доступными только для чтения. Другими словами, после создания страницы, она
преобразовывается в понятный для браузера формат HTML, и представляет собой
информацию, доступную только для чтения, которую пользователь не может
изменить.
Архитектура привязки данных для вэб-форм не позволяет автоматически
записывать изменения в источник данных. Такой подход кардинально отличается
от Windows-форм, где содержимое объекта DataSet обновляется автоматически
при редактировании текстовых полей элемента управления DataGrid. Чтобы
воплотить в жизнь подобную функциональность в среде вэб, нам придется
создавать программный код вручную.
 Создайте новый проект с вэб-формой (ASP.NET Web Application).
 Разместите в новой вэб-форме элемент управления DataGrid. Наша
новая форма должна выглядеть приблизительно так, как показано на
рис. 6.10.
 Перед началом объявления класса задайте операторы импортирования
пространств имен:
Imports
System.Data
Imports System.Data.SqlClient
Рис. 6.10. Проект Web-формы
 Внутри объявления класса (после строки Public Class WebForm1),
задайте
строку
инициализации
подключения,
которое
будет
инициироваться в форме:
Dim strConnection As String = "server=(local);
database=EmployeeInfo;
TRUSTED_CONNECTION=YES"
 Напишите процедуру обработки загрузки вэб- страницы (код ниже):
Private
Sub
LoadData()
Создадим
объект
Connection,
выполним
его
инициализацию
Dim
cnn
As
New
SqlConnection(strConnection)
Создадим объект SqlCommand, в качестве свойства
CommandText зададим оператор SQL для извлечения
информации
из
базы
данных
Dim cmd As New SqlCommand("SELECT FirstName,
LastName, DepartmentID, Salary FROM Employees",
cnn)
Откроем
соединение
с
базой
данных
cnn.Open()
Создадим
объект
DataReader
для
хранения
извлеченной из базы данных информации. Выполним
оператор SQL с помощью метода ExecuteReader
объекта
Command
Dim
dReader
As
SqlDataReader
=
cmd.ExecuteReader(CommandBehavior.CloseConnection)
Свяжем элемент управления DataGrid с объектом
DataReader
DataGrid1.DataSource
=
dReader
DataGrid1.DataBind()
Закрываем
объект
DataReader
и
разрываем
соединение
с
базой
данных
dReader.Close()
cnn.Close()
End Sub
Приводимый ниже программный код следует поместить в обработчике события
Page_Load:
Private
Sub
Page_Load(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
If
Not
Page.IsPostBack
Then
LoadData()
End
If
End Sub
При запуске вашего приложения вы должны получить приблизительно такую
вэб-форму (рис.6.11).
Рис. 6.11. Web-форма при запуске
Полученная форма внешне мало отличается от элемента управления DataGrid в
обычном Windows-приложении, но при попытке модификации данных через эту
форму вам придется писать дополнительный программный код.
Самостоятельно
Отредактируйте HTML-код, сгенерированный автоматически при создании вэбформы, для изменения внешнего вида формы. Добавьте цвет фона, формат
шрифта и другие атрибуты в тэги элементов управления. Примерный вид
измененной формы может быть таким, как на рис. 6.12.
Задание 3. Обновление информации в базе данных с
помощью элемента управления DataGrid
Задача
Написать программный код, позволяющий вносить изменения в базу данных с
помощью вэб-формы и элемента управления DataGrid.
Решение
Отредактировать HTML-код, генерируемый автоматически при создании вэбформы,
и
написать
программный
код
для
выполнения
процедур
OnUpdateCommand, OnDeleteCommand, OnCancelCommand и OnEditCommand.
Обсуждение
Во-первых, нам необходимо открыть форму в режиме конструктора, а затем
перейти
к
просмотру
HTML-кода.
HTML-код,
который нам
предстоит
редактировать, приводится ниже:
< HTML>< HEAD>< title>WebForm1< /title> < meta
content="Microsoft
Visual
Studio
.NET
7.1"
name="GENERATOR"> < meta content="Visual Basic
.NET
7.1"
name="CODE_LANGUAGE">
<
meta
content="JavaScript" name="vs_defaultClientScript"> <
meta
content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema"><
/HEAD>
<
body
MS_POSITIONING="GridLayout"> < form id="Form1"
method="post"
runat="server">
<
asp:datagrid
id="DataGrid1" style="Z-INDEX: 101; LEFT: 64px;
POSITION: absolute; TOP: 40px" runat="server"
Height="216px"
Width="320px"
OnUpdateCommand="OnUpdateCommand"
OnDeleteCommand="OnDeleteCommand"
OnEditCommand="OnEditCommand"
OnCancelCommand="OnCancelCommand"
AutoGenerateColumns="False" GridLines="Horizontal" >
<
SelectedItemStyle
HorizontalAlign=Center><
/SelectedItemStyle>
<
EditItemStyle
HorizontalAlign=Center><
/EditItemStyle>
<
AlternatingItemStyle
HorizontalAlign=Center
ForeColor="Black"
BackColor="DarkSalmon"><
/AlternatingItemStyle>
<
ItemStyle
HorizontalAlign=Center
ForeColor="Black"
BackColor="White">< /ItemStyle> < HeaderStyle FontBold=True
ForeColor="Black"
BackColor="LightSteelBlue"><
/HeaderStyle>
<
Columns><
asp:EditCommandColumn
ButtonType="LinkButton"
UpdateText="Update"
CancelText="Cancel"
EditText="Edit">
<
/asp:EditCommandColumn>
<
asp:ButtonColumn
Text="Delete"
CommandName="Delete">
<
/asp:ButtonColumn>
<
asp:BoundColumn
DataField="FirstName"
ReadOnly="True"
HeaderText="FirstName">
<
HeaderStyle
HorizontalAlign="Center"
Width="150px"><
/HeaderStyle> < ItemStyle HorizontalAlign="Center"><
/ItemStyle>< /asp:BoundColumn> < asp:BoundColumn
DataField="LastName"
HeaderText="LastName">
<
HeaderStyle
HorizontalAlign="Center"
Width="150px"><
/HeaderStyle>
<
ItemStyle
HorizontalAlign="Center"><
/ItemStyle><
/asp:BoundColumn>
<
asp:BoundColumn
DataField="DepartmentId"
ReadOnly="True"
HeaderText="DepartmentId">
<
HeaderStyle
HorizontalAlign="Center"
Width="150px"><
/HeaderStyle> < ItemStyle HorizontalAlign="Center"><
/ItemStyle>< /asp:BoundColumn> < asp:BoundColumn
DataField="Salary"
HeaderText="Salary">
<
HeaderStyle
HorizontalAlign="Center"
Width="150px"><
/HeaderStyle>
<
ItemStyle
HorizontalAlign="Center"><
/ItemStyle>
<
/asp:BoundColumn>< /Columns>< /asp:datagrid><
/form>< /body>< /HTML>
В этом фрагменте HTML-кода необходимо выделить несколько важных
моментов. Прежде всего, обратите внимание на объявление объектов Command,
которые будут запускаться при вызове соответствующей операции:
OnUpdateCommand="OnUpdateCommand"
OnDeleteCommand="OnDeleteCommand"
OnEditCommand="OnEditCommand"
OnCancelCommand="OnCancelCommand"
Если пользователь щелкнет на гиперссылке Update в вэб-форме, будет вызвана
процедура OnUpdateCommand. Реализацию этой и других процедур необходимо
описать позже.
Просмотрите также форматирование для элемента управления DataGrid,
которое позволяет представить его в более привлекательном виде, чем раньше.
Обратите также внимание на выбор столбцов, которые отображаются в таблице.
Следует пояснить способ определения EditCommandColumns и то, как задается
отображаемая для пользователя надпись.
asp:EditCommandColumn
ButtonType="LinkButton"
UpdateText="Update"
CancelText="Cancel"
EditText="Edit">/asp:EditCommandColumn>
Если пользователь щелкнет на гиперссылке Edit, то откроется строка таблицы с
возможность редактирования тех полей, для которых не указано свойство
ReadOnly, равным True, и командами Update, Cancel, Delete (рис. 6.12).
После написания основного HTML-кода для элемента управления DataGrid,
можно добавлять программный код, предназначенный для модификации данных,
чтобы при выборе пользователем некоторой гиперссылки (Edit, Delete, Cancel,
Update), выполнялись соответствующие операторы.
Если вы все еще находитесь в режиме просмотра кода HTML, перейдите в
режим конструктора. По двойному щелчку мыши должно открыться окно с
программным кодом, в котором вам необходимо создать следующую процедуру
ExecuteSQL:
Private Sub ExecuteSQL(ByVal strSQL As String)
Эта процедура вызывает оператор SQL для внесения изменений в базу данных
Dim
cmd
As
New
Dim cnn As New SqlConnection
SqlCommand
Свяжем строку инициализации с объектом Connection
cnn.ConnectionString = strConnection
Зададим в свойстве CommandText командного объекта оператор SQL, который
будет использоваться для извлечения информации из базы данных
cmd.CommandText = strSQL
Свяжем свойство Connection командного объекта с объектом Connection
cmd.Connection
Откроем
cnn.Open()
=
cnn
подключение
Выполним оператор SQL при помощи объекта Command
cmd.ExecuteNonQuery()
Закроем подключение к базе данных
cnn.Close()
End Sub
Данная процедура предназначена для запуска оператора SQL, применяемого к
самой базе данных. Мы будем использовать эту процедуру для вызова команд
UPDATE и DELETE при выборе пользователем соответствующей гиперссылки.
Рис. 6.12. Форматирование элемента управления DataGrid
Далее нам нужно описать четыре отдельных процедуры, выполняемых при
выборе пользователем соответствующих ссылок. Вспомним, что в HTML-коде для
события OnEditCommand мы задали имя "OnEditCommand". Это означает, что нам
необходимо создать процедуру с таким именем, и поместить в ее код обработчик
нажатия ссылки Edit. Подобна процедура будет выглядеть приблизительно так:
Public Sub OnEditCommand(ByVal sender As Object,
ByVal e As DataGridCommandEventArgs)
Процедура активизируется при выборе гиперссылки Edit. Выбираем элемент
для редактирования:
DataGrid1.EditItemIndex = e.Item.ItemIndex
Загружаем данные:
LoadData()
End Sub
В процедуре OnEditCommand осуществляется выборка редактируемого
элемента в таблице DataGrid на основе информации о выделенной пользователем
позиции на момент нажатия гиперссылки Edit. При переходе в режим
редактирования, все доступные для редактирования столбцы данной строки
приобретают вид текстовых полей, значения в которых пользователь может
изменять. Для придания дополнительной гибкости вместо текстовых полей вы
можете создать временные столбцы с элементами управления "комбинированный
список" или другими элементами управления.
Далее, добавим текст процедуры OnUpdateCommand:
Public Sub OnUpdateCommand(ByVal sender
Object, ByVal e As DataGridCommandEventArgs)
As
Процедура запускается при выборе пользователем гиперссылки Update.
Извлекаем значение ключевого поля FirstName и сохраняем его в локальной
переменной
Dim
FirstName
FirstName = e.Item.Cells(2).Text
As
String
Извлечем значение, только что измененное пользователем в поле LastName
Dim
txtLastName
As
New
TextBox
txtLastName
=
e.Item.Cells(3).Controls(0)
Dim LastName As String = txtLastName.Text
Пользователь также может изменить значение поля Salary, сохраним новое
значение в локальной переменной:
Dim
txtSalary
As
New
TextBox
txtSalary
=
e.Item.Cells(5).Controls(0)
Dim Salary As Integer = Val(txtSalary.Text)
Сформируем SQL строку для выполнения обновления в базе данных
Dim
strSQL
As
String
strSQL = "UPDATE Employees SET LastName=' " &
LastName
&
"
'
"
strSQL += " , Salary = '" & Salary & "'"
strSQL += "WHERE FirstName='" & FirstName & "'"
Сохраняем изменения в базе данных с помощью процедуры ExecuteSQL
ExecuteSQL(strSQL)
Переходим обратно в режим просмотра таблицы
DataGrid1.EditItemIndex = -1
Загружаем обновленные данные из базы данных в DataGrid
LoadData()
End Sub
Добавим в форму еще одну процедуру -OnDeleteCommand. Программный код
процедуры представлен ниже:
Public Sub OnDeleteCommand(ByVal sender As Object,
ByVal e As DataGridCommandEventArgs)
Процедура вызывается при выборе пользователем гиперссылки Delete.
Извлекаем
ключевое
поле
текущей
строки
Dim
FirstName
As
String
FirstName
=
e.Item.Cells(2).Text
Определяем оператор SQL, задаем для него в
качестве параметра FirstName строки, подлежащей
удалению
Dim
strSQL
As
String
strSQL = "DELETE Employees WHERE FirstName= '" &
FirstName
&
"
'"
Удаляем
строку
из
базы
данных
ExecuteSQL(strSQL)
Возвращаемся
в
режим
просмотра
DataGrid1.EditItemIndex
=
-1
Повторная загрузка данных с целью подтверждения
внесенных
изменений
LoadData()
End Sub
И, наконец, напишем программный код для процедуры OnCancelCommand. Эта
процедура будет вызываться при выборе пользователем ссылки Cancel и
выполнять выход из режима редактирования без сохранения изменений. Добавим
в объявление формы следующий программный код:
Public Sub OnCancelCommand(ByVal sender As Object,
ByVal e As DataGridCommandEventArgs)
Процедура запускается при выборе пользователем гиперссылки Cancel.
Отменяем
выбор
DataGrid1.EditItemIndex
Обновляем
данные
LoadData()
End Sub
=
в
элементов:
-1
форме.
Самостоятельно
Протестируйте полученное приложение в режимах изменения и удаления
данных.
Создайте Web-форму для просмотра и редактирования списка отделов из
таблицы Departments.
Задание 4. Отображение связанной информации в
Web-формах
Задача
Написать программный код, позволяющий выполнять отображение информации
из связанных таблиц базы данных и вносить изменения в базу данных с помощью
вэб-формы и элемента управления DataGrid.
Решение
Добавить в форму элемент управления ListBox для отображения значений
связанной таблицы и написать программный код, позволяющий синхронизировать
вывод информации из другой таблицы в DataGrid.
Обсуждение
Вэб -страница, созданная в задании 3, позволяет отображать и редактировать
информацию из единственной таблицы Employees базы данных EmployeeInfo. Вы
должны были обратить внимание на тот факт, что поле DepartmentID в
спроектированной
форме
не
подлежит
редактированию.
Попробуем
усовершенствовать Web-страницу с тем, чтобы отображать информацию из
связанных таблиц Employees и Departments
.
Добавим в форму элемент управления ListBox, который будет отображать
информацию из таблицы Departments. Добавить элемент "список" можно
непосредственно при проектировании формы, а можно описание кода HTML
страницы:
< asp:Label id="Label1" style="Z-INDEX: 102; LEFT:
64px; POSITION: absolute; TOP: 40px" runat="server"
Width="64px" Height="24px">Отделы< /asp:Label> <
asp:DropDownList ID="ListDep" Runat="server" FontName="Verdana" forecolor="Black" Font-Size="12"
style="Z-INDEX: 103; LEFT: 168px; POSITION:
absolute;
TOP:
40px"
Width="192px"><
/asp:DropDownList>
<
asp:Button
id="Button1"
style="Z-INDEX: 104; LEFT: 392px; POSITION:
absolute; TOP: 40px" runat="server" Width="88px"
Text="Показать">< /asp:Button>
Приведенный выше HTML-код позволяет создать в Web-странице три элемента:
надпись, выпадающий список и командную кнопку. Список должен содержать
данные из таблицы Departments, кнопка - синхронизировать данные из двух
таблицы: Employees и Departments. Добавим в код формы процедуру
инициализации списка значениями из таблицы Departments.
Private Function LoadList() As SqlDataReader
Установим соединение с базой данных
Dim cnn As New SqlConnection(strConnection)
Создадим объект Command для выполнения SQL для выполнения SQL запроса к
таблице Departments
Dim cmd As New SqlCommand("SELECT * FROM
Departments", cnn)
Откроем соединение
cnn.Open()
Создадим объект DataReader для сохранения результатов выполнения метода
ExecuteReader объекта Command
Dim
dReader
cmd.ExecuteReader()
As
SqlDataReader
=
Поскольку, мы организовали процедуру чтения таблицы Departments как
функцию, необходимо описать возвращаемые значения
Return
dReader.Close()
cnn.Close()
End Function
dReader
Имея содержимое таблицы Departments в объекте DataReader необходимо
отобразить данные в форме с помощью элемента "список". Внесем
соответствующие изменения в процедуру загрузки вэб-страницы:
Private
Sub
Page_Load(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
If Not Page.IsPostBack Then
Выполним связывание данных, полученных из базы данных и элемента
управления DropDownList, к которому мы обращаемся как ListDep, так как в HTMLкоде указали ID="ListDep"
ListDep.DataSource = LoadList()
Удобнее, если пользователь будет видеть название отдела, а не его код
ListDep.DataTextField = "DepartmentName"
Но при выборе строки списка необходимо сохранить значения поля ID
ListDep.DataValueField = "ID"
Выполним связывание данных, отображенных с помощью списка
ListDep.DataBind()
Это вызов процедуры загрузки таблицы DataGrid, код формирования которой
следует изменить (смотри ниже)
LoadData()
End
End Sub
If
Код загрузки элемента DataGrid, отображающего данные таблицы Employees,
следует привести в соответствие с поставленной задачей - отображением только
выбранных записей таблицы.
Private Sub LoadData()
Создадим объект Connection для выполнения соединения с базой данных
Dim cnn As New SqlConnection(strConnection)
Создадим объект DataSet для локального хранения данных, полученных в
результате выполнения запроса к базе данных
Dim ds As New DataSet
С помощью адаптера данных выполним запрос к базе данных
Dim da As New SqlDataAdapter("SELECT * FROM
Employees", cnn)
Для фильтрации информации в соответствии с выбранным элементом из списка
отделов можно использовать объект DataView
Dim dv As New DataView
Открываем соединение с базой данных
cnn.Open()
Метод Fill адаптера данных позволяет заполнить объект
da.Fill(ds, "Employees")
Свяжем объект DataView с таблицей Employees, размещенной в объекте
DataSet
dv.Table = ds.Tables("Employees")
Объект DataView имеет свойство RowFilter, позволяющее
фильтрацию данных в соответствии с указанными критериями
dv.RowFilter
=
"DepartmentID='"
Val(ListDep.SelectedValue) & " '"
выполнять
&
Отобразим полученные после фильтра данные в Web-странице посредством
табличного элемента управления DataGrid
DataGrid1.DataSource = dv
Выполним связывание данных, представленных в форме
DataGrid1.DataBind()
cnn.Close()
End Sub
Таким образом, приведенный код измененной процедуры загрузки данных в
элемент управления DataGrid демонстрирует другой прием работы с базой данных
- отсоединенную технологию с использованием объекта DataSet.
Осталось добавить тривиальную процедуру обработки щелчка по командной
кнопке:
Private
Sub
Button1_Click(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
LoadData()
End Sub
Дайте название "Сотрудники" Web-странице с помощью свойств страницы
Properties. Окончательный вид Web-страницы Сотрудники показан на рис. 6.13.
Самостоятельно
Для вызова процедуры загрузки отфильтрованных данных в элемент DataGrid
была использована командная кнопка. Удалите из формы командную кнопку и
свяжите вызов процедуры загрузки в DataGrid с процедурой обработки изменения
выбранного индекса в элементе управления список. Другими словами, пусть
выбор новой строки в списке отделов будет вызывать изменения в DataGrid без
использования дополнительных элементов управления.
Рис. 6.13. Web-представление для связанных таблиц базы данных
Задание 5. Создание страницы регистрации:
реакция на события
Задача
Первая страница Web-приложения должна быть страницей регистрации, на
которой выполняется идентификация пользователей. Страница регистрации также
должна регламентировать доступ пользователей к определенным страницам
приложения.
Решение
Создать в базе данных новую таблицу для хранения регистрационных
сведений.
Спроектировать
и
запрограммировать
страницу
регистрации
пользователей.
Обсуждение
Для хранения регистрационных сведений о пользователях приложения к базе
данных EmployeeInfo необходимо добавить в структуру базы данных EmployeeInfo
еще одну таблицу, которая не будет иметь непосредственного отношения к самой
базе данных, но будет содержать сведения о пользователях этой базы данных.
1. Сформируйте таблицу LoginDetails и поместите ее в схеме базы данных
EmployeeInfo. Структура таблицы приведена на рис. 6.14.
Рис. 6.14. Структура таблицы идентификации пользователей
2. Внесите в таблицу несколько строк
идентифицировать пользователей приложения.
для
проверки
возможности
3. Не забудьте обновить учетную запись для доступа к базе данных.
Необходимо включить таблицу LoginDetails в список доступных таблиц базы
данных (рис. 6.15).
Рис. 6.15. Обновление учетной записи для доступа к базе данных
Создадим страницу регистрации пользователей. Страница должна содержать
поля для ввода login и password. Приложение должно выполнить проверку
допустимости введенной информации с помощью таблицы LoginDetails. Если
регистрационное имя окажется ошибочным, приложение должно выдать
пользователю соответствующее сообщение об ошибке. После успешной
регистрации должна появиться Web-страница доступа к базе данных Сотрудники,
созданная нами ранее.
Для того чтобы пользователи не смогли пропустить страницу регистрации, на
странице Сотрудники будет добавлен алгоритм проверки того, что пользователь
попал на данную страницу именно со страницы регистрации. В противном случае
пользователь будет отправлен на страницу регистрации. Для создания страницы
регистрации необходимо выполнить следующие действия:
c
4. Создайте новую Web-форму. Измените значение свойства pageLayout формы
GridLayout на FlowLayout. Это изменение устройства формы позволит
располагать объекты сверху вниз, также как, например, в программах текстовых
редакторов.
5. Добавьте элементы управления на форму, как показано на рис. 6.16.
Рис. 6.16. Проект страницы для регистрации пользователя
6. Установите свойство TextMode элемента управления txtPassword равным
Password. Этот режим гарантирует, что вместо алфавитных символов будут
выводиться символы звездочки при наборе пароля пользователя.
7. Теперь можно улучшить внешний вид Web-формы. Переключитесь в окно
HTML-кода и добавьте форматирование, например, такое, как приведено ниже:
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN"> < HTML>< HEAD>< title>WebForm2<
/title> < meta name="GENERATOR" content="Microsoft
Visual
Studio
.NET
7.1">
<
meta
name="CODE_LANGUAGE" content="Visual Basic .NET
7.1">
<
meta
name="vs_defaultClientScript"
content="JavaScript"> < meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5"><
/HEAD> < body>< form id="Form1" method="post"
runat="server">
<
TABLE
style="WIDTH:346px;
HEIGHT:27px"
cellSpacing="1"
align="center"
border="1">< TR>< TD>Регистрация пользователя<
/TD>< /TR>< /TABLE> < p align="center">< asp:Label
ID="lblMessage"
Runat="server"
Visible="False"
ForeColor="red" Borderstyle="None">Label< /asp:Label><
/p> < TABLE style="WIDTH:308px; HEIGHT:110px"
cellSpacing="0" align="center" border="1">< TR>< TD
style="WIDTH:138px">Выберите форму для работы<
/TD> < TD style="HEIGHT:22px">< asp:DropDownList
ID="ddlEntity"
Runat="server"
Width="156px"><
/asp:DropDownList>< /TD>< /TR>< TR> < TD style="
WIDTH:138px; HEIGHT:22px">LoginID< /TD> < TD
style=" HEIGHT:22px">< asp:TextBox ID="txtLoginID"
Runat="server" Width="155px">< /asp:TextBox>< /TD><
/TR>
<
TR><
TD
style="
WIDTH:138px;
HEIGHT:25px">Password<
/TD>
<
TD
style="
HEIGHT:25px"><
asp:TextBox
ID="txtPassword"
Runat="server" TextMode="Password">< /asp:TextBox><
/TD>< /TR> < TR>< TD style=" WIDTH:138px;
HEIGHT:25px">< /TD> < TD style=" HEIGHT:25px"> <
asp:Button id="btnSubmit" runat="server" Text="Ok"><
/asp:Button>< /TD> < /TR>< /TABLE>< /form><
/body>< /HTML>
8. Перейдите в окно Design и щелкните кнопкой мыши в любом месте формы,
чтобы вызвать обработчик события загрузки страницы.
9. Импортируйте следующие пространства имен
Imports
Imports System.Data.SqlClient
System.Data
10. Опишите строку подключения к базе данных
Dim strConnection As String
database=EmployeeInfo;
TRUSTED_CONNECTION=YES"
=
"server=(local);
11. Напишите следующий код загрузки web-страницы:
Private
Sub
Page_Load(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
Первоначальное удаление всех существующих элементов на странице и
последующего заполнения элемента управления DropDownList на Web-форме
названиями объектов, подлежащих загрузке. В нашем случае единственным
объектом является форма "Сотрудники".
ddlEntity.Items.Clear()
ddlEntity.Items.Add("Сотрудники")
End Sub
12. Создайте функцию Authenticate, которая будет получать регистрационное
имя (идентификатор) и пароль в качестве входных параметров и возвращать
идентификационный статус после проверки регистрационной информации,
хранящейся в таблице LoginDetails. Ниже приведен код функции:
Private Function Authenticate(ByVal strLoginID
String, ByVal strPassword As String) As Int32
As
Возвращает
0
1
регистрационное
2 - неправильный пароль
успешная
имя
не
регистрация
найдено
Dim cnn As New SqlConnection(strConnection)
Создадим объект Connection для выполнения соединения с базой данных
Dim strSQL As String
Опишем строку SQL параметризованного запроса, который должен найти
запись для заданного регистрационного имени (ID)
strSQL = "SELECT
LoginID=@LoginID"
*
FROM
LoginDetails
WHERE
Создадим командный объект для выполнения SQL-запроса к базе данных
Dim
cmd
As
cmd = New SqlCommand(strSQL, cnn)
SqlCommand
Необходимо добавить описание параметра: имя параметра и его значение
cmd.Parameters.Add("@LoginID", strLoginID.Trim)
Открываем соединение с базой данных
cnn.Open()
Создадим объект DataReader для хранения результатов выполнения запроса к
базе данных
Dim drLogin As SqlDataReader
Выполним запрос и сохраним результат поиска в объекте DataReader
drLogin = cmd.ExecuteReader
Проверим, была ли для данного регистрационного имени возращена запись
If drLogin.Read Then
Если регистрационное имя существует, необходимо проверить правильность
пароля
If (drLogin.GetString(1).Trim = strPassword.Trim)
Then
Return
(0)
'успешно
Else
Return
(2)'
неправильный
пароль
End
If
Else
Если не найдено записей для заданного регистрационного имени Return (1)'
регистрационное имя не найдено
End If
Закрыть считывающую программу и объект соединения
drLogin.Close()
cnn.Close()
End Function
13. Напишите код для кнопки OK.
Когда пользователь нажимает кнопку ОК, должна вызываться функция
Authenticate. При успешной регистрации эта страница направляет пользователя
на соответствующую страницу приложения. Однако при неудачной попытке
регистации для пользователя должно выводиться соответствующее сообщение с
помощью элемента управления lblMessage. Код обработки события Click кнопки
ОК приведен ниже:
Private
Sub
btnSubmit_Click(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
btnSubmit.Click
Объявим
переменную
для
хранения
статуса
идентификации
пользователя
Dim
AuthenticationStatus
As
Int32
Вызов
функции
Authenticate
с
параметрами,
введенными
пользователем
AuthenticationStatus
=
Authenticate(txtLoginID.Text.Trim,
txtPassword.Text.Trim)
Select
Case
(AuthenticationStatus)
Case
0'
Успешная
регистрация
lblMessage.Text
=
"Login
Successful"
проверка значения, выбранного в DrowDownList для
определения загружаемой формы, в нашем случае
единственная
форма
Сотрудники
Select
Case
ddlEntity.SelectedItem.Text
Case
"Сотрудники"
Направление пользователя к выбранной форме;
обратите внимание на полное имя формы с
расширением
.asp
Response.Redirect("WebForm1.aspx")
Для выбора из более обширного списка необходимо
добавить блоки Case для выбора созданных вами
других
форм
End
Select
Case 1' регистрационное имя (идентификатор) не
найдено
lblMessage.Text = "Invalid login ID. Please try again"
Case
2
'
неправильный
пароль
lblMessage.Text = "Invalid password.Please try again"
End
Select
Установить видимость lblMessage равной True
lblMessage.Visible
=
True
End Sub
На этом мы завершили разработку кода, который должен быть добавлен в файл
Web-формы WebForm2.asp.
14. Установите в Properties регистрационной формы WebForm2.asp свойство Set
As Start Page.
Примерный вид регистрационной формы после запуска показан на рис. 6.17.
Рис. 6.17. Регистрационная форма пользователя базы данных
Теперь нам осталось добавить несколько строк в процедуру загрузки формы
"Сотрудники" с тем, чтобы предотвратить переход, в эту форму минуя
регистрационную форму.
15. Измените код процедуры загрузки формы WebForm1.asp
Private
Sub
Page_Load(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
Проверка, не является ли это обращение повторным. Postback - это свойство
Web-формы. Значение свойства Postback - true, если страница была загружена
при ответе клиенту, в противном случае его значение false. Свойство Postback
используется для проверки, выполняется ли данный код в результате ответа или
в результате повторного обращения пользователя.
If Not Page.IsPostBack Then
Если пользователь попытается попасть на страницу, просто набрав URL в
адресной строке браузера, перенаправим его на страницу регистрации
If
Request.UrlReferrer
Is
Nothing
Response.Redirect("WebForm2.asp")
End
If Request.UrlReferrer.ToString.Length <
Request.UrlReferrer.ToString.Substring(14)
"WebForm2.asp"
Response.Redirect("WebForm2.asp")
End
Then
If
12 Or
<>
Then
If
ListDep.DataSource
ListDep.DataTextField
ListDep.DataValueField
ListDep.DataBind()
LoadData()
End
End Sub
=
=
LoadList()
"DepartmentName"
=
"ID"
If
Самостоятельно
Используя режим HTML-кода, выполните оформление регистрационной формы
по своему вкусу.
Протестируйте созданное приложение в различных режимах доступа, делая
осознанные ошибки при вводе login и password.
Задание 6. Выполнение вычислений на Webстраницах
Задача
Класс System.Web.UI.WebControls.DataGrid позволяет создавать элемент
управления DataGrid для вывода табличных данных. Этот элемент управления
идеально приспособлен для вывода, редактирования, сортировки данных из базы
данных. Необходимо научиться использовать DataGrid не только для
отображения, но и для выполнения вычислений над данными.
Решение
Заполнить элемент управления DataGrid данными из таблицы Employees базы
данных EmployeeInfo. Выполнить начисление премии каждому сотруднику на
основе данных столбца Salary и отобразить вычисленные данные в столбце
DataGrid.
Обсуждение
1. Создайте в рамках приложения EmployeeInfo еще одну Web-форму.
2. Разместите на форме элемент управления DataGrid. Ниже приведен пример
форматирования Web- формы в коде HTML, но не использовано цветовое
оформление, которое вы можете добавить сами.
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN"> < HTML>< HEAD>< title>WebForm3<
/title> < meta name="GENERATOR" content="Microsoft
Visual
Studio
.NET
7.1">
<
meta
name="CODE_LANGUAGE" content="Visual Basic .NET
7.1">
<
meta
name="vs_defaultClientScript"
content="JavaScript"> < meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5"><
/HEAD> < body MS_POSITIONING="GridLayout"> < form
id="Form1"
method="post"
runat="server">
<
asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT:
16px; POSITION: absolute; TOP: 24px" runat="server"
Width="552px"
Height="240px"
AutoGenerateColumns="False"><
Columns>
<
asp:BoundColumn
DataField="FirstName"
HeaderText="FirstName">
<
HeaderStyle
HorizontalAlign="Center" Width="150px">< /HeaderStyle>
< ItemStyle HorizontalAlign="Center">< /ItemStyle><
/asp:BoundColumn>
<
asp:BoundColumn
DataField="LastName"
HeaderText="LastName">
<
HeaderStyle HorizontalAlign="Center" Width="150px"><
/HeaderStyle> < ItemStyle HorizontalAlign="Center"><
/ItemStyle>< /asp:BoundColumn> < asp:BoundColumn
DataField="DepartmentId" HeaderText="DepartmentId"> <
HeaderStyle HorizontalAlign="Center" Width="150px"><
/HeaderStyle> < ItemStyle HorizontalAlign="Center"><
/ItemStyle>< /asp:BoundColumn> < asp:BoundColumn
DataField="Salary" HeaderText="Salary"> < HeaderStyle
HorizontalAlign="Center" Width="150px">< /HeaderStyle>
< ItemStyle HorizontalAlign="Center">< /ItemStyle><
/asp:BoundColumn>
<
asp:BoundColumn
DataField="Премия"
HeaderText="Премия">
<
HeaderStyle HorizontalAlign="Center" Width="150px"><
/HeaderStyle> < ItemStyle HorizontalAlign="Center"><
/ItemStyle>< /asp:BoundColumn> < asp:BoundColumn
DataField="Итого" HeaderText="Итого"> < HeaderStyle
HorizontalAlign="Center" Width="150px">< /HeaderStyle>
< ItemStyle HorizontalAlign="Center">< /ItemStyle><
/asp:BoundColumn> < /Columns>< /asp:DataGrid><
/form>< /body>< /HTML>
3. Напишите процедуру загрузки формы
Imports
System.Data
Imports
System.Data.SqlClient
Dim strConnection As String = "server=(local);
database=EmployeeInfo;
TRUSTED_CONNECTION=YES"
Private
Sub
Page_Load(ByVal
sender
As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
If
Not
Page.IsPostBack
Then
Dim cnn
As
New
SqlConnection(strConnection)
Dim
ds
As
New
DataSet
Dim da As New SqlDataAdapter("SELECT * FROM
Employees",
cnn)
da.Fill(ds)
Создадим объект DataColumn для вычислений и
записи
в
DataGrid
Dim
dc
As
DataColumn
dc
=
New
DataColumn("Премия",
Type.GetType("System.Double"))
Вычисления сохраняются в свойстве Expression
объекта
DataColumn
dc.Expression
=
"Salary
*1.2"
Столбец необходимо добавить в коллекцию столбцов
таблицы
в
DataSet
ds.Tables(0).Columns.Add(dc)
dc
=
New
DataColumn("Итого",
Type.GetType("System.Double"))
dc.Expression
=
"Salary
+Премия"
ds.Tables(0).Columns.Add(dc)
DataGrid1.DataSource
=
ds.Tables(0).DefaultView
DataGrid1.DataBind()
End
If
End Sub
Окончательный вид DataGrid с вычисляемыми столбцами показан на рис. 6.18.
Рис. 6.18. Web-страница с вычислениями над столбцами базы данных
Самостоятельно
1. Оформите Web-страницу, используя HTML-код. Протестируйте полученное
приложение. Выполните другие вычисления, например, вычислите подоходный
налог на заработную плату и сумму, получаемую "на руки".
2. Добавьте полученную форму с вычислениями в список объектов доступа
регистрационной формы.
3. Измените процедуру загрузки страницы с вычислениями с целью устранения
несанкционированного доступа к странице без прохождения регистрации.
Download