Чтение онлайн

ЖАНРЫ

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

Ватсон Карли

Шрифт:

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) {

Поделиться с друзьями: