Книга: 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;
}
Необходимо отметить важный код в последней строке. Объекты Application
(и Session
) имеют коллекцию пар имя/значение, которую можно использовать для хранения данных. Здесь создается имя 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()
, не создавая никакого клиентского кода.
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Листинг 15.11. Код для загрузки файла с Web-сервера
- 5.6 Служба теневого копирования томов в Windows ХР и Windows Server 2003
- Формы Web ASP.NET
- ОРГАНИЗАЦИЯ СОБСТВЕННЫХ МЕРОПРИЯТИЙ
- Пример: базовый клиент Web
- 4.5. Как рассчитывать бюджет на проведение мероприятий по стимулированию
- При попытке создать пользователя или добавить его в группу появляется сообщение Служба Сервер не запущена
- Глава 7 Web-сервер
- Инструментальные средства создания Web-страниц
- 7.4. Создание виртуальных Web-серверов
- 7.8. Индексация Web-страниц