if (queryResult == 1) {
daEvents =
new System.Data.OleDb.OleDbDataAdapter(
'SELECT * FROM Events', oleDbConnection1);
Application.Lock();
ds = (DataSet) Application['ds'];
ds.Tables['Events'].Clear();
daEvents.Fill(ds, 'Events');
Application['ds'] = ds;
Application.UnLock();
oleDbConnection1.Close();
}
}
Наконец, мы возвращаем queryResult
, позволяя клиенту узнать, что запрос был успешным:
[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
...
return queryResult;
}
Это завершает создание службы Web. Как и прежде, есть возможность протестировать эту службу, направляя браузер Web на файл .asmx
, поэтому мы можем добавить записи и взглянуть на представление XML для DataSet
, возвращаемое GetData()
, не создавая никакого клиентского кода.
Клиент приложения предварительного заказа помещения для проведения мероприятия
Используемый клиент является разработкой приложения Web PCSWebApp3
из предыдущей главы. Назовем это приложение PCSWebApp4
и воспользуемся кодом из PCSWebApp3
в качестве начальной точки.
Сделаем два существенных изменения в проекте. Первое: удалим все непосредственные обращения к базе данных из этого приложения и воспользуемся вместо этого службой Web. Второе: введем хранилище уровня приложения из DataSet
, возвращаемого из службы Web, которое обновляется только в случае необходимости, это значит, что на базу данных падает меньшая нагрузка.
Прежде всего в нашем новом приложении Web необходимо добавить ссылку Web на службу PCSWebSrv2/Service1.asmx
. Это можно сделать точно таким же образом, как мы видели ранее в этой главе, определяя местонахождение файла .vsdisco
и вызывая его eventDataService
.
После этого добавляем код в Global.asax
, по большей части, таким же образом, как это было сделано для службы Web. Этот код, однако, будет существенно проще. Сначала мы ссылаемся на службу Web и пространство имен System.Data
:
namespace PCSWebApp4 {
...
using System.Data;
using eventDataService;
Затем заполняем множество данных (dataset
) и помещаем его в хранилище данных уровня приложения с именем ds
:
protected void Application_Start(Object sender, EventArgs e) {
Service1 dataService = new Service1();
DataSet ds = dataService.GetData();
Application['ds'] = ds;
}
Теперь DataSet
доступно для всех
экземпляров PCSWebApp4
, т.е. несколько пользователей могут читать данные без какого-либо обращения к службе Web, то есть к базе данных.
Теперь, когда имеется это DataSet
, необходимо изменить WebForm1.aspx.cs
для его использования. Прежде всего можно удалить объявления oleDbConnection1
, daAttendees
, daRooms
и daEvents
, так как не будет осуществляться никакого обращения к базе данных. Затем необходимо изменить Page_Load()
следующим образом:
private void Page_Load(object sender, System.EventArgs e) {
validationSummary.Enabled = false;
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = false;
}
ds = (DataSet)Application['ds'];
attendeeList.DataSource = ds.Tables['Attendees'];
roomList.DataSource = ds.Tables['Rooms'];
eventTable = ds.Tables['Events'];
eventDetails1.DataSource = eventTable; eventDetails2.DataSource = eventTable;
if (!this.IsPostBack) {
System.DateTime trialDate = System.DateTime.Now;
calendar.SelectedDate = getFreeDate(trialDate);
this.DataBind();
} else {
eventDetails1.DataBind();
eventDetails2.DataBind();
}
}
Большая часть кода остается без изменений, необходимо только использовать Application ['ds']
вместо получения DataSet
.
Необходимо также изменить submitButton_Click()
для использования метода AddData()
службы Web. В этом случае также большая часть кода остается без изменений:
protected void submitButton_Click(object sender, System.EventArgs e) {
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = true;
}
this.Validate();
if (this.IsValid) {
String attendees = '';
foreach (ListItem attendee in attendeeList.Items) {
if (attendee.Selected) {
attendees += attendee.Text + ' (' + attendee.Value + '), ';
}
}