Книга: C# для профессионалов. Том II

Служба Web заказа помещения для проведения мероприятий

Служба Web заказа помещения для проведения мероприятий

Создайте новый проект службы Web в VS.NET с именем PCSWebSrv2. Для начала добавим код в обработчик Application_Start() в global.asax. Мы хотим загрузить все данные из PCSWebApp3.mdb в множество данных и сохранить его. Это будет по большей части включать код, с которым мы знакомы, так как перенос базы данных в DataSet уже делали. Фактически, можно скопировать весь нужный код из WebForm1.aspx.cs в PCSWebApp3 из предыдущей главы, включая строку соединения с базой данных (которая здесь не показана, так как у читателя она должна быть, скорее всего, другой):

protected void Application_Start (Object sender, EventArgs e) {
 System.Data.DataSet ds;
 System.Data.OleDb.OleDbConnection оleDbConnection1;
 System.Data.OleDb.OleDbDataAdapter daAttendees;
 System.Data.OleDb.OleDbDataAdapter daRooms;
 System.Data.OleDb.OleDbDacaAdapter daEvents;
 oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
 oleDbConnection1.ConnectionStnng = @" ... ";
 oleDbConnection1.Open(); ds = new DataSet();
 daAttendees =
  new System.Data.OleDb.OleDbDataAdapter(
  "SELECT * FROM Attendees", oleDbConnection1);
 daRooms =
  new System.Data.OleDb.OleDbDataAdapter(
  "SELECT * FROM Rooms", oleDbConnection1);
 daEvents =
  new System.Data.OleDb.OleDbDataAdapter(
  "SELECT * FROM Events", oleDbConnection1);
 daAttendees.Fill(ds, "Attendees");
 daRooms.Fill(ds, "Rooms");
 daEvents.Fill(ds, "Events");
 oleDbConnection1.Close();
 Application["ds"] = ds;
}

Необходимо отметить важный код в последней строке. Объекты ApplicationSession) имеют коллекцию пар имя/значение, которую можно использовать для хранения данных. Здесь создается имя ds в хранилище объекта Application, которое получает сериализованное значение DataSet из ds, содержащее таблицы Attendees, Rooms и Events из базы данных. Это значение будет доступно всем экземплярам службы Web в любое время.

Чтобы приведенный выше код работал, нам нужно также добавить ссылку на пространство имен System.Data в пространстве имен PCSWebSrv2 в global.asax:

namespace PCSWebSrv2 {
 ...
 using System.Data;

Эта техника очень полезна для данных, предназначенных только для чтения, так как несколько потоков выполнения смогут к нему обращаться, сокращая нагрузку на базу данных. Отметим, однако, что таблица Events скорее всего должна измениться и будет обновлять DataSet на уровне приложения, когда это произойдет. Мы скоро это увидим.

Затем необходимо добавить к службе в Service1.asmx.cs метод GetData():

[WebMethod]
public DataSet GetData() {
 return (DataSet)Application["ds"];
}

Здесь для доступа к множеству данных используется тот же синтаксис, что и в Application_Load(), где просто выполняется преобразование типа данных в правильный тип, а также возврат.

Метод AddEvent() немного сложнее. Концептуально нам необходимо сделать следующее:

? Получить данные события от клиента.

? Создать инструкцию SQL INSERT с помощью этих данных.

? Соединиться с базой данных и выполнить инструкцию SQL.

? Если добавление выполнится успешно, то обновить данные в Application["ds"].

? Вернуть уведомление об успехе или отказе клиенту (мы оставляем клиенту возможность обновить его DataSet, если потребуется).

Начиная сверху, принимаем все поля как строки:

[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
}

Затем мы объявляем объекты, которые нужны для доступа к базе данных, соединяемся с базой данных и выполняем запрос, используя код аналогичный коду в PCSWebApp3 (здесь также требуется строка соединения, которая здесь не показана):

[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
 System.Data.OleDb.OleDbConnection oleDbConnection1;
 System.Data.OleDb.OleDbDataAdapter dbEvents;
 DataSet ds;
 oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
 OleDbConnection1.ConnectionString = @" ... ";
 String oleDbCommand =
  "INSERT INTO Events (Name, Room, AttendeeList, " +
  " EventDate) VALUES ('" + eventName + "', +
  eventRoom + "', '" + eventAttendees + "', '" + eventDate + "')";
 System.Data.OleDb.OleDbCommand insertCommand =
  new System.Data.OleDb.OleDbCommand(oleDbCommand, oleDbConnection1);
 oleDbConnection1.Open();
 queryResult = insertCommand.ExecuteNonQuery();
}

Используем, как и прежде, queryResult для хранения числа строк, затронутых запросом. Мы можем проверить его, чтобы оценить наш успех. Если все происходит хорошо, выполняется новый запрос на базе данных для обновления таблицы Events в нашем DataSet. Жизненно важно блокировать данные приложения во время выполнения обновлений, чтобы гарантировать, что никакие другие потоки выполнения не могут получить доступ к Application["ds"] во время его обновления. Это можно сделать с помощью методов Lock() и UnLock() объекта Application:

[WebMethod]
public int AddEvent(String eventName, String eventRoom, String eventAttendees, String eventDate) {
 ...
 int queryResult = insertCommand.ExecuteNonQuery();
 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(), не создавая никакого клиентского кода.

Оглавление книги


Генерация: 2.035. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз