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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату