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) {
new System.Data.OleDb.OleDbCommand(oleDbCommand, oleDbConnection1);
oleDbConnection1.Open;
queryResult = insertCommand.ExecuteNonQuery;
}
Используем, как и прежде,
queryResult
для хранения числа строк, затронутых запросом. Мы можем проверить его, чтобы оценить наш успех. Если все происходит хорошо, выполняется новый запрос на базе данных для обновления таблицы
Events
в нашем
DataSet
. Жизненно важно блокировать данные приложения во время выполнения обновлений, чтобы гарантировать, что никакие другие потоки выполнения не могут получить доступ к
Application["ds"]
во время его обновления. Это можно сделать с помощью методов