В этом разделе мы начнем с модернизации нашего приложения события заказа помещения, а затем пойдем дальше и рассмотрим некоторые другие вещи, которые можно делать со связыванием данных, используя другие элементы управления Web.
Модернизация приложения заказа помещения
Создадим новое приложение Web с именем
PCSWebApp3
и скопируем код из созданного ранее приложения
PCSWebApp2
. Прежде чем начать новый код, давайте рассмотрим базу данных, к которой мы будем обращаться.
База данных
Для этого примера используем базу данных Microsoft Access с именем
PCSWebApp3.mdb
, которую можно найти вместе с загружаемым кодом для этой книги. Для учета масштаба предприятия имеет
смысл использовать базу данных SQL Server, но хотя используемая техника практически одинакова, но Access все же облегчает процесс тестирования. В ходе изложения будут показаны необходимые различия в коде, когда они возникнут. Представленная база данных содержит три таблицы:
□
Attendees
содержит список возможных почетных гостей событий.
□
Rooms
содержит список возможных помещений для событий.
□
Events
содержит список заказанных событий.
Attendees
Таблица
Attendees
содержит следующие столбцы:
Столбец
Тип
Примечания
ID
AutoNumber, первичный ключ
Идентификационный номер почетного гостя
Name
Text, необходимое значение, 50 символов
Имя почетного гостя
Email
Text, необязательное значение, 50 символов
Адрес e-mail почетного гостя
База данных позволяет хранить сведения о 20 почетных гостях, каждый из которых может иметь адрес e-mail. Другое приложение может автоматически посылать письмо почетным гостям после выполнения заказа. Читателям предлагается реализовать такое приложение в качестве упражнения.
Rooms
Таблица
Rooms
содержит следующие столбцы:
Столбец
Тип
Примечания
ID
AutoNumber, первичный ключ
Идентификационный номер помещения
Room
Text, требуемое значение, 50 символов
Название помещения
Events
Таблица
Events
содержит следующие столбцы:
Столбец
Тип
Примечания
ID
AutoNumber, первичный ключ
Идентификационный номер события
Name
Text, требуемое значение, 255 символов
Название события
Room
Number, требуемое значение
Идентификатор помещения для события
AttendeeList
Memo, требуемое значение
Список имен почетных гостей
EventData
Date/Time, требуемое значение
Дата события
Несколько событий представлены в загружаемой базе данных.
Соединение с базой данных
Два элемента управления, которые мы хотели бы связать с данными, —
attendeeList
и
roomList
. Чтобы сделать это, мы должны задать свойства
DataSource
этих элементов управления как таблицы, содержащие данные. Код должен загрузить данные в эти таблицы и выполнить соединение. Оба эти элемента управления имеют также свойства
DataTextField
и
DataValueField
,
которые определяют, какие столбцы использовать для вывода элементов списка и задания свойств
value
, соответственно. В обоих случаях можно задать эти свойства во время проектирования как
Name
и
ID
, что будет использоваться, как только задается свойство
DataSource
для заполнения элементами списка элемента управления.
Теперь мы можем сделать это в построителе форм Web. Удалите существующие записи из кода ASP.NET для этих элементов управления. Теперь что объявления будут выглядеть следующим образом:
Следующая задача состоит в создании соединения с базой данных. Существует несколько способов это сделать. Как мы видели в главе ADO.NET ранее, обычно для создания нового соединения используется окно Server Explorer. Так как мы работаем с Access, то тип провайдера для этого соединения будет Microsoft Jet 4.0 OLE DB Provider. Когда это будет задано в окне сервера, мы сможем перетащить соединение на форму Web, что добавит объект
, таким образом все будет готово для использования в коде.
Мы хотим выполнить соединение данных в обработчике событий
Page_Load
, так что элементы управления будут полностью заполнены, когда мы захотим использовать их в других частях кода. Приступаем к считыванию данных из базы данных, независимо от того, выполняется ли в данный момент операция обратной отправки (даже если элементы управления списком будут сохранять свое содержимое с помощью viewstate), чтобы гарантировать, что мы имеем доступ ко всем данным, которые могут понадобиться, хотя нам и не нужно выполнять само соединение данных при обратной отправке. Это может показаться слегка расточительным, но читатель при желании может в качестве упражнения добавить дополнительную логику к коду для оптимизации такого поведения. Здесь мы сосредоточимся на том, как заставить все работать, не входя в практические детали.
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = false;
}
oleDbConnection1.Open;
if (!this.IsPostBack) {
calendar.SelectedDate = System.DateTime.Now;
}
OleDbConnection1.Close;
}
Мы вскоре увидим, почему задание данных календаря оставлено внутри этого кода проверки обратной отправки.
Для обмена данными нам необходимо использовать несколько объектов хранения данных. Мы можем объявить их на уровне класса, чтобы мы имели к ним доступ из других функций. Нам понадобится объект
DataSet
для хранения информации базы данных, три объекта
OleDb.OleDbDataAdapter
для выполнения запросов на множестве данных и объект
DataTable
хранения событий для последующего доступа. Они объявляются следующим образом: