Работа с базами данных в Интернет. Службы Web. WebServices.


Практическое занятие №6. Тема «Работа с базами данных в Интернет. Службы Web.»

Активно распространяющаяся сейчас технология Web Services дает большие преимущества при разработке различных распределенных приложений. Можно легко интегрировать приложения, разработанные на разных платформах, не заботясь об ограничениях локальной сети и наличии FireWall. В нынешние времена бурного развития интернета все чаще и чаще возникает проблема связи между данными, расположенными в разных концах земного шара на различных платформах и в разнообразных источниках данных. И эта проблема все больше увеличивается с ростом компаний, использующих интернет и веб приложения в своем бизнесе. Microsoft .NET веб сервисы решают проблему такой связи.

Файл web-сервиса имеет расширение asmx. Создание web-сервиса немногим отличается от создания веб — формы. Файл веб сервиса должен начинаться с директивы WebService. Класс web-сервиса может быть потомком класса System.Web.Services.Webservice. Метод, вызываемый через веб, должен иметь атрибут WebMethod.

Создадим пример, расширив возможности приложения, созданного в прошлой лабораторной работе. Извлечем детали доступа  к базе данных из приложения и поместим их в службу Web. Эта служба будет иметь два метода:

  • GetData( ), который будет возвращать объект DataSet, содержащий все три таблицы базы данных *.mdb.
  • AddTourist ( ) — добавляющий информацию и возвращающий обновленную версию DataSet, которая включает изменение.

Кроме того, создадим службу Web, будем хранить DataSet на уровне приложения в приложении службыWeb. Это означает, что несколько запросов не потребуют работы дополнительных запросов к базе данных. Данные в этом DataSet уровня приложения обновятся, когда в базу данных добавятся новые данные. Это означает, что изменения, сделанные в базе данных другими средствами, такими как редактирование в ручную, не будут отражаться в этом DataSet. Это для случая, когда служба Web является единственным местом с прямым доступом к данным.

Создайте новый проект службы Web в VS.NET с именем WebS1. Для начала необходимо добавить код в обработчик Application _ Start () в файле приложения global.asax. Код загружает все данные из файла базы данных *.mdb в множество данных и сохраняет его. Это код аналогичен коду переноса базы данных в DataSet.

protected void Application_Start(Object sender, EventArgs e)

{

System.Data.DataSet ds;

System.Data.OleDb.OleDbConnection con;

System.Data.OleDb.OleDbDataAdapter daSeason;

System.Data.OleDb.OleDbDataAdapter daTour;

System.Data.OleDb.OleDbDataAdapter daTourist;

con = new System.Data.OleDb.OleDbConnection();

con.ConnectionString=@»Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\prim_XML.mdb;Mode=Share Deny None;»;

con.Open();

ds =new DataSet();

daSeason=new System.Data.OleDb.OleDbDataAdapter(«SELECT * FROM SEASON»,con);

daTour = new System.Data.OleDb.OleDbDataAdapter(«SELECT * FROM TOUR»,con);

daTourist = new System.Data.OleDb.OleDbDataAdapter(«SELECT * FROM Tourist»,con);

daSeason.Fill(ds,»SEASON»);

daTour .Fill(ds,»TOUR»);

daTourist.Fill(ds,»Tourist»);

con.Close();

Application[«ds»]=ds;

}

Необходимо отметить важный код в последней строке. Объекты Application и Session имеют коллекцию пар имя / значение, которую можно использовать для хранения данных. Здесь создается имя DS в хранилище объекта Application , которое получает сериализованное значение DataSet из ds, содержащее таблицы Season, Tour, Tourist. Из базы данных. Это значение будет доступно всем экземплярам службы Web в любое время.

Чтобы приведенный код работал необходимо добавить ссылку using System.Data на пространство имен в этом же файле

namespace WebS1

{using System.Data;

Эта техника очень полезна для данных, предназначенных только для чтения, так как несколько потоков выполнения смогут к нему обращаться, сокращая нагрузку на базу данных.

Затем необходимо добавить к службе в Service1.asmx.cs метод GetData():

[WebMethod]

public DataSet GetData()

{

return (DataSet)Application[«ds»];

}

Здесь для доступа к множеству данных используется тот же синтаксис, что и в Application_Start(), где просто выполняется преобразование типа данных в правильный тип, а также возврат.

Метод AddTourist() сложнее. Концептуально необходимо сделать следующее:

