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();