Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 704

Эндрю Троелсен

 theInfo[2].Url = "http://www.AllPinkVans.com";

 return theInfo;

}

Доступ к типам DataSet ADO.NET

Чтобы завершить создание нашего Web-сервиса XML, вот вам еще един Web-метод, который возвращает DataSet с данными таблицы Inventory базы данных Cars, созданной при изучении ADO.NET в главе 22.

// Получение списка всех машин из таблицы Inventory.

[WebMethod(Description = "Возвращает список машин из таблицы Inventory базы данных Cars")]

pubic DataSet SetCurrentInventory() {

 // Заполнение DataSet данными таблицы Inventory.

 SqlConnection sqlConn = new SqlConnection();

 sqlConn.ConnectionString = "data source=localhost;initial catalog=Cars;uid=sa;pwd=";

 SqlDataAdapter myDA= new SqlDataAdapter("Select * from Inventory", sqlConn);

 DataSet ds = new DataSet();

 myDA.Fill(ds, "Inventorу");

 return ds;

}

Исходный код. Файлы примера CarsSalesInfoWS размещены в подкаталоге, соответствующим главе 25.

Клиент Windows Forms

Чтобы проверить работу нового Web-сервисa XML, создайте приложение Windows Forms и укажите в нем ссылку на CarsSalesInfoWS, используя диалоговое окно Add Web Reference в Visual Studio 2005 (рис. 25.7).

Pиc. 25.7. Добавление ссылки на CarsSalesInfoWS

Теперь просто используйте генерируемый агент для вызова доступных Web-методов. Вот один из возможных вариантов реализации формы.

using CarsSalesInfoCLient.localhost;

namespace CarsSalesInfoClient {

public partial class MainWindow: Farm {

 private CarSalesInfoWS ws = new CarSalesInfoWS();

 …

 private void MainWindow_Load(object sender, EventArgs e) {

  // Привязка к таблице.

  inventoryDataGridView.DataSource = ws.GetCurrentInventory().Tables[0];

 }

 private void btnGetTagLines_Click(object sender, EventArgs e) {

  string[] tagLines = ws.GetSalesTagLines();

  foreach (string tag in tagLines) listBoxTags.Items.Add(tag);

 }

 private void btnGetAllDetails_Click (object sender, EventArgs e) {

  SalesInfoDetails[] theSkinny = ws.GetSalesInfoDetails();

  foreach (SalesInfoDetails s in theSkinny) {

   string d = string.Format("Info: {0}\nURL:(1}\nExpiration Date:{2}", s.info, s.Url, s.dateExpired);

   MessageBox.Show(d, "Details");

  }

 }

}

На рис. 25.8 показан результат тестового запуска приложения.

Рис. 25.8. Клиент CarsSalesInfo

Представление типов на стороне клиента

Когда клиент устанавливает ссыпку на Web-сервис, предоставляющий доступ к пользовательским типам, файл класса агента получает определения для каждого отрытого пользовательского типа. Так, если вы посмотрите на представление клиента для SalesInfoDetails (в генерируемом файле Reference.cs), вы увидите, что каждое поле инкапсулировано в строго типизованное свойство (также обратите внимание на то, что этот тип теперь определен, как класс, а не как структура).

[System.SerializableAtttribute()]

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://IntertechTraining.com/")]

public partial class SalesInfoDetails {

 private string infoField;

 private string urlField;

 private System.DateTime dateExpiredField;

 public string info {

  get { return this.infoField; }