  • Получить данные события от клиента.
  • Создать инструкцию SQL INSERT с помощью этих данных.
  • Соединиться с базой данных и выполнить инструкцию SQL.
  • Если добавление выполнится успешно, то обновить данные в Application [“ds”].
  • Вернуть уведомление об успехе или отказе клиенту.

Итак принимаем все поля как строки:

[WebMethod]

public int AddTourist(String LName, String Name, String Otchestvo)

{

}

Затем объявляем объекты, которые нам нужны для доступа к базе данных, соединяемся с базой данных и выполняем запрос.

[WebMethod]

public int AddTourist(String LName, String Name, String Otchestvo)

{

System.Data.OleDb.OleDbConnection con;

System.Data.OleDb.OleDbDataAdapter dbTourist;

DataSet ds;

con= new System.Data.OleDb.OleDbConnection();

con.ConnectionString=@»Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\prim_XML.mdb;Mode=Share Deny None;»;

String command=»INSERT INTO Tourist(LName,Name,Otchestvo) Values(‘»+LName+»‘,'»+Name+»‘,'»+Otchestvo+»‘)»;

System.Data.OleDb.OleDbCommand insertcommand= new System.Data.OleDb.OleDbCommand(command,con);

con.Open();

int queryResult=insertcommand.ExecuteNonQuery();

}

Используем queryResult для хранения числа строк, затронутых запросом. Проверим его, если все происходит хорошо, выполняется новый запрос к базе данных на обновление таблицы Tourist в DataSet. Жизненно важно блокировать данные приложения во время выполнения обновлений, чтобы гарантировать, что никакие другие потоки выполнения не могут получить доступ к Application [“ds”] во время его обновления. Это можно сделать с помощью методов Lock () и UnLock() объекта Application.

[WebMethod]

public int AddTourist(String LName, String Name, String Otchestvo)

{

System.Data.OleDb.OleDbConnection con;

System.Data.OleDb.OleDbDataAdapter dbTourist;

DataSet ds;

con= new System.Data.OleDb.OleDbConnection();

con.ConnectionString=@»Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\prim_XML.mdb;Mode=Share Deny None;»;

String command=»INSERT INTO Tourist(LName,Name,Otchestvo) Values(‘»+LName+»‘,'»+Name+»‘,'»+Otchestvo+»‘)»;

System.Data.OleDb.OleDbCommand insertcommand= new System.Data.OleDb.OleDbCommand(command,con);

con.Open();

int queryResult=insertcommand.ExecuteNonQuery();

if(queryResult==1)

{dbTourist=new System.Data.OleDb.OleDbDataAdapter(«SELECT * FROM Tourist»,con);

Application.Lock();

ds =(DataSet)Application[«ds»];

ds.Tables[«Tourist»].Clear();

dbTourist.Fill(ds,»Tourist»);

Application[«ds»]=ds;

Application.UnLock();

con.Close();}

return queryResult;

}

Это завершает создание службы Web. Протестируйте приложение, направляя браузер на файл *. Asmx, в результате вы должны увидеть

Как создать веб сервис

Выбрав GetData(), вы увидите представленное в виде  XML файла представление DataSet, не создавая никакого клиентского кода.

Создание клиент приложения.

Создадим новое Web приложение или можете воспользоваться разработкой приложения Web из предыдущей лабораторной работы. Но тогда необходимо сделать следующие изменения:

  1. удалите все непосредственные обращения к базе данных из этого приложения и вместо этого воспользуемся службой Web.
  2. введите хранилище уровня приложения из DataSet., возвращаемого из службы web, которое обновляется только в случае необходимости, это значит, что на базу данных будет падать меньшая нагрузка.

Прежде всего, в новом приложении Web необходимо добавить текстовые поля, для заполнения соответствующих полей таблицы, затем добавить ссылку Web на службу, созданную выше WebS1/Service1.asmx. Это можно сделать следующим образом, щелкнем правой кнопкой мыши на приложении в Solution Explorer и выберите пункт Add Web Reference …или меню Project – Add Web Reference.  В появившемся окне выберите нужную службу или ведите ее URL файла службы. Затем нажмите на кнопку Add Reference. В результате должна появится папка, содержащая ссылкуWeb , называется по имени сервера, где расположена служба, в данном случае localhost, можно изменить имя, например на lab4.Это также пространство имен, на которое необходимо ссылаться, чтобы использовать класс прокси.

После этого добавляем код в Global. asax, по большей части таким же образом , как это было сделано для службы Web. Сначала ссылаемся на службу Web и пространство имен:

using System.Data;

using lab4; // имя сервиса, которое дали при добавлении его к проекту;

Затем заполняем множество данных и помещаем его в хранилище данных уровня приложения с именем ds:

protected void Application_Start(Object sender, EventArgs e)

{

Service1 dataService = new Service1();

DataSet ds = dataService.GetData();

Application[«ds»] = ds;

}

Теперь несколько пользователей могут читать данные, без какого – либо обращения к службе Web, то есть к базе данных.

Теперь изменим WebForm1.aspx.cs.

Удалим объявления соединения и адаптеров, так как не будет никакого обращения к базе данных. Затем необходимо изменить Page_Load( ) следующим образом:

protected System.Data.DataSet ds;

private void Page_Load(object sender, System.EventArgs e)

{ds= new DataSet();

ds = (DataSet)Application[«ds»];

}

Большая часть кода остается без изменений, необходимо только использовать Application [“ds”] вместо получения DataSet.

Необходимо изменить submitButton_Click() для использования метода AddData() службы Web.

private void submitButton_Click(object sender, System.EventArgs e)

{

Service1 dataService =new Service1();

int queryResult = dataService.AddTourist(LName.Text,Name.Text,Otchestvo.Text);

if(queryResult==1)

{resLabel.Text=»Данные добавлены»;

ds=dataService.GetData();

Application.Lock();

Application[«ds»]=ds;

Application.UnLock();}

else resLabel.Text=»Данные не добавлены»

}

Фактически мы существенно упростили систему. Можно эту службу использовать и в других приложениях.

САМОСТОЯТЕЛЬНО:

Создайте приложения по  своей предметной области, которое должно содержать форму для заполнения таблицы, также форма должна иметь средства для отображения данных таблицы. Ввод данных в таблицу должен осуществляться не только с помощью текстовых полей, но и списков, выпадающих списков, заполнение даты события с помощью календаря.

КОНТРОЛЬНЫЕ ВОПРОСЫ:

  1. Как создать веб сервис?
  2. Как добавить веб сервис к приложению?
  3. Какие изменения необходимо внести в веб приложение при добавлении и работе с веб сервисом?
  4. Преимущества использования веб сервисов?
  5. Структура веб сервиса, основные компоненты?
  6. Как блокировать данные приложения во время выполнения обновлений?