WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 | 2 || 4 | 5 |   ...   | 6 |

«Сертификационные экзамены 70-310 и 70-320 Разработка Web-сервисов XML и серверных компонентов на Visual и Visual Официальное пособие Microsoft для самостоятельной подготовки Москва 2004 УДК ...»

-- [ Страница 3 ] --

Напишите код, реализующий на уровне компонента основанную на ролях. Добавьте к классу метод, принад лежность пользователя к роли Создание и использование объектов Remoting 1. в Remoting Занятие 2. Объекты с серверной и клиентской активизацией Занятие 3. Передача сообщений через каналы 4. События и делегаты Занятие 5. Асинхронные методы Занятие 6. Конфигурирование и защита объектов Remoting Практикум 4. Создание и использование объектов Remoting Закрепление материала В этой главе Распределенные приложения обеспечивают взаимодействие между объектами из раз ных работающих на одном или на разных, порой географически удаленных, компьютерах. Инфраструктура Framework предоставляет набор классов и дов, установку соединения между объектами и их взаимодействие.

Создание распределенных приложений на основе прежних программных инфра структур требовало глубокого знания протоколов передачи, используемых для взаимо действия объектов. В отличие от них, инфраструктура позволяет наладить взаимо действие объектов без детального знания протоколов и механизмов применяемых в распределенных приложениях. В этой главе вы научитесь создавать, конфигурировать и объекты Remoting при помощи классов Framework.

Прежде чем начать Для изучения материалов этой главы потребуются:

• знание основ программирования на Visual Basic или Visual • начальные навыки программирования распределенных приложений.

и Занятие Введение в Remoting Инфраструктура Remoting способна обеспечить взаимодействие между приложе ниями независимо от того, работают ли они на одном или на разных компьютерах, под управлением разных операционных систем. При этом компьютеры, на которых выпол няются приложения, могут располагаться как в одной, так и в разных сетях, разбросан ных по всему миру.

Изучив материал этого вы сможете:

определение Remoting;

перечислить методы доступа к объектам через Remoting;

описать архитектуру Remoting;

различать дистанцируемые и недистанцируемые объекты.

Продолжительность занятия - около 35 минут.

Обзор Remoting Предположим, что вы создали приложение для карманного компьютера. Оно написано на Visual работает в ОС Windows СЕ и предназначено для доступа к текущим дан ным по продажам, хранящимся на компьютере под управлением Windows 2000 Server в другой сети. Серверный компонент, данные для приложения, напи сан на Visual Basic 6.0 и получает необходимую информацию из базы данных Server 2000. Это типичный пример ситуации, когда нужен доступ к информации в любое вре мя, из любого места и с любого устройства. В подобных случаях взаимодействовать друг с другом приложениям позволят классы Remoting, предоставляемые Frame work.

Инфраструктура Remoting предоставляет набор служб для активизации объек тов, управления их временем жизни и обмена сообщениями между удаленными объек тами через каналы. Здесь пои channels) подразумеваются объек ты, доставляющие сообщения удаленными объектами (подробнее — в занятии Любое сообщение, посланное кодируется и декодируется при помощи внут ренних объектов которые называются форматирующими объектами сериализа ции и «понимают» форматы, такие как двоичный и SOAP. Форматирую formatters) — это объекты, выполняющие коди сообщений, отправляемых и принимаемых удаленными объек тами. Любое сообщение может быть закодировано в одном из двух форматов — двоич ном либо В приложениях, для которых критична производительность, применя ют двоичный формат, а если взаимодействие с другими удаленными то лучше использовать формат Инфраструктура Remoting обеспечивает взаимодействие объектов из разных доменов приложений или процессов. Это взаимодействие осуществляется по различ ным транспортным протоколам, таким как HTTP или TCP/IP, и с использованием раз ных форматов (двоичного либо SOAP), а также разнообразных способов создания объектов и схем управления их жизненным циклом.

Занятие Доступ к объектам через границы Remoting Инфраструктура Remoting позволяет клиентским приложениям вызывать объектов через границы Remoting, разделяющие приложений, процессы и от дельные компьютеры. Домен приложения, как сказано в главе ограничивает область, в которой работает приложение. В одном процессе может быть несколько доменов при ложений. Для взаимодействия объектов через границы Remoting требуются:

• серверный объект, поддерживающий функциональность, требуемую кодом, который серверный объект через границу Remoting;

• клиентский объект, вызывающий серверный объект;

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

Чтобы получить доступ к объекту и вызывать его методы, необходим указатель или ссылка на этот объект. Однако получить доступ к объекту через границы Remoting слож но, поскольку адреса объекта в разных процессах отличаются, а значит адрес объекта в одном процессе совершенно бесполезен в другом. Решить эту проблему можно, локальную копию серверного объекта в клиентском приложении, которое затем сможет вызывать ее методы.

Громоздкие объекты с многочисленными методами лучше не копировать в клиентс кие процессы и не передавать по значению, ведь клиентскому процессу нужно всего лишь несколько значений, возвращаемых методами серверного объекта. Копирование серверного объекта целиком в клиентский процесс — это бесполезная трата ресурсов (полосы пропускания канала связи, памяти и времени) клиента.

также у многих серверных объектов есть открытые методы, но внутренние механизмы этих объектов часто используют закрытые серверные данные.

Внимание! Копирование серверных объектов открывает злоумышленникам возмож ность доступа к данным сервера, что несет потенциальную угрозу безопасности.

Не рекомендуется копировать и такие как поскольку они содер жат ссылку на файлы ОС, имеющие уникальный адрес в памяти серверного процесса.

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

Архитектура Remoting Чтобы организовать взаимодействие между серверным и клиентским объектами посред ством Remoting, клиентскому приложению необходима ссылка на серверный объект. При создании экземпляра удаленного объекта с ключевого слова new клиент тут же получает ссылку на серверный объект. После этого клиент способен вы зывать методы серверного совсем как если бы этот объект был в клиентском процессе, а не работал на другом компьютере.

Чтобы обеспечить доступ к серверному объекту из клиентского процесса, в Remoting используются объекты прокси. Когда в клиентском приложении создается экземпляр удаленного объекта, Remoting создает объект прокси со ссылками на все методы и свойства серверного объекта, и передает его клиентскому приложению.

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

Рис. 4-1. Взаимодействие с удаленным объектом Чтобы создать систему для удаленного взаимодействия, способную выполнять все эти нужны навыки сетевого программирования, знание протоколов TCP/IP и HTTP, а также некоторые технологии Remoting берут на себя выполнение низкоуровневых задач, таких как открытие сетевого подклю форматирование сообщений, запись их в потоки и передачу данных принимаю приложению. В совокупности эти технологии образуют транспортный канал (transport channel).

Понять роль каналов в инфраструктуре Remoting поможет следующий пример.

Допустим, что у вас на компьютере есть приложение, которому требуется функциональ ность находящегося на другом компьютере. Если клиентский и серверный объекты сконфигурированы правильно, то клиентскому приложению достаточно создать новый экземпляр серверного класса, чтобы достичь желаемого.

Система Remoting создает объект прокси, представляющий серверный класс, и воз вращает клиентскому объекту ссылку на Когда клиентское приложение вызы вает метод удаленного объекта, Remoting принимает вызов, проверяет типы данных и пересылает его серверной системе Remoting. При этом слушающий канал получает зап рос от клиентского приложения и передает его серверной системе а она со здает или находит запрошенный объект и вызывает его. После обработки вызова сер верная система Remoting генерирует ответное сообщение и передает его клиентскому каналу. В завершение клиентская система Remoting возвращает результат вызвавшему ее объекту, используя прокси. Подробнее о роли каналов — в занятии 3.

Дистанцируемые и недистанцируемые объекты В распределенных приложениях две категории объектов:

(remootable) и недистанцируемые able). У недистанцируемых объектов отсут ствуют методы, позволяющие системе Remoting копировать эти объекты в другие доме ны приложений и использовать их там, поэтому такие объекты доступны лишь в преде лах своего домена приложения. Дистанцируемые объекты доступны из дру гих доменов приложений и контекстов (через прокси), их также можно копировать и передавать в другие домены приложений по ссылке либо по значению. громоздкий 1 Введение в объект с многочисленными методами лучше сделать недистанцируемым и создать ему в пару компактный дистанцируемый объект, пригодный для публикации или копирова в клиентское приложение;

при этом дистанцируемый объект будет служить для пе редачи вызовов недистанцируемому.

два типа объектов:

• передаваемые по значению — копируются и передаются за пределы домена приложе ния в виде значений;

• передаваемые по ссылке удаленного доступа к таким объектам клиенту необхо объект прокси.

Объекты, передаваемые по значению Чтобы система Remoting объекты, передаваемые по значению, нужно реализовать в них интерфейс либо пометить их атрибутом Когда клиент вызывает метод передаваемого по система Remoting создает копию этого объекта и передает ее в домен клиентского при ложения. Далее полученная клиентским приложением, используется для вызова любых методов этого объекта. Кроме того, если передаваемый по значению объект пе редается как аргумент, метод также получает его Чтобы повысить производительность и уменьшить время обработки, следует полно стью скопировать состояние и код объекта в домен приложения, в котором этот объект используется. Применение объектов, передаваемых по значению, уменьшает число об менов данными между компьютерами, процессами и доменами приложения, требую щих много времени и ресурсов. Кроме передаваемые по значению объекты дос тупны напрямую в пределах своего домена приложения. В этом случае эффективнее, поскольку исключается передача объекта через границы Remoting.

передаваемые по ссылке Объекты, по ссылке, — это дистанцируемые объекты, производные от класса Marshal Когда в домене клиентского приложения создается экземпляр такого объекта, инфраструктура Remoting генерирует в домене пред ставляющий этот объект прокси и возвращает объекту ссылку на прокси, который затем используется для вызова методов удаленного объекта. Система Remoting принимает эти вызовы, передает в домен серверного приложения и осуществляет вызов реального серверного объекта.

Примечание Если клиент находится в одном домене приложения с объектом, ваемым по ссылке, инфраструктура Remoting возвращает прямую ссылку на мый объект, тем самым исключая издержки на передачу объектов.

Принимаясь за создание распределенного приложения, необходимо иметь виду * объект, созданный в некотором домене приложения, в пределах этого домена разре шается вызывать напрямую;

• чтобы вызвать объект процесса, расположенного за пределами его домена прило жения, этот объект нужно сначала опубликовать. Публикация (publication) объекта осуществляется путем его копирования в домен вызывающего приложения либо со здания в нем объекта прокси;

и использование * и вызов из-за пределов домена приложений больших объектов с много численными методами расточительная операция, поэтому решать, какие объекты стоит публиковать, а какие нет, нужно индивидуально, исходя из задач, поставлен ных при разработке На этом занятии вы познакомились с основами инфраструктуры Remoting, изучили ее архитектуру. Вы узнали, как объекты передаются между процессами и изу чили различия между и недистанцируемыми объектами, а также объектами, передаваемыми по значению и по ссылке.

На занятии вы узнаете, как создают и активизируют такие объекты и научитесь управлять ими.

1 с серверной и Занятие 2. Объекты с серверной и клиентской активизацией На занятии в ходе знакомства с и ее архитектурой было сказано, что с точки зрения Remoting различают серверный и клиентский сы. Клиентское приложение процессом при ссы лок на серверные объекты. На этом занятии вы как создавать серверные и кли ентские объекты, научитесь активизировать их и управлять временем их Изучив материал этого вы сможете:

различать объекты с серверной и клиентской активизировать эти объекты;

управлять объектов.

Продолжительность занятия — около 40 минут.

Понятие активизации удаленного объекта Занимаясь разработкой обычного объекта, нет вникать в детали созда ния его экземпляра, удостовериться, что объект реагирует на вызовы извне.

Напротив, при конструировании объекта важно знать, как он создается и инициализируется, поскольку этим определяется его дальнейшая работа. Необходимо знать, как именно активизируется удаленный объект, так как тип инициализации нуж но системе Remoting, чтобы та смогла дать клиентскому приложению доступ к этому объекту.

Серверная активизация При серверной активизации объект создается на сервере в момент вызова метола сер верного класса, а не при объявлении его экземпляра при помощи ключевого new.

Рассмотрим следующий пример. В офисе агентства зашиты вис, различным организациям, таким как банки и бюро личные номера социальной страховки. Клиенты подключаются к сервису, вводят номер, проверяет и запрошенные сведения. В этом сцена рии клиенты подключены к серверу агентства постоянно, но сервис только когда клиент вызывает его. Подобный способ создания объектов называется сер верной активизацией и иллюстрируется следующим кодом:

Imports Public Class SSNServer Inherits Public Function ValidateSSN(Byval number as Long) As String Вернуть адрес Dim address As String ' Проверить номер страховки Return address 176 Создание и Глава End Function End Class Visual C# System;

using Remoting;

namespace { public class { public { public String number) // Вернуть адрес String address;

// Проверить номер страховки return address;

В этом примере используется простейший серверный объект, принимающий значе ние типа long и соответствующий адрес. А вот пример, демонстрирую щий вызов метода Поскольку мы используем серверную активизацию, сер верный объект создается только при вызове метода ValidateSSN, а не при объявлении экземпляра этого класса.

Visual Basic Dim as New В результате следующей строки на сервере будет удаленный Console. WriteLine(se r Visual SSNServer serverlnstance = new SSNServer();

// В результате исполнения следующей строки на сервере // будет создан удаленный объект Объекты с серверной активизацией могут создаваться в режиме Singleton либо SingleCall, в зависимости от задач приложения. Допускается наличие только одного эк земпляра Singleton-объекта независимо от обращающихся к нему клиентов;

та ким объектам также назначается стандартное время жизни. Поэтому при создании сер верного объекта в режиме Singleton всех обращающихся к нему клиентов будет обслу живать один и тот же экземпляр. Если объект объявлен в режиме SingleCall, система Remoting создает новый экземпляр объекта всякий раз, когда клиент вызывает его ме 2 с серверной и активизацией тод. Чтобы серверный объект был зарегистрирован в режиме ему нужно на значить тип Visual Basic Imports Public Class SSNServer Inherits Sub = "testService" Enter to Stop") Console.

End Sub End Class Class testService Здесь должна быть реализация зарегистрированного выше у класса SSNServer.

Class Visual using System;

using using using namespace SSNComponentCSharp { class SSNServer { public "testService";

enter to class testService : MarshalByRefObject { // Здесь должна быть реализация Создание и объектов Глава // зарегистрированного выше класса Примечание Чтобы классы из пространства имен ting.Channels.Tcp, необходимо импортировать пространство имен moting.

Чтобы зарегистрировать серверный объект в режиме SingleCall, необходимо назна чить тип например, так:

Visual Basic Imports Public Class SSNServer Inherits Sub = Enter to Stop") End Sub End Class Class testService Здесь должна быть реализация объекта-сервиса, зарегистрированного выше у класса SSNServer.

End Class Visual C# using System;

using using using namespace { public class SSNServer { public { = "testService";

enter to Занятие 2 Объекты с class { // Здесь должна быть реализация // зарегистрированного у класса Клиентская активизация Объект с клиентской создается на сервере одновременно с экземпляра при помощи ключевого слова new. Рассмотрим в качестве примера при ложение с которого пользователи могут общаться через локальную сеть. При входе пользователя в чат создается новый экземпляр объекта чат сервера. В конструкторе этого серверного объекта должен быть код для поиска уже под ключенных пользователей и отображения их списка. В данном случае удаленный объект будет создан на сервере, как только его экземпляр будет объявлен с помощью ключево го слова new.

Время жизни объектов с клиентской активизацией определяется доменом клиентс кого приложения, в котором они находятся. При клиентской происходит При попытке клиента создать серверного объекта устанавливает ся соединение с сервером и создается объект прокси с использованием ссылки, полу ченной после создания удаленного объекта на сервере. Экземпляр объекта с служит, пока не истечет срок его аренды (lease), после чего сборщик ра освобождает занятую им память. Срок аренды определяет время хранения в памяти. Если клиент создаст два экземпляра удаленного объекта, он получит полнительно две ссылки, указывающих на отдельные экземпляры удаленного объекта.

В СОМ клиент удерживает объект в памяти, сохраняя ссылку на него. Когда дний клиент СОМ освободит последнюю на некоторый объект, тот самоуничто жается. Клиентская активизация позволяет управлять временем жизни серверных объек тов без удерживания ссылок на них и постоянного опроса.

Время жизни объектов с клиентской определяется сроком аренды, который клиент указывает при создании объекта. Когда срок аренды по умолчанию ис текает, удаленный объект с клиентом, чтобы узнать, нужен ли он еще и, если да, насколько продлить время его Если клиент не отвечает, время жизни объекта продлевается на период по умолчанию, в течение которого объект попытки связаться с клиентом. Если они оказались неудачными, объект разрешает сбор шику мусора удалить себя. Клиент может запросить для объекта бесконечное время жиз ни;

в этом случае объект будет «жить», пока домен серверного приложения.

Примечание Разница между «вечными» объектами с клиентской и серверной цией в том, что первые единственного пользователя — своего создателя и его ссылки, а вторые — всех клиентов, запрашивающих данный Задачи Изучив объекты с клиентской и серверной активизацией, можно перейти к Изучив объекты с клиент простейших задач необходимых для обеспечения взаимодействия клиента с и Глава удаленным объектом. Чтобы опубликовать сервис за пределами его домена приложе ния, сделайте следующее:

• определите домен приложения, который станет хостом сервиса;

• выберите (клиентскую или серверную);

• выберите и создайте канал и порт;

• определите, как клиентское приложение будет получать метаданные сервиса.

В качестве хоста допускается службы Windows, консольные приложе ния, приложения Windows Forms или Web-сервисы XML, использующие ASP Выбрав тип домена приложения для хостинга, определитесь с режимом активизации своего сервиса.

Определив все необходимые параметры, такие как режим активизации, имя прило жения, конечные точки системы Remoting, настройте свою систему с конфи гурационного файла. Для этого вызовите метод Configure класса следующим образом:

Visual C# Здесь используется конфигурационный файл со сведениями о настройках системы Remoting. Настроить систему Remoting можно и программно, этом конфигурационный файл не требуется.

Далее необходимо создать канал типа TcpChannel или TcpChannel и зарегистриро вать его с помощью метода класса RemotingConfiguration. Если исполь зуется конфигурационный файл, для создания канала достаточно загрузить этот файл, вызвав метод В завершение нужно опубликовать сервис, чтобы сделать его за предела ми домена приложения, — это необходимо для работы серверного приложения.

Аренда Время жизни объекта, передаваемого по ссылке, определяет срок его хранения в памя ти. Подобные объекты остаются в памяти постоянно, независимо типа. Другими сло вами, всем передаваемым по ссылке объектам независимо от режима на значается некоторое время жизни. По истечении этого времени они помечаются для удаления, которое выполняет сборщик мусора.

Система Remoting уничтожает объект, только когда тот помечен для удаления.

аренды (lease manager), расположенный в домене серверного отвечает за поиск объектов, готовых к удалению. Однако объект-спонсор (sponsor) мо жет запросить обновление аренды объекта, зарегистрировавшись у диспетчера аренды.

Всем объектам, передаваемым из домена приложения по ссылке, назначается время аренды. В каждом домене приложения имеется диспетчер, управляющий арендой в сво ем домене. Он периодически проверяет аренду объектов. Если ее срок истек, диспетчер проверяет список спонсоров данного объекта, спрашивая, не желают ли они обновить аренду. Если ни один из спонсоров не обновил аренду объекта, диспетчер удаляет ее. В результате объект также удаляется, а сборщик мусора освобождает занятую им память.

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

2 Объекты с серверной и клиентской активизацией Инициализация аренды Для аренды объекта необходимо переопределить функцию Initialize me Service класса Необходимый для этого код выглядит при мерно так:

Visual Imports Public Class Inherits MarshalByRefObject Public Overrides Function As [Object] lease As If = Then = = End If Return lease Function End Class Visual using System;

using System.

using using public class MyLifetimeControlObject: MarshalByRefObject !

public override object lease = (ILease)base.

if { lease. InitialLeaseTime = TimeSpan.

= lease. RenewOnCallTime = } return lease:

Обновление аренды Единственное свойство, которое разрешается изменять у объекта после определения его аренды, — CurrentLeaseTime. Оно возвращает оставшееся время аренды. Обновить арен ду объекта могут:

Создание и Глава • клиентское приложение (вызовом метода • код демонстрирует обновление аренды объекта из клиентского прило жения:

Visual Dim As New Dim lease As ILease = ILease) Dim expireTime As = - new ILease lease = TimeSpan expireTime Публикуя удаленный объект, следует знать, какие члены будут опубликованы вместе с ним, поскольку клиентам доступны только опубликованные члены удаленных объектов.

Область видимости опубликованного объекта Система предоставляет функциональность серверного объекта клиентс кому приложению, что этот объект является для приложения локальным.

при экспорте функциональности удаленных объектов есть ряд исключений, описанных в табл.

Табл. 4-1. Область опубликованных объектов Объекты и члены Описание Статические члены Удаленные объекты не могут экспортировать статические члены, например поля или методы. Remoting обеспечивает взаимодействие между клиентскими и серверными объектами только при членов экземпляров Поля и проверяет, является ли экспортированный экземпляров объект объектом прокси. Если это так, клиент сможет вызывать поля экземпляра прямо через прокси, в противном случае прокси предоставляет клиенту для доступа к экземпляру Закрытые члены Экспорт закрытых членов удаленного объекта не предусмотрен Делегаты Делегаты являются объектами, передаваемыми по и способны представлять объекты, например контекстно-связанные объекты или объекты, передаваемые по ссылке Переопределенные Для повышения производительности виртуальные методы объекта исполняются локально, то есть в домене приложения, где они были вызваны Занятие 2 Объекты с серверной и клиентской В дополнение к табл. следует отметить, что методы и ToString() выпол няются в удаленном объекте при условии, что они переопределены в нем, а методы и всегда исполняются локально.

Итак, на этом занятии вы изучили объекты с серверной и клиентской создание объектов в режиме Singleton и SingleCall, способы установки соединения меж ду сервером и клиентским приложением, научились отличать объекты, которые не мо гут быть дистанцируемыми. Вы также познакомились с понятием аренды, способами ее инициализации и обновления, а в завершение узнали про область видимости ванных объектов.

Создание и Занятие 3. Передача сообщений через каналы Каналы — это особые объекты, используемые удаленными объектами для взаимодей ствия друг с На этом занятии вы узнаете о роли в передаче между удаленными объектами, а также научитесь применять и настраивать их.

Изучив материал этого занятия, вы сможете:

дать определение каналов, рассказать об их роли в передаче сообщений между удаленными объектами;

описать различные типы каналов;

определить формат передачи через канал.

Продолжительность - около 60 минут.

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

Каналы играют роль переносчиков через Remoting, разделяю щие контексты, процессы и удаленные компьютеры. Канал принимает сообщение на одной стороне границы Remoting и переправляет его на другую. Концы канала, распо по разные стороны Remoting, представляют собой его конечные точ ки. Перед пересылкой канал преобразует сообщение в формат, на пример в XML или двоичный, и выполняет другие необходимые преобразования.

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

В зависимости от назначения каналы делятся на принимающие и от правляющие (клиентские). В каналах реализован интерфейс Receiver, а в отправляющих — Интерфейс IChannelReceiver содержит методы Start Listening и требующие реализации в классе принимающего канала. Интерфейс IChannelSender предоставляет метод который должен быть реализован в классе отправляющего канала. Метод CreateMessageSink со здает и возвращает приемник сообщений, который канал использует для передачи со общений удаленному объекту, по заданному URL. С приемниками сообщений вы познакомитесь позже.

В классах и реализован интерфейс IChannel Receiver, а в классах и — интерфейс IChannelSender.

Кроме в классе канала могут быть реализованы интерфейсы IChannelSender и что позволит объектам этого класса отправлять и принимать сообще ния, как это сделано у классов и TcpChannel. В 4-2 перечислены вы шеупомянутые интерфейсы с указанием методов и свойств, реализуемых в классах ка налов.

Занятие 3 Передача сообщений через каналы Табл. 4-2. интерфейсы Имя Открытые свойства интерфейса IChannel Определяет имя канала Задает приоритет канала. Чем больше значение этого тем выше приоритет. Более приоритетный клиентский канал первым получает возможность соединиться с удаленным объектом.

Приоритет серверных каналов определяет порядок их использования клиентами при соединении с серверными Открытые методы интерфейса IChannel Parse универсальный идентификатор ресурса текущего канала и объект URI в качестве выходного параметра Открытые свойства интерфейса ChannelData Получает данные, специфичные для канала, включая сведения о объекте Открытые методы интерфейса Receiver Приказывает каналу начать ожидание и обработку запросов клиентов StopListening Приказывает каналу прекратить ожидание и обработку клиентов Возвращает массив, все для заданного URI Открытые методы интерфейса Возвращает объект-приемник, доставляющий сообщения по заданному URL или объекту данных канала Регистрация канала Чтобы удаленный объект смог отправить сообщение другому удаленному объекту, сна чала необходимо зарегистрировать клиентский канал в системе Remoting. Аналогично, объект сможет получать сообшения только после серверного канала. Для применяют класс Он предоставляет статические методы для регистрации разрешения URL и обнаружения удален ных объектов с помощью Статический метод класса Channel Services позволяет зарегистрировать канал у системы Remoting. Например, так регист рируют метод для прослушивания порта Visual Basic channel as New Visual TcpServerChannel channel new Создание и использование Глава После канала на клиентском и серверном удаленные объекты смогут друг друга. В следующем разделе рассказывается о взаимодей ствии удаленных объектов через границы посредством каналов.

Выбор канала Когда клиентский объект вызывает метод удаленного объекта, каналы передают пара метры и другие данные, необходимые вызова удаленного объекта. Для вызова мето дов удаленного объекта клиент может использовать любой из зарегистриро ванных на клиентском компьютере. При этом вы можете настроить ка нал либо создать новый, используюший другой транспортный протокол. Выбирая кана лы для взаимодействия удаленных придерживайтесь следующих правил;

• клиент не сможет вызывать методы удаленного объекта, пока не будет зарегистриро ван хотя бы один клиентский канал TcpClientChannel или Кроме того, перед регистрацией удаленного объекта необходимо зарегистрировать хотя бы один серверный канал или • если удаленный объект использует обратные вызовы клиентского объекта, на клиен тском компьютере необходимо зарегистрировать серверный канал;

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

• два канала, зарегистрированных в системе Remoting на одном компьютере, не могут прослушивать один и тот же порт.

Когда клиент вызывает удаленный объект, инфраструктура Remoting создает сооб которое содержит параметры и другие данные, необходимые для вызова. Про цесс включения этих данных в называется (marshaling). Инф раструктура Remoting посылает созданное сообщение объекту RealProxy, который от правляет его приемнику. Приемник сообщении (message sink) — это клиенту установить соединение с каналом, зарегистрированным удаленным объек том, и отправить через этот канал сообщение. Когда сообщение приходит по каналу в домен приложения удаленного объекта, серверная система Remoting расшифровывает его и пересылает вызов вместе с параметрами и другой необходимой информацией уда ленному объекту, которому этот вызов адресован.

Примечание Удаленная система создает приемник сообщений вместе с объектом Real Proxy, вызывая метод выбранного канала.

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

Передающий сообщение канал может использовать различные сетевые например HTTP или TCP. В зависимости от используемого протокола, классы каналов располагаются в двух пространствах имен: и Каналы HTTP Пространство имен содержит классы каналов, такие как HttpServerChannel и использующие для пере дачи сообщений между удаленными объектами протокол HTTP. Класс HttpClientChannel 3 Передача каналы служит для передачи клиентом и удаленным объектом. Создать и за объект этого класса можно так:

Basic (New Visual Примечание Конструктор объекта HttpClientChannel не требует передавать ему порта как параметр, поскольку система Remoting автоматически выделяет для канала свободный порт.

Канал HttpServerChannel позволяет принимать вызовы от удаленных клиентов. В отличие от при регистрации этого объекта необходимо передать в качестве параметра номер свободного порта. код демонстрирует создание и объекта HttpServerChannel, прослушивающего порт 8080:

Visual Basic Dim channel as New Visual C# HttpServerChannel channel-new Конструктору объекта HttpServerChannel передают номер порта, будет прослушиваться в ожидании вызовов удаленных клиентов. Передача конструкто ру занятого порта вызывает исключение. Если вы не знаете, какой порт передать конст руктору, передайте аргумент, равный 0. При этом система Remoting сама выделит сер верному каналу порт.

Класс HttpServerChannel используется для отправки и приема удаленных объектов. Следующий код демонстрирует создание и регистрацию объекта HttpServer Channel, порт Visual Basic Dim channel as New Visual HttpChannel channel - new Конструкторы различных классов HTTP-каналов перечислены в табл. 4-3.

Метод-конструктор в Visual Basic обозначается ключевым словом New, а в Visual C# имя конструктора совпадает с именем класса.

gg и использование Глава Табл. 4-3. Конструкторы классов HTTP-каналов Имя Описание Класс Конструктор по умолчанию, поля класса.

или Объект HttpChannel, полученный с конструктора по умолчанию, работает как клиентский канал Создает объект способный работать как клиентский или серверный канал, параметр port порт, в ожидании вызовов это объект типа содержащий набор clientchannelsinkprovider, свойств канала в виде пар «ключ — clientchannelsinkprovider — объект типа клиентские канальные приемники;

serverchannelsinkprovider объект типа clientchannelsinkprovider, Provider, создающий серверные канальные приемники (о канальных приемниках — в занятии 3) Класс Создает новый экземпляр класса его значениями по умолчанию Создает класс и инициализирует свойства значениями из пар «ключ — значение», взятых из объекта или properties. Clientchannelsinkprovider типа Sink используется объектом HttpClientChannel для (properties, создания клиентских канальных приемников.

clientchannelsinkprovider) отправляемые клиентским каналом, проходят через цепочку клиентских канальных приемников Создает объект HttpClientChannel и устанавливает его свойство ChannelName по значению name. — или объект который используется объектом HttpClientChannel для создания клиентского канального приемника, Сообщения, отправляемые клиентским каналом, проходят через цепочку клиентских канальных приемников Класс Создает объект HttpServerChannel, инициализированный значениями по умолчанию Создает и инициализирует объект HttpServerChannel, или прослушивающий порт, заданный параметром port Создает объект HttpServerChannel, устанавливает его или свойство ChannelName по значению пате и назначает для HttpServerChannel прослушивания порт, заданный параметром (name, port) Занятие 3 Передача сообщений через каналы Табл. 4-3. Конструкторы HTTP-каналов (окончание) Имя Описание Создает класс HttpServerChannel и его свойства serverchannelsinkprovider) значениями из пар «ключ — значение», взятых из объекта или properties. Serverchannelsinkprovider — объект Provider, используемый объектом HttpServerChannel для создания приемника серверного канала, serverchannelsinkprovider) получаемые серверным каналом, проходят через цепочку серверных канальных приемников HTTP-каналы применяют в тех случаях, когда главной задачей является обеспече ние совместимости взаимодействующих Перед отправкой по такому каналу сообщения в формат XML согласно протоколу SOAP, для этого канал использует класс Возможности взаимодействия, достигаемые ванием позволяет вызывать удаленные объекты, не Framework. Если же приоритетной производительность, каналы, поддерживающие пересылку сообщений в двоичном формате. классы вы найдете в пространстве имен Remoting.Channels.Tcp, подробнее о них — в следующем разделе.

Примечание (serialization) — это процесс сохранения состояния для записи на диск или передачи по сети, (deserialization) — обратный процесс, включающий воссоздание объекта из его состояния, прочитанного с диска или полученного из сети.

Каналы TCP Каналы TCP обеспечивают обмен сообщениями между доменами приложений по про токолу TCP. Перед отправкой сообщения удаленному объекту такие каналы его в поток двоичных данных при помощи класса а получив сооб щение в двоичном формате, его (также с класса BinaryFormatter) перед доставкой удаленному объекту. К классам каналов TCP относятся Channel, и обеспечивает отправку кли ентом удаленному объекту, a TcpServerChannel — позволяет удаленному объекту получать эти Класс TcpChannel обеспечивает двусторонний обмен сообщениями между удаленными объектами. каналов TCP ана логична таковой для каналов HTTP. Следующий код демонстрирует регистрацию кана лов TCP:

Visual Basic (New channel as New TcpServerChannel(8070) (channel) Dim as New и объектов Visual C# (new channel=new TcpChannel new Конструкторы классов каналов TCP описаны в табл. 4-4.

Табл. 4-4. Конструкторы классов каналов TCP Имя Описание Класс TcpChannel Конструктор по умолчанию, все поля класса.

или TcpChannel, полученный с помощью конструктора по умолчанию, работает как клиентский канал Создает объект TcpChannel, способный работать как или клиентский или серверный канал, параметр port определяет порт, в ожидании вызовов Properties — это объект типа Dictionary, набор clientchannelsinkprovider, свойств канала в пар «ключ — значение»;

— объект типа клиентские канальные приемники;

TcpC ha (properties, serverchannelsinkprovider — объект типа clientchannelsinkprovider, создающий серверные канальные приемники Создает новый экземпляр класса TcpClientChannel, или инициализируя его значениями по умолчанию TcpClientChannelO класс TcpClientChannel и инициализирует его свойства clientchannelsinkprovider) значениями из пар «ключ — значение», взятых из объекта или properties. — объект типа используется объектом создания клиентского канального Сообщения, отправляемые клиентским каналом, проходят через цепочку клиентских канальных приемников Создает объект TcpClientChannel и устанавливает его свойство по значению name. Clientchannelsinkprovider ~ или объект который используется объектом для создания клиентского канального приемника. Сообщения, отправляемые клиентским каналом, проходят через цепочку канальных приемников Занятие сообщений через каналы Табл. 4-4. Конструкторы классов каналов TCP (окончание) Имя Класс TcpServerChannel и инициализирует объект TcpServerChannel.

или порт, параметром port TcpServerChannel (port) объект TcpServerChannel, устанавливает его свойство или ChannelName по значению пате и назначает для port) прослушивания порт, заданный параметром port класс TcpServerChannel и его vider) значениями из пар «ключ — взятых из объекта или TcpServerChannel — объект Provider, объектом TcpServerChannel для создания серверного канального приемника. получаемые серверным каналом, проходят через серверных канальных приемников Примечание У класса нет конструктора по умолчанию.

Если удаленный объект получает сообщения от клиентов сервера через объект TcpChannel или TcpServerChannel. клиенты смогут вызывать методы удаленного объек та, только если они используют аналогичные объекты. Если это попытается сделать кли ент, HttpClientChannel или HttpChannel связи с удаленным объек том, использующим объекты TcpChannel или он получит ошибку «The underlying connection was closed;

An unexpected error occurred on a receive».

Выбирая между использованием HTTP- и TCP-каналов, нужно учитывать их осо бенности. Каналы HTTP и TCP сравниваются в табл. 4-5.

Независимо типа (HTTP или TCP), канал выполняет все предписанные ему фун кции. отправляемые и принимаемые каналами от удаленных объектов, ходят через цепочку особых которые канальными приемниками.

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

Табл. 4-5. Сравнение каналов HTTP и TCP Каналы HTTP Каналы TCP Передают сообщения между Передают сообщения между удаленными удаленными объектами по протоколу HTTP протоколу Для Для используют класс сообщений используют класс По умолчанию создают два соединения Число создаваемых ими соединений равно связи с заданным сервером. числу запрашивающих клиентских Настраиваются изменением атрибута Соединения с сокетами закрываются при в конфигурационном отсутствии активности в течение с файле приложения (см. стр.) и Глава Табл. 4-5. каналов HTTP и TCP (окончание) Каналы HTTP Каналы TCP Генерируют и используют объект Генерируют и объект ChannelDataStore для хранения ссылок для хранения ссылок на объекты на объекты Канальные приемники и их цепочки Каналы устанавливают соединения с объектами через Remoting, обеспечивая между ними обмен При передаче по каналу сообщения проходят через цепочку канальных приемников. Канальный приемник (channel sink) выполняет над определенные операции и передает его приемнику в цепочке.

Цепочки приемников позволяют получать доступ к сообщениям, направляемым к уда ленным объектам или принятым от них, а также обеспечивают фильтрацию, шифрова ние сообщений и реализуют защитные ограничения, Схема цепочек серверных и клиен тских канальных приемников на рис. 4-2, Домен клиентского приложения Домен серверного приложения Рис. 4-2. Цепочки канальных приемников Цепочки канальных приемников конструируют из компонентов приемников, Это в которых реализованы интерфейсы IClientFormat или При активизации удаленного объекта система Remoting получает у текущего канала компонент канального приемника и вы зывает его метод чтобы создать первый приемник. Первым в клиентском канале должен быть форматирующий приемник, который сериализовать сооб Занятие 3 Передача сообщений через каналы в поток, а транспортный, сформированный поток по сети.

Следующий код демонстрирует создания цепочки канальных приемников:

Basic private Function As chain As New sink As sink = chain - New sink return chain End Function Visual C# private IClientChannelSinkProvider { IClientChannelSinkProvider chain - new IClientChannelSinkProvider sink - chain;

= new sink = return chain;

Примечание Классы и использованные в примере выше, применяют для создания нестандартных форматирующих объектов.

На этом занятии вы с каналами, по которым клиенты отправляют сообшения удаленным объектам. Каналы также передают сведения о событиях, генери руемых серверным и клиентским приложениями. Таким образом, Remoting под держивает программирование удаленных приложений, чему и посвящено следующее занятие.

.

94 и объектов Глава Занятие 4. События и делегаты Framework применять делегаты и обработку событий при разработке удаленных что расширяет их возможности.

Изучив материал этого занятия, вы сможете:

рассказать о событиях и делегатах;

применять события и делегаты при создании распределенных приложений.

Продолжительность занятия около 30 минут.

Введение в события и делегаты Обычно программирование с разработкой про грамм с графическим интерфейсом пользователя. В подобных приложениях события генерируются в ответ на совершение над элементом интерфейса какого-либо действия, пример — кнопки вокне приложения. Информация об событии передает ся объекту, который реагирует на него исполнением определенного действия. Объект, сгенерировавший событие, называется или источником события а объект, и событие, — или при события (event программирование применяют и в разработке приложений, не имеющих пользовательского интерфейса, таких как приложения, ин фраструктуру Remoting. в подобных приложениях генерируются при из менении состояния самих приложений. Здесь также присутствует два объекта: источник события и его приемник, только источнику не известно, какой объект или метод явля ется приемником события. Для обеспечения корректного взаимодействия между объек тами инфраструктура Framework предоставляет специальные классы — делегаты.

(delegate) — это класс, который содержит ссылку на метод, вызываемый при срабатывании события. В отличие от других классов у делегатов име ется сигнатура. В делегат разрешается помешать ссылки только на те методы, которые соответствуют его сигнатуре. Делегаты событий объявляют так:

Visual Basic Public As e As Visual public delegate void RetireEventArgs e):

Объявив делегат события, можно метод, на который он будет ссылаться.

Сигнатура этого метода должна соответствовать сигнатуре объявленного делегата. Сле код демонстрирует создание метода, на который ссылается делегат события:

Visual Basic Class Action Сигнатуры RetireEvent и совпадают.

4 Событий и делегаты Public Sub RetireEvent(sender As Object, e As RetireEventArgs) End Sub C# public class Action { // Сигнатуры RetireEvent и совпадают.

public void RetireEvent (object sender, RetireEventArgs e) {} ;

После этого создать экземпляр делегата и записать в него адрес на который делегат ссылается:

Visual Basic Dim a As New Dim handler As RetirementHandler - AddressOf Action a = new handler new Делегаты событий относятся к групповым делегатам, то есть могут содержать ссыл ки на методов. Применение событий и делегатов в программировании рас пределенных приложений Remoting обсуждается и разделе.

Применение событий и делегатов в Remoting События и делегаты расширяют возможности распределенных приложений. Делегаты реализации функций обратного вызова программирования собы тий, а также асинхронных процедур в приложениях, удаленное действие. Благодаря использованию делегатов с событиями клиентским компонентам распределенных приложений доступны функции обратного вызова. Это позволяет енту и удаленному приложению функционировать как серверы, так что подобные при ложения являются не чисто клиент-серверными, а скорее сервер-серверными.

Примечание обратного вызова (callback function) — это на метод, данная другому методу. Вызывая метод, на который указывает эта ссылка, второй метод фактически вызывает первый метод.

Применяя события и делегаты в приложениях необходимо удостоверить ся, что:

• делегаты, передаваемые серверу для обратного вызова, ссылаются на члены ляров, поскольку удаленные вызовы статических членов не разрешаются;

• канал, обратные вызовы, правильно зарегистрирован.

Благодаря делегатам методы — обработчики событий могут быть абстрактными. Со бытие вызывает все делегаты, зарегистрированные для его обработки. Делегаты анало гичны обратного за исключением того, что клиент должен зарегист Создание и, рировать делегат для обработки события. Чтобы делегат смог обрабатывать события уда ленного приложения, необходимо:

определить событие и объявить класс, производный от EventArgs, — событие будет передавать его с делегатом;

2. определить делегат с требуемой событием сигнатурой — он станет оболочкой для обработчика события;

3. написать метод, который будет обрабатывать событие;

4. обработчика события;

5. подключить делегат к событию.

Следующий код демонстрирует реализацию событий и делегатов в приложении Remoting:

Visual Basic Реализация класса Ev'entArgs Public Class RetirementEventArgs Inherits EventArgs Private ret_age Integer Public Sub age as Integer) ret_age - age End Sub Public Readonly Property as Integer Get Return ret_age End Get Property Class Определить делегат для обработки события RetirementEvent Public Delegate Sub sender As Object.

e as Реализация генерирующего событие Public Class Employee Inherits Public Event retirement as Public Sub Retire() Dim e as New RaiseEvent e) End Sub End class Реализация класса, обрабатывающего событие Public Class HR Занятие 4 и Public Sub as New Dim as New HR() AddressOf End Sub Public Shared Sub sender as e as Age is & Cint(e.

End Sub End Class Visual C# using System;

// Реализация класса EventArgs public class : EventArgs < private int ret_age;

public age) { = age;

} public int { get { return ret_age;

} } !

// делегата, обрабатывающего событие public delegate void sender, RetirementEventArgs e);

// класса, событие public class Employee :

{ public event retirement;

public void { RetirementEventArgs e = new и объектов Remoting Глава // Реализация класса, обрабатывающего событие public class HR { public static void Main() { = new HR = new new ' public void sender, e) { Age + Наряду с одним из приме няемых при разработке приложений Remoting, является применение асинхронных вы зовов.

Занятие 5 методы да Занятие 5. Асинхронные методы Поддержка асинхронных вызовов в позволяет вызывать и исполнять не прерывая исполнение основной программы. Возможность продолжать исполнение, не дожидаясь завершения вызванных методов, способствует повышению быстродействия приложений. Инфраструктура также поддерживает асинхронные мето ды. Программирование асинхронных распределенных методов строится тех же что и создание асинхронных методов, исполняемых в пределах одного приложения или контекста. Использование этого подхода дает возможность вызывать удаленные методы на сервере, не прерывая работу клиентского Изучив материал этого занятия, вы сможете:

рассказать о программировании асинхронных методов;

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

Продолжительность занятия — около 30 минут.

Введение в асинхронные методы В вызов асинхронного метода не прерывает исполнения вызывающей программы.

Асинхронный исполняется одновременно с основной программой, пока не тится обратный блокировка, либо не начнется опрос или не потребуется дож даться завершения другого метода. В асинхронные методы применяются при реа лизации:

• операций файлового, потокового ввода-вывода или ввода-вывода через • сетевых приложений (использующих протоколы HTTP или TCP);

• (HTTP и TCP) и объектов прокси;

• использующих ASP.NET;

• ASP.NET;

• очередей технологию Microsoft Message • асинхронных делегатов.

В модели асинхронного программирования сервер разделяет асинхронную рацию на две задачи. Первая принимает входные данные от клиента и запускает асинх ронную операцию. В дополнение эта задача принимает делегат вызывае мый по завершении асинхронной Вторая задача возвращает результаты асин хронной клиенту. Первая задача возвращает объект (waitable object), в котором реализован интерфейс с помощью которого клиент определяет состояние исполнения асинхронной операции. Пока асинхронная операция не завер шится и объект ожидания не будет возвращен клиенту, использует для сохра нения любых сведений о состоянии, связанных с асинхронной операцией. Далее клиент передает объект ожидания второй задаче, чтобы получить результаты асинхронной опе рации. Асинхронные методы реализуют с применением:

• обратных делегаты обратного вызова передают перед началом асинхрон ных вызовов;

• проверки завершения — чтобы определить, завершена ли асинхронная процедура, свойство 8 ftfeb-сервисов 200 Создание и объектов • методов Beginlnvoke, — позволяют немедленно завершить операцию;

• методов Endlnvoke — управляют ожиданием на объекте Result.

Асинхронные делегаты применяют для асинхронного вызова методов. Асинхронные вызовы реализованы общеязыковой средой (CLR) как многопоточные.

Когда делегат синхронно, Invoke вызывает целевой метод делегата, который исполняется в одном потоке с методом. же, поддерживаю асинхронные делегаты, генерируют методы Invoke, Beginlnvoke и Endlnvoke.

При вызове метода Beginlnvoke CLR ставит вызов в очередь и немедленно возвраща ется к исполнению текущего метода. Позднее целевой метод будет вызван на потоке из пула свободных потоков, и исходный поток, вызвавший Beginlnvoke, продолжит испол нение целевого метода. Обратный вызов, если таковой задан для Beginlnvoke, осуществ ляется после возврата управления целевым методом. В ходе исполнения обратного вы зова метод Endlnvoke получает возвращаемое значение вместе с входными и выходны ми параметрами. Если обратный для Beginlnvoke не задан, Endlnvoke можно выз вать в исходном потоке, вызвавшем Beginlnvoke.

Реализация асинхронных методов в приложениях Remoting Технологии применения асинхронных методов в распределенных приложениях Remoting и в пределах одного домена приложения или контекста отличаются Единственное дополнительное требование — правильная настройка асинхронных вызо вов в соответствии с требованиями Remoting. Применяя асинхронные методы в приложениях, использующих Remoting, помните • решение том, вызывать и удаленный метод асинхронно или нет, принимает вызы вающее приложение;

• удаленные типы не обязаны поддерживать асинхронную функциональность своих клиентов;

• следует позаботиться о контроле типов;

• необходимо правильно применять объекты System. ing для реализации ожида ния и синхронизации методов.

Как вызывать асинхронный метод в распределенном Создайте экземпляр объекта, который будет получать удаленный вызов метода.

2. Создайте для метода экземпляра этого объекта оболочку в виде объекта Async 3. Создайте еще один для удаленного метода.

4. Вызовите метод Beginlnvoke у второго делегата, передав ему аргумен ты, ссылку на метод AsyncDelegate и объект для хранения состояния вызова, 5. Ожидайте, когда объект совершит обратный вызов заданного вами метода.

Следующий код демонстрирует асинхронные вызовы методов в приложении, исполь зующем Remoting:

Basic Создать экземпляр который будет получать удаленные вызовы Dim as New 5 методы Создать делегат для метода, который будет исполнен после завершения асинхронного метода Dim as New делегат методу Delegate Sub Создать делегат для метода, исполняемого асинхронно Dim As New Начать исполнение асинхронного метода Visual C# // Создать экземпляр класса, который будет получать удаленные вызовы remoteObj = new // Создать делегат для метода, который будет исполнен после завершения // асинхронного метода AsyncCallback remoteMethod = new // Создать делегат для метода, исполняемого асинхронно MyAsyncDelegate new // Начать исполнение асинхронного метода Создание и объектов.

Занятие 6. Конфигурирование и защита объектов Инфраструктура Framework поддерживает программное конфигурирование уда ленных приложений посредством вызова методов самого приложения.

Также Framework добавлять в файл приложения секцию, отвечающую за настройку удаленного взаимодействия. Для защиты удаленных приложений применяют систему безопасности, основанную на ролях. Кроме того, ком поненты, чьим является ASP.NET, можно защитить протоколом SSL Sockets Layer) и механизмами безопасности IIS (Internet Information Services).

Изучив материал этого занятия, вы сможете:

описать различные способы конфигурирования приложений конфигурировать защищенные удаленные объекты;

рассказать о методах зашиты удаленных объектов.

Продолжительность занятия — около 30 минут.

Конфигурирование удаленных объектов Framework позволяет удаленные объекты программно или вруч ную. Первый способ лучше, когда после компиляции удаленного объекта изменять свойства не потребуется. Для динамического изменения свойств удаленных объектов без их перекомпиляции пользуйтесь конфигурационным файлом приложения. В обоих случаях для конфигурирования удаленных объектов необходимо предоставить системе Remoting некоторые сведения, чтобы клиент смог вызывать удаленные объекты:

• тип удаленного объекта;

• каналы, которые удаленный объект будет использовать для получения сообщений от клиентов;

• удаленного объекта;

• метаданные, тип удаленного объекта.

Для программного конфигурирования удаленных объектов Framework предос тавляет класс figuration из пространства имен Ниже на примере показано, как задать тип активизации и имя приложения для удален ного объекта:

Basic (New Dim myservice As New = "TcpService" 6 и защита Visual = new - TcpService":

способ конфигурирования удаленных объектов — посредством спе секции, добавленной к конфигурационному файлу приложения. Вот пример подобной секции объектов с серверной и клиентской активизацией:

XML mode = type = objectUri Конфигурирующие атрибуты описаны в табл. 4- Параметры конфигурации удаленных объектов могут быть заданы в файле Machi либо в конфигурационном файле приложения. Чтобы загрузить значения па раметров из конфигурационного файла приложения, вызовите метод Однако помните, что перед ционным файлом приложения Framework всегда обрабатывает файл fig. Следовательно, вызывать метод на файле не нужно, так как некоторые им параметры могут быть уже заг ружены. Ниже приводится пример кода, загружающего параметры из конфигурацион ного файла приложения MyApp.exe.config:

Visual Basic и использование объектов Табл. 4-6. атрибуты Элемент Содержит информацию об удаленных объектах, экспортируемых или используемых приложением Содержит объекты, экспортируемые приложением. Элемент содержать один или несколько элементов Содержит об объектах с серверной активизацией, экспортируемых приложением. Элемент может содержать или несколько элементов Этот элемент имеет три обязательных атрибута: mode, type и objectUri. Атрибут mode принимает значение Singleton или атрибут type определяет имена типа и сборки, содержащей код этого типа, a ObjectUri задает конечную точку объекта Содержит об объектах с клиентской активизацией, экспортируемых приложением. Элемент может содержать один или несколько элементов. Этот элемент имеет единственный атрибут — type, который определяет имена типа и код этого типа Защита объектов Remoting Безопасность удаленных объектов обеспечивают посредством по правам досту па кода. Данная модель защиты ограничивает набор ресурсов компьютера, доступных удаленному объекту. В ее рамках разрешения, которыми обладает удаленный объект, зависят от группы безопасности, к которой он относится. Ресурсы, доступные удален ным объектам в различных зонах безопасности, перечислены в табл. 4-7.

Табл. 4-7. Защита объектов по правам доступа кода Доступ к каналу Доступ к Зона безопасности и типу канальных приемников Everything (зона полного доступа) Разрешен Разрешен Full (Local Machine) [полное доверие] Разрешен Разрешен (локальная Разрешен Запрещен Internet (Интернет) Nothing (зона запрета доступа) Запрещен Запрещен Если хостом удаленного объекта является для обеспечения безопасности уда ленных объектов можно задействовать его защитные механизмы и SSL. Хост в лице IIS предоставляет поддержку SSL для которыми клиенты обменивают ся с удаленными объектами. Кроме того, удаленные объекты, чьим хостом является можно защищать с помощью встроенных механизмов аутентификации Windows и про токола В силу этих обстоятельств, выбирая между использованием и предпочесть HttpChannel и использовать для хостинга удален ных объектов.

6 и защита объектов Резюме • Инфраструктуру Remoting используют для обеспечения между различными приложениями, расположенными на одном или разных компьюте рах. Эти компьютеры могут работать в одной сети либо в разных, разбросанных по всему миру, и под управлением разных операционных систем.

• Разработка удаленных приложений включает создание клиентских и серверных объектов с их активизацией. В дальнейшем клиент модействие с сервером, используя ссылки на серверные объекты.

• Каналы позволяют клиентским объектам, работающим в разных доменах приложе ний, процессах или на разных компьютерах, обмениваться с исполь зованием различных сетевых протоколов, таких как TCP и HTTP.

• События и делегаты расширяют возможности приложений Remoting и применяются для реализации функций обратного обработки событий и вы зовов.

• Удаленные методы сервера разрешается вызывать асинхронно, не прерывая работы вызывающего приложения на клиентском компьютере.

• Приложения Remoting конфигурируют программно, вызывая соответствующие ме тоды самого приложения, либо вручную, добавляя к файлу при ложения секцию настройки параметров удаленного взаимодействия.

• Безопасность приложений Remoting обеспечивают зашитой, основанной на ролях.

Объекты, для хостинга которых используется ASP.NET, можно защищатьс помощью и механизмов безопасности IIS.

Создание и Практикум 4. Создание и использование объектов Remoting На этом практикуме приложение для интранет-чата, использу ющее Remoting. Пользователи этого приложения обмениваться сообщениями другом. Приложение состоит из классов ChatCoordinator, Server и Client. Класс ChatCoordinator. от представляет удаленный объект приложения. Объекты Client будут вызывать удаленные методы для отправки сообщений другим объектам Client. Класс Server — это консольное приложение, конфигурирующее объект ChatCoordinator параметрами, взятыми из Обмен сообщения ми между объектами ChatCoordinator и Client управляется событиями. В при ложении для чата также будет класс SubmitEventArgs, производный от Event Args. Объект ChatCoordinator будет источником события SubmitEventArgs, a объекты — его приемниками. Решение задач этого практикума вы най дете в каталоге на прилагаемом компакт-диске.

Продолжительность практикума — около 90 минут.

Упражнение Создание библиотеки ChatCoordinator.dll Сейчас вы должны создать библиотеку ChatCoordinator.dll с классами Chat и SubmitEventArgs.

Создание ChatCoordinator.dll Откройте Блокнот и введите следующий код:

Visual Basic Imports Imports Imports Public Class SubmitEventArgs Inherits EventArgs Private As String = Nothing Private username As - Nothing Public Sub contribution As String, contributor As String) = contribution = contributor End Sub Public Readonly Property As String Get Return message End Get Практикум и использование объектов * End Property Public Property As String Get Return End Get End Delegate Sub sender As As SubmitEventArgs) Class ChatCoordinator Inherits Public Sub • Instance: & ToSt End Sub Public Overrides As Object Return Nothing Sub As String. ByVal contributor As says: contribution) e As New SubmitEventArgs(contribution, RaiseEvent e) End Sub End Class Visual C# using System System. Runtime.

public class Event :

string null:

private string - null public string contributor) contribution:

alias = contributor:

Создание и объектов Remoting Глава string Contribution { get{ return _string;

} } public string Contributor { get { return _alias;

} public delegate void sender, public class ChatCoordinator : MarshalByRefObject public { created. Instance: + public override object return ] public event SubmissionEventHandler Submission;

public void string contributor) sent: contribution) e new contributor);

if (Submission null) e);

2. Сохраните код в файл Практикум и использование объектов 3. В командной строке Visual Studio введите ?

чтобы файл (для файла ChatCoordinator.cs по требуется команда Упражнение 2. Создание конфигурационного файла для объекта ChatCoordinator Ваша задача — создать конфигурационный файл для настройки удаленного объекта ChatCoordinator, созданного в предыдущем упражнении.

Создание файла 1. Откройте Блокнот и введите следующий код:

ChatCoordinator" />.

2. Сохраните файл под именем fig.

Упражнение З. Создание консольного активизирующего объект ChatCoordinator Теперь вы создадите консольное приложение, которое будет активизировать объект ChatCoordinator с использованием параметров конфигурации из фай ла консольного I. Откройте Блокнот и введите код:

Visual Basic Imports System Imports Создание и Глава Imports Public Class Server Public Shared Sub Main() host application is currently & "running. Press Enter to End Sub End Class C# System;

using public class Server { public static void Args) { host application is currently + "running. Press Enter to Console.

.

2. Сохраните файл под именем 3. Скомпилируйте введенный код, исполнив в командной строке Visual Studio команду vbc Server.vb для файла Server.vb или же для файла Упражнение 4. Создание клиента интранет-чата Теперь вам необходимо создать консольное приложение — клиент чата. Оно состоит из класса ChatClient, методы удаленного объекта Chat Coordinator. Класс ChatClient содержит методы Run и SubmissionReceiver.

Метод Run конфигурирует клиентский объект с использованием значений из файла клиентского приложения I, Откройте Блокнот и введите код:

Visual Basic Imports System Imports Imports Imports Создание и Public Class Inherits Public Overrides Function As Object Return Nothing End Private As String = Nothing Public Sub New(ByVal [alias] As String) = [alias] End Sub Public Sub Dim As New As String = While 0 and ENTER to userlnput = If userlnput = "0" Then Exit While End While RemoveHandler AddressOf End Sub Public Sub sender As Object, args As If = username Then message was Else & & End If End Sub Public Shared Sub Dim Args() As Environment.

If <> 2 Then need to type an Return End If Dim client As New Создание и Глава Sub End Class Visual C# using System;

using using using public class ChatClient : MarshalByRefQbject private string = public override object { return null;

public alias) { = alias;

} public void { chatcenter = new ChatCoordinator();

new String = while { 0 and ENTER to keyState if true) == 0} break;

-= new public void sender, args) { if username, true) == 0) { message was Практикум Создание и использование объектов else + says: + public static void Args) { if 1) { need to type return;

client - new 2. Сохраните файл под именем Client.vb (Client.cs).

3. Скомпилируйте введенный код, исполнив в командной строке Visual Studio команду vbc ?Client.vb для файла Client.vb или же /r;

Chat ?Client.cs для файла Client.cs.

Упражнение 5. Создание конфигурационного файла для настройки объекта ChatCHent Вам осталось создать файл необходимый для конфигурирования объекта ChatCHent.

Создание конфигурационного файла Откройте Блокнот и введите код:

4 и объектов runtime.

2. Сохраните файл под именем Упражнение 6. Тестирование приложения для интранет-чата | А Настало время проверить работу созданного приложения для интранет-чата.

Тестирование созданного приложения Откройте окно командной строки Visual Studio и перейдите каталог с файла ми и 2. команду результат будет примерно таким:

3. Откройте новое окно командной и в каталог с файлами ChatCoordinator.dll и 4. Исполните команду Client Имя Вот что получится, если исполнить команду Client 5. Откройте еше несколько окон командной строки;

в каждом из них перейдите в ката лог с файлами Client.exe, и Создание и объектов 6. Введите и исполните в только что открытых окнах команду Client имена пользователей.

7. Попробуйте отправить несколько из окон, в которых работает клиентс кое приложение. Ниже показаны сообщения, которыми пользователь Userl обмени вается с другими пользователями.

f Да А..

to to вот как эти пользователя с именем User2:

В Exit:

Я В.> and Создание Глава Закрепление материала Приведенные ниже вопросы помогут вам лучше усвоить основные темы дан ной главы. Если вы не сумеете ответить на вопрос, повторите материал соот Ответы для самопроверки — в приложении А «Вопро сы и в конце книги.

Какие требования необходимо соблюсти, чтобы установить взаимодей ствие между разделенными границами Remoting?

2. Назовите и опишите два типа дистанцируемых объектов.

3. Назовите и опишите режимы активизации Remoting.

4. Как обновить аренду объекта?

5. Что такое каналы?

6. Как опубликовать сервис за пределами домена, в котором он исполняется?

7. Для чего нужны делегаты в распределенных приложениях?

8. Как реализовать асинхронные вызовы в приложении Remoting?

Какие сведения необходимо предоставить системе Remoting, чтобы сконфигурировать удаленный объект?

Программирование баз данных с применением Занятие Введение в ADO.NET 2. Введение в провайдеры данных Занятие 3. Работа с объектами DataSet Практикум 5. Создание и применение компонентов доступа к данным Закрепление материала В этой В этой главе вы узнаете, что такое ADO.NET, познакомитесь с ее архитектурой и пре Вы также познакомитесь с провайдерами данных и научитесь их Вы узнаете, как создавать и применять объекты ADO.NET DataSet и DataView. В завершение вы научитесь управлять данными и обрабатывать их с объектов и Прежде чем начать Для изучения материалов этой главы вам потребуются:

• умение программировать на Basic или Visual C#;

• навыки программирования баз данных;

• умение подключаться к базам данных при помощи Visual Basic или Visual C#.

данных с применением Глава Занятие Введение в Сегодня очень высока вероятность того, что созданному вами распределенному бизнес решению потребуется доступ к данным организации, в различных источни ках. Благодаря Framework позволяет создавать приложения для работы с данными, способные работать с различными источникам данных и в разнородном окружении. При вы сможете конструировать распределенные при ложения, совместное использование данных.

Изучив материал этого занятия, вы сможете дать определение описать архитектуру рассказать о преимуществах перечислить различия между ADO и Продолжительность занятия — около 45 минут.

Обзор С помощью приложения, ориентированные на работу с БД, могут подклю чаться к различным источникам данных, извлекать из них информацию, манипулиро вать полученными данными и обновлять их. Для обмена данными между приложения ми и источниками в используется формат XML. Благодаря этому позволяет получать доступ к любым источникам данных, для которых имеются провай деры. включает провайдеры SQL Server (для доступа к ба зам данных Server 7.0 и выше) и OLE (для доступа к базам данных OLE DB), а провайдеры данных ODBC и Oracle можно загрузить с rosoft.com/downloads. В традиционных приложениях для работы с БД клиент устанавли вает соединение с БД и поддерживает его открытым до завершения что требует затрат системных ресурсов. Так, если открыто много соединений, сервер БД медленнее реагирует на запросы клиентов, поскольку большинство БД поддерживают лишь несколько одновременных соединений. Кроме того, приложения, которым требу ется постоянное соединение с БД, масштабируются.

К преимуществам ADO.NET относится поддержка отсоединенной архитектуры. Бла годаря ей приложения могут подключаться к серверам БД только для извлечения или обновления данных. Соответственно, уменьшается число постоянно открытых соедине ний с серверами БД. Кроме того, ADO.NET обеспечивает стандартное представление данных, позволяя получить унифицированный доступ к данным из многочисленных разнородных источников.

Для работы с данными ЕТ поддерживает команды, при помощи которых мож но исполнять операторы SQL в локальных и удаленных БД и вызывать хранимые про цедуры из клиентского приложения. Например, для извлечения из БД набора строк до статочно установить соединение, создать соответствующую команду, определить SQL оператор SELECT для извлечения нужных записей и вызвать исполняющий команду метод. В результате объект Command возвращает набор строк, который можно обрабо тать сразу или записать в объект DataSet для последующей обработки.

Объект ADO.NET DataSet — это кэш записей, извлекаемых из источника данных, такого как БД или XML-файл. DataSet содержит записи из одной или нескольких таб и сведения о связях между этими таблицами. Он позволяет обрабатывать данные в Занятие любое время, когда это необходимо. Кроме того, DataSet применять отдельно от источника для управления данными из приложения или XML-файла, то есть под ключаясь к БД. Так, бизнес-объект среднего уровня может создать DataSet, заполнить его и передать для обработки другому компоненту приложения.

В приложении для работы с БД, созданном с применением данные пере даются от одного объекта к другому: извлекаются из источника данных в объект DataSet, а затем передаются компонентам, таким как элементы управления формы. В данные передаются между компонентами в формате API данных автоматически генерируют XML-файлы данных на основе DataSet и передают дру гим компонентам.

Созданное приложение получает доступ к источнику данных через провайдер данных (data provider) Инфраструктура предоставляет два провайдера: OLE DB и SQL Server Первый обеспечивает подключение и получение доступа к источни кам данных OLE DB, второй — к базам данных SQL Server.

Классы ADO.NET, такие как DataSet и определены в пространстве имен и, чтобы использовать ADO.NET, приложение должно содержать ссылку на это пространство имен.

Архитектура ADO.NET обеспечивает обмен данными между компонентам (такими как данных, объекты DataSet и приложения). В совокупности эти компо ненты и образуют архитектуру ADO.NET (рис. 5-1).

данных - Соединение Транзакция Команда Параметры XML Рис. 5-1. Архитектура ADO.NET Помимо источника данных, архитектура ADO.NET включает провайдеры данных и объекты DataSet.

Источники данных Источник данных (data source) — это сервер БД, для доступа к которому или XML-файл. Провайдер данных ADO.NET позволяет получить до ступ к источнику и выполнять на нем команды SQL.

220 баз данных с применением Глава Для работы с БД вашим приложениям, вероятно, потребуется к нескольким как к одной, и обрабатывать их данные. Например, организациям зачастую нужны списки имен всех покупателей с количеством поставленных им товаров.

Объекты ADO.NET DataSet созданы для хранения отсоединенных данных из не скольких источников к распределенном окружении. DataSet хранит данные в виде на бора таблиц вместе со сведениями об их связях. DataSet является источником для запрашивающего их приложения. При этом приложение может обращаться к запи сям DataSet и манипулировать ими без постоянного подключения к БД.

объекта DataSet определена в одноименном классе, который со стоит из одного или нескольких объектов DataTable, представляющих таблицы (о них — в занятии 3).

Провайдеры данных Подключаться к источнику данных, выполнять некоторые команды операто ры SQL) и получать приложению позволяют объекты Connection, DataReader и из состава провайдера данных и описаны в табл. 5-1.

Табл. 5-1. Компоненты провайдера данных Имя Connection Позволяет устанавливать и соединением с БД Command Служит для исполнения команд SQL, извлечения результатов и других например обновления записей БД DataReader Обеспечивает последовательное чтение данных. В результате однонаправленного чтения БД DataReader извлекает из нее поток данных, предназначенных только для чтения. Позволяет хранить в памяти не более одной строки данных одновременно DataAdapter Отвечает за взаимодействие БД и объекта DataSet. Кроме того, служит для обмена данными между источником DataSet, а также между DataSet и другими приложениями Microsoft Exchange Server) Как сказано выше, Visual Studio Framework включают два провайдера данных ADO.NET: OLE DB и SQL Server Провайдер OLE DB позволяет подключаться к источникам данных OLE DB, a SQL Server — к базам данных SQL Server 7.0 и выше. Классы этих провайдеров содержатся в пространствах имен и соответ ственно. Чтобы в своем приложении нужный провайдер данных, добавь те ссылку на соответствующее пространство имен. Любой класс провайдера содержит методы для:

• подключения к БД;

• исполнения операторов SQL и хранимых процедур;

• однонаправленного чтения строк;

• передачи данных между БД и DataSet;

• вывода об ошибках и предупреждений, БД, и обработки возникающих при этом исключений;

• исполнения над БД операторов Занятие 1 в XML Расширяемый язык разметки Markup Language, XML) используется для ния и передачи данных внутри При этом не требуется явно преобразовывать данные в формат XML, поскольку его поддержка интегрирована в ADO.NET, как и в объекты DataSet. Структура объектов DataSet, включая определения типов данных и ограничений, посредством схемы XML. Таким образом, содер жимое DataSet можно и представить как XML-данные, а структуру — как схему XML, Перечисленные в таблице компоненты архитектуры ADO.NET позволяют полу доступ к данным и без труда выполнять над источниками различные операции.

Преимущества ADO.NET При разработке приложений для работы с БД предоставляет множество пре имуществ, подробно описанных в разделах.

Возможности взаимодействия Возможность взаимодействия — одно из основных предоставляемых Благодаря использованию формата XML получать данные смо жет любой поддерживающий его компонент. Например, ADO.NET может обмениваться данными с приложениями, работающими на любых платформах.

Удобство обслуживания Приложения, созданные с использованием ADO.NET, обладают лучшей управляемос тью и масштабируемостью по сравнению с ADO. He исключено, что вам понадобится изменить архитектуру готового приложения, чтобы ускорить его работу или увеличить число пользователей, одновременно с приложением. Рассмотрим эту ситу ацию на примере сайта электронной По мере роста популярности сайта возрастает число посещений. Скорее всего, повышение нагрузки заставит вас модифи цировать архитектуру приложения, увеличив число уровней. Однако в отношении раз вернутого приложения эта задача трудна, и ее решение займет много времени. Кроме того, при обмене данных между уровнями могут возникать сбои. ADO.NET позволяет без труда увеличить число уровней в приложении, поскольку для передачи данных используется формат Благодаря этому объекты из новых уровней смогут без помех обмениваться данными.

Простота программирования ADO.NET программирование различных действий (например исполнение команд SQL), позволяя повысить продуктивность труда разработчика и свести к мини муму число ошибок. К примеру, при команд ADO.NET для работы с данными можно исполнять SQL-операторы и хранимые процедуры, при этом формирование и исполнение операторов берет на себя ADO.NET. Кроме того, классы данных ADO.NET дают возможность применять при написании кода строгую типизацию. Это делает воз можным применение автоматического завершения операторов что так же облегчает написание кода. Помимо типизированное программирование повы шает безопасность кода и уменьшает число ошибок компиляции.

баз с Глава fei,«,-i& Производительность Для передачи данных между отсоединенные наборы записей ADO ис СОМ. Для того чтобы СОМ распознать типы данных, пос ледние необходимо преобразовать, а это производительность приложения. В от ADO, передает данные в формате XML. Следовательно, необхо димость преобразования а производительность приложения растет.

Масштабируемость Увеличение количества данных и в бизнес-моделях организаций обусловили быстрый рост потребности в данных. Возьмем для примера интернет-магазин спортто Потенциальные покупатели могут найти информацию о товарах в БД Products.

Но когда несколько покупателей одновременно захотят просмотреть сведения об одном и том же товаре, потребность в использовании БД Products возрастет. Благодаря своей отсоединенной архитектуре позволяет вашим приложениям масштабировать ся в соответствии с требованиями, число открытых соединений с БД.

Возможности о которых говорилось выше, лежат в основе множества ее перед ADO. Ниже мы рассмотрим основные различия между ADO и ADO Различия между ADO и ADO и отличаются в разных таких как архитектура, ставление данных и способы их совместного использования с приложениями.

Представление данных в памяти Для представления данных, извлеченных из в памяти таблиц, в ADO ис пользуется набор записей (recordset). Обычно набор записей содержит данные, получен ные из одной таблицы. Для сохранения данных из нескольких таблиц используются зап росы JOIN, извлекающие данные в единую результирующую таблицу. В для данных в памяти объекты DataSet. Как сказано выше, DataSet способен хранить данные из нескольких а также из различных источни ков;

там же хранится информация о связях и ограничениях таблиц. Таким образом, DataSet может представлять структуру БД.

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

Число открытых соединений В подключение к БД нужно лишь для извлечения и обновления данных. Вы извлечь скопировать их в DataSet и отключиться от БД. Хотя набор за ADO тоже поддерживает доступ к отсоединенным данным, она все же предназна чена, главным для работы с постоянным подключением.

В ADO.NET взаимодействие с БД при объектов и DataReadcr;

они вызывают провайдер OLE DB или функции API источника данных.

1 в Совместное использование данных с приложениями В ADO отсоединенные наборы записей передаются между компонентами с маршал га СОМ. В передаются объекты DataSet через XML-потоки. Пере дача данных в формате XML имеет • Большее разнообразие типов данных. При маршалинге СОМ допускается вание лишь типов данных, определенных стандартом СОМ. При передаче ных ограничений по типам нет — можно передавать любые упорядочиваемые дан ные.

• Прозрачность брандмауэров. Набор не сможет пройти через брандмауэр, по последний не пропускает системные запросы, такие, как при маршалинге СОМ. В то же время брандмауэры не препятствуют передаче а в для передачи DataSet используется XML, поэтому его можно отправлять и через брандмауэры.

224 Программирование баз с применением Глава Занятие 2. Введение в провайдеры данных На этом занятии вы научитесь подключаться к источнику данных и выполнять над БД различные операции, такие как запросы, вставка, обновление и Вы также познакомитесь с провайдерами данных для подключения к различным источникам дан ных. Далее вы научитесь подключаться к источнику с объектов и Connection, манипулировать данными с объекта Connection и узнаете, как заполнить данными В завершение вы узнаете, как применять объекты Data Reader для однонаправленного чтения БД с целью получения из нее потока данных, предназначенных только для чтения.

Изучив этого вы научитесь:

подключаться к источнику данных с помощью объекта Connection;

манипулировать данными, используя соответствующие команды;

' заполнять объекты DataSet;

использовать DataReader для однонаправленного чтения БД;

определять случаи, когда следует применять DataSet, а когда DataReader.

Продолжительность - около минут Обзор провайдеров данных Как говорилось в занятии 1, для доступа к БД OLE DB и Server 7.0 и выше исполь зуются провайдеры OLE DB и Server В принципе, OLE DB в данном случае может заменить SQL Server но лучше использовать последний: он вызывает встроенные функции Server и потому более эффективен. Для доступа к источникам данных ODBC и серверам БД Oracle используются провайдер ODBC и.NET-провайдер для Oracle соответственно (их необходимо загрузить и установить Провайдер данных состоит из четырех основных объектов:

• Connection — подключается к источнику данных;

• Command — исполняет команды над источником данных;

• DataReader — использует чтение для извлечения из базы потоков данных, предназначенных только для чтения;

• DataAdapter — заполняет DataSet и источник данных.

На этом занятии вы будете подключаться только через провайдеры OLE DB и SQL Server Для этой цели служат два объекта Connection: OleDbConnection и SqlConnection Класс OleDbConnection Класс OleDbConnection позволяет создать соединение с БД. Чтобы манипулировать дан ными источника, необходимо сначала подключиться к нему. Для этого нужно передать классу OleDbConnection информацию об источнике данных, такую как имена БД, ком пьютера-источника, провайдера данных, а также имя и пароль пользователя. Вот син таксис создания подключения с класса OleDbConnection:

2 в провайдеры Visual Basic Imports Dim Connection As New Установить свойство ID-Admin;

& _ "Data Открыть соединение Visual using connection = new = User + "Data Connection В приведенном фрагменте кода свойство класса OleDbConnection пол названием ConnectionString позволяет задавать информацию, необходимую Framework для подключения к БД Authors. Во второй строке кода, где устанавливается свойство Connec tionString, имя провайдера — а источником данных является файл БД Microsoft Access с именем Идентификатор пользователя я роль — это учетные данные, необходимые для получения доступа к БД Authors. Для использования класса OleDbConnection следует импортировать пространство имен Data.OleDb.

Класс код демонстрирует применение класса SqlConnection для к БД Visual Basic Imports Dim connection As New Установить свойство ConnectionString = "Data & Initial Открыть соединение Visual using SqlConnection connection = new "Data Программирование баз данных с применением Глава Этот фрагмент кода похож на тот, что использует класс OleDbConnection. Единствен ное отличие в том, что в свойстве можно не задавать атрибут Для использования класса необходимо импортировать имен доступное пространства имен Класс Из предыдущего раздела вы узнали, как с объектов Connection подключиться к некоторой БД, а теперь рассмотрим, как использовать Command для исполнения команд над источниками данных. типа объектов Command:

OleDbCommand и Класс OleDbCommand представляет оператор SQL или хранимую испол няемую в источнике данных. Например, объект OleDbCommand позволяет выполнить пакетную вставку или обновление. Синтаксис создания объекта OleDbCommand следу ющий:

Visual Basic Dim as New Dim myConnection as New OleDbConnectionO Dim as String = "Select from Products".

= & = myConnection = OleDbCommand myCommand = new OleDbConnection myConnection = new OleDbConnectionO;

string "Select Products":

= + = myConnection;

Этот код объявляет объект OleDbCommand. После установить свойство Connection объекта OleDbCommand — оно задает используемый объект Connection. Затем объекту требуется предоставить оператор Он определяет команду, выполняемую над заданным источником данных. Это могут быть SELECT, UPDATE и DELETE. Строковая переменная Занятие 2 Введение в содержит оператор SELECT, который исполняется над источником из влекая число полей D из таблицы Products базы данных Занесите в свойство объекта OleDbCommand переменную mySQL. Оно определяет оператор или хранимую процедуру, исполняемую над БД.

Установив свойства Connection и CommandText объекта OleDbCommand, можно ис полнить команду над заданным источником данных. Для этого применяются методы ExecuteScalar, или о каждом из них будет подробно рассказано в следующих разделах.

' Метод ExecuteScalar Метод ExecuteScalar исполняет оператор SQL нал источником данных и вращает единственное значение. Это значение первого поля первой строки результиру ющей остальные значения игнорируются. Обычно метод ExecuteScalar для исполнения над таблицей агрегирующих Например, чтобы получить число в адресе которых есть почтовый индекс 28273, нужно функцию COUNT. запрос выглядит примерно так:

SELECT from Employees where Zip = Оператор SQL вернет только одно поле из одной строки результирующего набора.

Метод ExecuteReader Метод ExecuteReader исполняет SQL или хранимую процедуру над доступным источником данных и возвращает объект OleDbDataReader ним вы чуть позже). Следующий фрагмент кода демонстрирует применение метода Execute Reader для извлечения объекта OleDbDataReader:

Visual Basic Dim as New Dim as New Dim as String = "Select Products" & = myConnection CommandText = Dim myReader as OleDbDataReader = Visual C# OleDbCommand = OleDbConnection = new string mySQL = "Select * Products";

228 Программирование баз данных с применением Глава + = OleDbDataReader myReader;

= Метод ExecuteReader применяется для получения объекта OleDbDataReader с меняемой копией данных источника, полученной в результате чте ния. Подробнее об этом объекте будет рассказано ниже.

Метод Метод ExecuteNonQuery применяют для исполнения операторов INSERT, UPDATE и DELETE, Исполнив над источником данных эти операторы, метод возвращает численное значение, число строк, на которое повлияло зап роса. фрагмент кода демонстрирует применение метода ExecuteNonQuery:

Visual Basic myCommand as New Dim myConnection as New as String = "INSERT INTO PRODUCTS VALUES = myConnection myCommand.

dim = Visual C# myCommand = new OleDbConnection = new 01eDbConnection();

string INTO = + = myConnection;

Занятие 2 Введение в провайдеры данных NoOfRows 0;

NoOfRows);

Класс SqICommand Класс SqICommand представляет оператор или хранимую которую нуж но исполнить над источником данных SQL Server. Этот объект применяют, например, для пакетной вставки или обновления источника данных SQL Server. Синтаксис ния объекта SqICommand демонстрирует код:

Visual Basic As New SqICommand О Dim As New Dim mySQL As = "Select Products" = "data & Connection = Visual SqICommand = new SqlConnection myConnection = new SqlConnection();

string mySQL = "Select from Products";

- "data + Connection = myConnection;

= Объект SqICommand используется, почти как только имя провай дера в свойстве можно не указывать.

Объект SqICommand состоит из четырех методов Execute: Execute Reader, on Query и ExecuteXMLReader. Синтаксис и функциональность этих методов идентичны таковым в объекте OleDbCommand.

230 баз о применением Применение адаптеров данных Адаптер данных формирует между приложением и источником данных интерфейс для извлечения и сохранения Объект OleDbDataAdapter представляет соеди нение и набор объектов команд для заполнения объекта DataSet. Более подробно с объектом DataSet вы познакомитесь на занятии.

Объект OleDbDataAdapter служит для заполнения данными объекта DataSet. Доступ ные для данные первичного ключа не импортируются в DataSet неявна, во вре мя его заполнения, поэтому приходится делать это явным образом. Чтобы заполнить DataSet с помощью объекта необходимо установить после днего, например, задать нужные объекты Command и У объекта OleDbData Adapter есть четыре в которые записываются объекты Command:

Insert and, UpdateCommand и Подробнее эти свойства обсуждаются в разделах.

Свойство Свойство позволяет указать оператор SQL или хранимую извлекающую данные из источника. Для этого можно установить свойство SelectCom mand существующего объекта либо свойство объекта Command по умолчанию, сгенерированного при использовании объекта SelectCommand.

Если свойство не возвращает ни одной строки, результирующая табли в DataSet не записывается, исключение при этом не генерируются Свойство Свойство SelectCommand позволяет задать оператор SQL или хранимую процедуру для вставки данных в источник. Это делается путем установки свойства InsertCommand су ществующего объекта OleDbCommand либо свойства CommandText объекта Command по умолчанию, сгенерированного при использовании объекта InsertCommand. Свойство InsertCommand возвращает целочисленное значение, отражающее число строк, изме ненных в результате вставки Свойство При помощи свойства UpdateCommand указывают оператор SQL или хранимую проце дуру для обновления источника данных. Это делают посредством установки свойства UpdateCommand существующего объекта либо свойства CommandText объекта Command no умолчанию, сгенерированного при использовании объекта Update Command. После исполнения объект UpdateCommand возвращает число строк, изме ненных в результате обновления.

Свойство DeleteCommand Свойство DeleteCommand применяют, чтобы задать оператор SQL или хранимую про цедуру, удаляющую данные из источника. Для этого можно установить свойство Delete Command существующего объекта OleDbCommand или свойство CommandText объекта Command по умолчанию, сгенерированного при использовании объекта UpdateCom mand. После исполнения объект DeleteCommand возвращает число удаленных строк.

Следующий код демонстрирует применение свойств SelectCommand, UpdateCommand и DeleteCommand.

Занятие 2 Введение в провайдеры данных Visual Basic Dim As New Dim As New OleDbCommandO Dim As New OleDbConnectionO Dim mySQL As String = "Select * from Products" = & myCommand. Connection = rnyConnection = mySQL = myCommand Dim As New Dim As For Each myRow In Next mySQL "INSERT INTO = myAdapter. = Dim count As Integer count = rows affected", count) = "Update PRODUCTS Set WHERE PRODUCTID 78" = mySQL = myCommand count = rows affected", count) mySQL "DELETE FROM PRODUCTS PRODUCTID 78" = = myComrnand count = rows affected", count) Visual string "Select * from Products";

OleDbDataAdapter myAdapter new 01eDbDataAdapter{);

myCommand = new OleDbCommandO;

rnyConnection new 232 Программирование данных с применением Глава = + "user = = mySQL.Trim();

= DataSet = new in { Console.

= "INSERT INTO = = myCommand;

int count;

count = rows count);

mySQL = PRODUCTS Set = WHERE 78";

= mySQL;

= count rows affected", count);

mySQL "DELETE FROM PRODUCTS WHERE PRODUCTID 78";

mySQL;

= count = rows affected", count);

Реализация классов и OleDbDataAdapter сходны. С классом SqlData использовать объекты Command и Connection.

Аналогичные объекты, применяемые с классом SqIDataAdapter, называются и SqlConnection соответственно.

.• Класс Класс DataReader предоставляет доступ к источнику данных для однонаправлен ного чтения. Применение DataReader снижает системные издержки, поскольку в любой момент в памяти находится только одна строка данных. Чтобы получить запись, DataReader заново подключается к источнику и извлекает Объект DataReader можно создать вызовом метода объекта Command. Как ска зано в предыдущем разделе, метод объекта Command возвращает Data Занятие 2 в провайдеры Reader. Всего классов чтения данных два: и Подробнее них — в следующих разделах.

Класс Класс путем однонаправленного чтения БД SQL Server извлекает из нее по ток данных, предназначенных только для чтения. Объекты создают вом метода класса SqICommand, но прежде следует вызвать метод на объекте соединения, которое используется объектом SqICommand. Закрывают объект SqlDataReader с помощью метода освобождающего SqIConnection. Вот пример применения класса SqlDataReader:

Dim myString As String myString = "data Initial & Dim As String = "SELECT lastname, FROM Employees" Dim As New Dim As New = Connection myConnection Dim myReader As SqlDataReader myReader = Read перед обращением к данным.

While & & _ End While He забывайте вызывать Close, закончив...и закрывать соединение, закончив с ним работать.

string myString:

myString = "data Initial + "user string mySQL = "SELECT lastname, firstname FROM Employees";

SqIConnection myConnection = new SqICommand = new mySQL;

= myConnection;

SqlDataReader myReader;

myReader = while 234 данных с применением Здесь SqlDataReader инициализируется объектом, который вернул метод Метод объекта SqlDataReader служит для чтения строки из источника данных. Заметьте, что в любой момент содержит не более одной строки.

Метод Read() объекта SqlDataReader вызывается для последовательной выборки строк.

После чтения нужных строк объект SqlDataReader освобождается. После этого можно вызывать метод и свойство Метод Метод класса SqlDataReader которое показывает, зак рыт ли SqlDataReader.

Свойство Другой член класса SqlDataReader, свойство RecordsAfTected, число строк, измененных, или удаленных при исполнении над БД заданных операторов Прежде чем вернуть число строк, на которое повлияло испол нение всегда вызывает метод Close(), чтобы возвращаемое значение не изменилось.

Класс Класс OleDbDataReader также предоставляет доступ только для однонаправленного чте ния, но работает с любыми источниками данных. Чтобы создать объект OleDbData Reader, применяют метод ExecuteReader() класса OleDbCommand. Данные объекту OleDbDataReader поставляет связанный объект OleDbConnection. Пока OleDbDataReader использует объект OleDbConnection, он остается недоступным другим операциям, же лаюшим извлечь или записать в Чтобы закрыть объект OleDbDataReader и OleDbConnection, вызывают метод Создание компонентов доступа к данным с помощью мастера Data Adapter Configuration Wizard Итак, вы научились программно создавать компоненты доступа к данным, а теперь вы научитесь делать это с помощью мастера Data Adapter Configuration Wizard. Чтобы выз вать мастер, выполните следующее.

Запустите Visual Studio и откройте новый проект.

2. На панели Project Types выберите Visual Basic или Visual C# Projects.

3. На панели Templates диалогового окна New Projects щелкните значок Windows Appli cation.

4. Введите в поле Name название проекта и щелкните ОК.

5. Откройте панель Toolbox и перетащите с вкладки Data на форму объект SqlData — откроется приветственный экран мастера Data Adapter Configuration Wizard. Чтобы продолжить, щелкните Next.

Занятие Введение в данных 6. На странице Choose Your Data Connection (рис. 5-2) New Connection.

7. В диалоговом окне Data Link Properties введите учетные данные SQL Server и выбе рите из списка базу данных Если оставить поле имени сервера пустым, будет выбран сервер по умолчанию, которым является БД, работающая на локаль ном компьютере. Щелкните Next.

Choose Data to toad and tfWfifawcntyouwantisnetfctel the adapter we?

5-2. Страница Choose Your Data Connection что на Choose A Query Type (рис. 5-3) установлен переключа тель Use SQL Statements, и Next.

Choose a Type ТЫ statement* or rt«*J to the rtwed С and Рис. 5-3. Страница Choose a Query Type 9. На странице Generate The SQL Statements кнопку Query Builder.

Глава 236 Программирование баз данных с применением Выберите в диалоговом окне Customers таблицу Add Table, кнопку Add, затем Close, чтобы диалоговое окно, В окне Query Builder выберите строку All Columns, чтобы выбрать все столбцы Customers. На рис. 5-4 показана таблица Customers в окне Query Builder.

Рис. 5-4. Таблица Customers в Query Builder 1. Щелкните OK, На рис. 5-5 показана Generate The SQL Statements с запро сом, который сгенерировал Query Builder.

the SQL the rtatat.jriM ад«Л Рнс. 5-5. Страница Generate The SQL Statements с Builder Щелкните кнопку Advanced Options и убедитесь, что в окне Advanced SQL Generation Options (рис. 5-6) установлены все флажки.

Занятие в провайдеры данных Update and. - ft» into а retrieve values Рис. 5-6. окно Advanced SQL Generation На странице View Wizard Results Next, затем Finish.

В результате, как показано на рис. 5-7, к форме добавляются объекты SqlData Adapterl и - -J • fief ------- ---- Рис. 5-7. Форма Forml в окне дизайнера 15, Щелкните правой кнопкой объект SqlDataAdapterl и в контекстном меню выберите Generate 238 баз данных с применением Глава 16. В диалоговом окне Generate Dataset ОК.

17. К форме добавляется объект I.

18. Добавьте к обработчику события Load формы следующий код:

Visual Baste Как видите, при настройке адаптера данных с применением мастера почти не при ходится писать код. Кроме того, в Visual Studio -N ЕТ очень просто создавать типизиро ванные объекты DataSet. Об этих объектах речь пойдет на занятии.

3 Работа с объектами DataSet Занятие 3. Работа с объектами DataSet Как говорилось в занятии этой главы, объект ADO.NET DataSet является отсоединен ным источника данных. В DataSet можно хранить данные из несколь ких источников. Между таблицами в DataSet допускается создавать связи, даже если этих связей не было в источнике данных. Кроме того, на основе содержимого DataSet можно создавать различные представления. На этом занятии вы научитесь создавать объекты DataSet, а также добавлять к ним и манипулировать ими. В ние вы узнаете, как применяют события объекта DataSet.

Изучив материал этого вы сможете:

рассказать об объекте DataSet;

создавать объекты DataSet;

манипулировать объектами DataSet;

работать с событиями DataSet.

Продолжительность - около 60 минут.

Введение в объекты DataSet Объекты ADO.NET DataSet поддерживают архитектуру отсоединенных данных, храня в памяти, позволяя подключиться к источнику данных, извлечь из него инфор мацию, записать ее в DataSet и закрыть соединение. Благодаря этому работать с содер жимым БД не подключаясь к ней. Применение в памяти отсоеди ненных данных минимизирует число открытых соединений с БД и позволяет реже об мениваться данными с сервером БД, который использует сэкономленное время та об служивание других запросов. Архитектура отсоединенных данных обеспечивает быст рый доступ к данным, поскольку объект DataSet находится в памяти клиентского ком пьютера и все операции с данными (например обновление таблиц) на клиентском компьютере.

Объект DataSet состоит из набора таблиц и связей между ними, а каждая таблица — из набора строк, столбцов и ограничений. Доступ к этим компонентам можно получить через свойства и наборы объекта DataSet. Для работы с DataSet в ЕТ применяют ся классы:

DataSet — включает наборы Tables (представляет в DataSet таблицы) и Relations (представляет связи между таблицами, хранящимися в DataSet);

• DataTable — включает наборы Rows и Columns, представляющие строки и столбцы, а также наборы и ParentRelations, которые представляют связи между таблицами;

• Row — включает свойство которое показывает, была ли изменена ка таблицы после ее загрузки из БД. Возможные значения этого свойства — Deleted, Modified, New и Unchanged.

Кроме того, объект DataTable содержит набор Constraints, реализа объектами DataSet любых ограничений, включая ограничения на уровне БД. При таблицы, содержащейся в DataSet, этот объект реализует все ограниче ния на уровне клиента. Таким образом, когда DataSet подключается к БД для 240 баз данных с ния данных, эта операция выполняется быстро и без обмена данными с клиентом.

Структура объекта DataSet показана на рис. 5-8.

Рис. 5-8. Структура объекта DataSet Создание DataSet Создать объект DataSet можно, объявив экземпляр класса DataSet из пространства имен Создавая объект DataSet вызовом конструктора этого класса, можно (но не обязательно) передать имя нового объекта как аргумент конструктора. Например, DataSet с именем Employees создается так:

Visual Basic Создать новый класса DataSet Dim As new Visual // Создать класса DataSet DataSet EmployeeDS new Созданный DataSet можно заполнить таблицами. Для этого необходимо создать объек ты DataTable и поместить их в пример демонстрирует добавление таблицы к DataSet:

Visual Basic Dim EmployeeDS As new Dim As DataTable = Visual DataSet EmployeeDS new DataTable = Занятие 3 Работа с OataSet Добавление столбцов к таблице в DataSet К созданной в DataSet, разрешается добавлять нужные столбцы. Вот это делается:

Visual Basic Dim EmployeeDS As new Dim As DataTable = Добавить столбцы к таблице, хранящейся в DataSet • Visual C# DataSet EmployeeDS = new DataTable EmpTable = // Добавить столбцы к таблице, хранящейся a DataSet Установка ограничений для таблиц DataSet Добавляя к DataSet, можно устанавливать для них ограничения, та кие как ограничение первичного ключа. Эта задача решается с свойств PrimaryKey и Unique объекта DataColumn. Следующий код демонстрирует установку ограничения первичного ключа для столбца:

Visual Basic Dim EmployeeDS As new Dim EmpTable As DataTable = Задать идентификатор для столбца с первичным ключом Dim As DataColumn = ' Назначить EmployeelD столбцом с первичным ключом New Visual C# DataSet EmployeeDS new DataTable EmpTable // Задать идентификатор для столбца с первичным ключом 242 баз с применением Глава = // Назначить столбцом с первичным ключом new связей между таблицами DataSet Как сказано выше, в объекте DataSet может быть несколько таблиц, между которыми определять связи. Создавать такие связи и управлять ими мето ды объекта DataRelation.

Для связи между парой таблиц DataSet применяется метод Add объекта DataRelation. Этот метод принимает имя связи и пару ссылок на объекты родительский и дочерний создаваемой связи. код демонстрирует создание связей между двумя таблицами объекта DataSet:

Visual.

Примечание При создании связи между таблицами ограничение по умолчанию добавляется к родительской таблице, a — к дочерней.

объектом DataSet Над созданным и заполненным объектом DataSet допускается выполнять ряд манипу ляций, как слияние или содержимого из одного DataSet в другой.

Подробнее об этом — в разделах.

Слияние объектов DataSet Объекты DataSet, DataTable и можно объединить с другими такими же объек тами, при этом содержимое одного объекта добавляется к другому. Однако при слиянии необходимо придерживаться некоторых правил.

Проверка первичного ключа При слиянии объектов DataSet таблица, принимающая данные или схему, печивает данных путем проверки первичного ключа. При этом значения первичного ключа строк сравниваются с таковыми добавляемых. Обновле ние имеющихся строк выполняется только при соответствии схем добавляемой и при 3 Работа с DataSet таблиц. Новые строки, значение первичного ключа которых не найдено ни в одной из строк, добавляются к целевой таблице. Если в принимающей таб лице не задан первичный ключ, строки добавляемой таблицы будут вставлены в любом случае. Если в принимающей и добавляемой таблице первичный ключ задан на разных столбцах, возникает исключение, и DataSet генерирует событие Исключе ние генерируется и в тех когда и добавляемая таблицы содержат столбцы с одинаковыми именами, но разными типами данных. Кроме того, исключе ние генерируется и в том случае, если в родительской и дочерней таблицах есть одно именные столбцы с разными типами данных.

Сохранение При слиянии с DataSet объектов DataSet, DataTable и разрешается указывать, нужно ли сохранять изменения в DataSet. Можно также указать, как поступать с новыми элементами схемы добавляемых данных. Свойство Preserve Changes определяет, должны ли сохраняться модификации данных. Если установить его в True, значения добавляемой таблицы не заменят собой данные принимающей таблицы, в противном случае измененные версии строк из добавляемой таблицы будут записаны поверх строк принимающей таблицы.

Применение ограничений При слиянии двух объектов DataSet проверка ограничений происходит не во ис полнения метода Merge, а объединения таблиц. Поэтому не забудьте предусмот реть в своем коде обработку исключений.

Метод Merge объекта DataSet применяют для слияния содержимого объектов DataSet, DataTable и DataRow с аналогичными объектами, например, так:

Visual Basic Dim As New "integrated Dim As SqlDataAdapter = New & _ FROM Employees". DBConn) Dim As DataSet = New Dim As DataSet = New DataSetO 244 Программирование баз данных с применением НЕТ Visual + - + FROM DBConn);

DataSet = new EmpDA.

DataSet = new Те Копирование содержимого DataSet Время от времени требуется поработать с не изменяя исходные данные, хра в DataSet, либо создать их подмножество. В обоих случаях можно скопировать существующий DataSet, чтобы не создавать новый и не подключаться к серверу БД для его заполнения.

Инфраструктура ADO.NET поддерживает копирование и создание подмножеств су ществующих объектов DataSet. Так, ADO.NET позволяет:

• создать точную DataSet, включая схему, данные, сведения о состоянии и вер строк;

• получить новый DataSet со схемой DataSet, но содержащий только модифицированные строки. При этом можно поместить в копию все ванные строки либо только строки с заданным значением • копировать только схему или только структуру DataSet без строк ис ходного DataSet.

Следующий код демонстрирует создание точной копии DataSet:

Visual Basic Dim As new Dim copyDS As DataSet = C# DataSet EmployeeDS = new DataSet copyOS Занятие 3 Работа с объектами DataSet Как сказано выше, разрешается копии DataSet, только схему и модифицированные данные. Для этого применяют метод объекта DataSet, который также позволяет извлечь строки с заданным состоянием. Так, например, со копия объекта DataSet, лишь измененные Visual Basic Dim changeDS As DataSet Visual DataSet changeDS = ADO.NET также позволяет скопировать только схему DataSet при метода код демонстрирует копирование схемы DataSet с помощью Clone:

Visual Basic changeDS As DataSet = Visual C# DataSet changeDS Содержимое заполненного DataSet может быть представлено разнообразными спо собами. Для этой служат представления данных.

Создание представлений Подобно базам данных, DataSet поддерживает создание различных представлений дан ных. Например, вам может потребоваться для просмотра подмножество данных DataSet, некоторому критерию. Объект ADO.NET позволяет создать динамическое представление одиночного набора данных. Данные представления мож но упорядочить и отфильтровать по своему усмотрению. Однако, в отличие от пред ставлений баз данных, с объектом DataView нельзя как с таблицей.

DataView также не поддерживает создание представлений для объединенных Кроме того, нельзя добавлять к представлению столбцы, отсутствовавшие в исходной таблице, или исключать имевшиеся.

Объекты класса DataView применяют для создания представления данных, в DataSet. Создать объект DataView можно при помощи его конструктора. Для этого следует вызвать конструктор по умолчанию класса DataView и передать ему как аргумент. Следующий код демонстрирует создание объекта DataView с по мощью конструктора этого класса.

Visual Basic Dim As DataView = New = "City", DataView EmployeeDV = new "Country = "City", 246 баз данных с применением В этом примере объект DataView с именем содержит строки из таблицы Employees, хранящейся в DataSet EmpIoyeeDS. DataView хранит только строки, где поле Country Кроме того, содержимое EmployeeDV упоря дочено по значению поля City.

Приведенный ниже код демонстрирует установку свойств Sort и после со здания объекта DataView.

Dim EmployeeDV As DataView - New "City" = "Country = DataView EmployeeDV new = "City";

EmployeeDV. RowFilter = "Country Работа с событиями объекта DataSet поддерживает (event-driven programming), позволяющее перехватывать изменения и должным образом на них реагировать. Объект DataSet поддерживает событие которое гене рируется, если в ходе слияния объектов DataSet возникает конфликт. Так, если во вре мя слияния в принимающей и добавляемой обнаружатся столбцы с одинако вым именем, но разными типами данных, возникает исключение и генерируется собы тие MergeFailed;

Параметр типа передается обработчику события MergeFailed. У объекта MergeFaiiedEventArgs есть свойства Conflict, определяющее фликт между объектами DataSet, и Table, имя конфликтующей Этими свойствами можно воспользоваться для разрешения конфликта. Следующий код демонстрирует подключение обработчика для события MergeFailed.

Basic, EmpIoyeeDS As DataSet = New New Private Shared Sub As Object, args As MergeFaiiedEventArgs) failed for table & = & End Sub Занятие 3 с объектами DataSet Visual C# DataSet new DataSet{);

+= new MergeFailedEventHandler private static void sender, args) !

failed table + + } Помимо поддерживает ряд событий объекта Table.

Как и для MergeFailed, для событий объекта допускается писать Эти события генерируются в ответ на строк и (табл.

Табл. 5-2. События объекта Имя Когда генерируется После успешной модификации поля При передаче модифицированного значения поля После редактирования строки таблицы Во время строки таблицы RowDeleted После пометки строки как удаленной Перед пометкой строки как удаленной Создание типизированных объектов DataSet В отличие от нетипизированного объекта DataSet, не связанной схемы у его строго типизированного (strongly typed) аналога такая схема есть. доступа к значениям через нестрого типизированные переменные с использованием позднего связывания, строго типизированный DataSet поддерживает доступ к таблицам и полям посредством описательных имен и строго типизированных переменных.

Класс типизированного объекта DataSet происходит от класса DataSet, наследуя от него все события, методы и свойства. В дополнение к ним типизированный предоставляет строго типизированные версии этих методов, событий и свойств.

даря этому можно получать доступ к и полям, ссылаясь на них по именам вместо индексов в наборах. Это делает код более понятным и обеспе чивает поддержку редактором кода Visual Studio технологии IntelliSense, автома тически вводимые операторы. IntelliSense повышает качество кода, ис правляя ошибки из-за несоответствия типов во время компиляции, а не во вы полнения.

Создать строго типизированный объект DataSet можно с помощью утилиты команд ной строки XSD.exe, например, так:

/d Файл схемы XSD.

248 Программирование баз данных с Глава Резюме • Инфраструктура позволяет приложениям подключаться к различным ис точникам, извлекать нужные данные, манипулировать ими и обновлять содержимое источника. В обмена данных между приложениями и источниками используется Это позволяет применять для подключения к любым источникам данных, включая Server и другие серверы поддержива OLE DB.

• Провайдеры данных образуют интерфейс между приложением и источником данных. Провайдеры из Framework позволяют подключаться к различным ис точникам данных (например к SQL Server 7.0 и выше, а также к OLE DB).

• Адаптер данных формирует интерфейс между приложением и источником данных, позволяя извлекать и сохранять данные. Объект предоставляет соединение и набор объектов Command, необходимых для заполнения объекта DataSet.

• ADO.NET DataReader читает источник данных в одном направлении, извлекая из нее поток данных, предназначенных только для чтения. Для создания объектов DataReader служит метод соответствующего класса.

• Объект ADO.NET DataSet — это отсоединенное представление источника данных.

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

• DataSet — это набор и сведений о связях между ними. Каждая таблица, в свою очередь, состоит из строк, столбцов и ограничений.

Практикум Создание и применение доступа к данным 5. Создание и применение компонентов доступа к данным Задача этого практикума — получение навыков создания компонентов, при годных для разработки надежных и масштабируемых распределенных реше ний для доступа к данным. Вы создадите обслуживаемые дис танцируемые объекты, службу Windows и удаленный клиент, который позво лит подключиться к БД и модифицировать ее с любого удаленного компьюте ра. Решение задач этого практикума можно найти в каталоге при лагаемом компакт-диске.

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

• база данных авиакомпании с двумя таблицами (Flights и Bookings), хранящими ин формацию о заказанных билетах;

• два бизнес-объекта и Bookings), которые являются обслуживаемыми компо открывающими доступ к базе данных авиакомпании;

• дистанцируемый компонент Flight Bookings для подключения удаленного к бизнес-объектам;

• Windows с именем конфигурирующая дистанцируемый компонент и доступ к нему для удаленного клиента.

Продолжительность практикума - около 30 минут.

Упражнение Создание базы данных авиакомпании Сейчас вы создадите БД авиакомпании с таблицами Flights и Bookings.

Создание базы данных 1. Откройте окно Server Explorer в Visual Studio 2. Раскройте узел Servers и найдите в нем узел Servers.

3. Чтобы создать БД, щелкните правой кнопкой имя своего SQL Server и в контекст ном меню выберите New Database.

4. В диалоговом окне Create Database введите Airline в поле New Database Name, укажи те уровень аутентификации и — будет создана база данных Airline.

5. В меню Programs выберите Microsoft SQL Server, затем Query Введите учет ные данные для подключения к вашему серверу БД.

6. В окне Query Analyzer из списка БД выберите Airline.

7. Исполните следующий сценарий:

SQL if exists (select * where id = 1) 250 Программирование данных с применением ALTER DROP CONSTRAINT GO.

if (select * where id and 1) trigger GO if exists (select * from where id = and = 1) drop trigger GO if exists (select - from where id = and = 1) drop table [Bookings] GO if exists (select * from where = and OBJECTPROPERTYUd, = 1) drop table GO if not exists * from where id = = BEGIN CREATE TABLE ( [Flight_No] [char] (5) COLLATE NOT NULL, [datetime] NOT NULL, (10) COLLATE NOT NULL, [varchar] (50) COLLATE NOT NULL, [Age] NULL, [int] NOT NULL ) ON [PRIMARY] END GO if exists (select * from where id = and = 1) BEGIN TABLE ( Практикум Создание и применение компонентов доступа к данным COLLATE NOT NULL, [Carrier] (50) COLLATE NOT NULL, [varchar] (50) COLLATE NOT NULL, [varchar] (50) COLLATE NOT NULL, [Capacity] [int] NOT NULL, [int] NOT NULL, NOT NULL, [int] NOT NULL } ON END GO ALTER TABLE WITH ADO CONSTRAINT PRIMARY KEY CLUSTERED ( ) ON [PRIMARY] GO ALTER TABLE WITH NOCHECK ADD CONSTRAINT PRIMARY KEY CLUSTERED ( ) ON [PRIMARY] GO ALTER TABLE WITH NOCHECK ADD CONSTRAINT CHECK <= GO ALTER TABLE ADD CONSTRAINT FOREIGN KEY (. ) REFERENCES ( ) GO 252 баз данных с применением Глава SET ON GO SET ANSI_NULLS ON GO.

CREATE TRIGGER ON BOOKINGS AFTER INSERT AS BEGIN UPDATE FLIGHTS SET inserted where = and END GO SET OFF GO SET ON GO SET ON GO SET ANSI_NULLS ON GO CREATE TRIGGER ON BOOKINGS AFTER DELETE AS BEGIN UPDATE FLIGHTS SET deleted where and END GO SET OFF GO SET ON GO Практикум и компонентов к данным 8. Раскройте узел Tables базы данных Airline в окне Server Explorer, чтобы проверить, созданы ли в этой базе таблицы и Bookings.

Упражнение 2. Создание компонентов доступа к данным Ваша задача — создать компонента, которые позволят получать доступ к базе данных и модифицировать ее. Помимо компоненты доступа используют службы для автоматического управления транзак циями, создания объектов и их по требованию.

для доступа к базе данных 1. Откройте Studio 2. В меню File выберите New Project 3. На панели Templates щелкните значок Class Library, в поле Name введите Business Components.

4. Замените имя файла по умолчанию для на (Flights.cs). В окне Solution Explorer правой кнопкой имя файла Flights.vb (Flights.cs) и в контекстном меню выберите View Code, чтобы открыть окно кода.

Замените его содержимое следующим кодом:

Visual Basic Imports Imports Imports

& Public Class Flights Inherits Private As String Private As DataTable Private DataAdapter As SqlDataAdapter Private connection As SqlConnection Protected Overrides Sub As String) Вызывается после конструктора;

connectionString можно настроить на вкладке Activation в окне свойств компонента Account.

connectionString = constructString End Sub ' 254 баз данных с применением Глава Private Sub ' Инициализировать соединение connection = New DataAdapter New * Dim As New New End Sub Public Function As OataTable Return End Function Public Function new_dt As DataTable) As DataTable OataAdapte = Nothing = New Return End Function End Class Visual using using using using [assembly:

[assembly:

= integrated public class Flights :

private string ;

private DataTable ;

private DataAdapter private SqlConnection connection ;

Практикум Создание и к данным protected override void Construct(string ) { // после конструктора;

// можно настроить на вкладке Activation // в окне свойств компонента Account.

connectionstring constructstring;

private void { соединение connection - new = new * flights", = new OataAdapter);

= DataTable new public DataTable { return public DataTable update(DataTable new_dt ) { = null;

= = new return 5. Удалите файлы или из проекта 6. В меню File выберите Add New.

7. На панели щелкните Class, в поле Name введите 8. Замените заготовку класса Bookings кодом:

Basic Imports Imports 256 Программирование баз данных с применением Глава • Imports integrated & Public Bookings Inherits Private As String Private As DataTable Private As Private connection As Protected Overrides Sub Construct(ByVal As String) Вызывается после конструктора;

можно настроить на вкладке Activation в окне компонента Account.

connectionString constryctString End Sub Private Sub initializeO Инициализировать соединение connection = New SqlConnection(connectionString) DataAdapter = New * from bookings", connectionString) Dim As New = bookings_data = New End Sub Public Function As DataTable Return bookings_data End Function Public Function As DataTable) As DataTable DataAdapte Nothing = = New Return bookings_data Function End Class Практикум и применение доступа к данным Visual C# using using integrated public class Bookings :

{ private string ;

private DataTable private DataAdapter;

private connection ;

protected override void ) { // Вызван следом за конструктором // connectionString можно настроить на вкладке Activation // окне свойств компонента Account.

= constructstring;

private void { // Инициализировать соединение connection new SqlConnection(connectionstring);

DataAdapter new - bookings", connectionstring);

= new = new DataTable { return public DataTable new_dt ) 258 баз данных с применением Глава = null;

= bookingsjJata new return 9. Раскройте проект в окне Solution Explorer. Щелкните правой кнопкой узел References и в контекстном меню выберите Add Reference, чтобы выз вать одноименное диалоговое окно. Перейдите на вкладку и добавьте ссылку на пространство имен Создайте файл ключа для строгого имени. Для этого в командной строке Visual Studio исполните команду:

sn ??k меню Build выберите Build Solution, чтобы скомпилировать решение.

Упражнение Создание компонента удаленного доступа к данным Сейчас вы создадите компонент Flight Bookings, обеспечи вающий доступ к данным, предоставляемым компонен тами Flights и Bookings. Объект Flight Book ings создает DataSet на основе объек та предоставленного компонентами Flights и Bookings. Удаленный клиент вызывает методы объекта Flight Bookings, а он, в свою очередь, вызы вает методы объектов Flights и Bookings, чтобы получить и сведения о заказанных авиабилетах.

Создание компонента В меню Project Add New Project, чтобы добавить к решению но вый проект.

2. На панели Templates Class Library, в поле Name введите 3. Измените имя файла Class (Classl.cs) на Flight vb 4. Щелкните правой кнопкой проект Re mote AccessCom pone в окне Solution и в контекстном меню выберите Add Reference, чтобы вызвать одноименное диало говое На вкладке Projects (рис. 5-9) добавьте ссылку на пространство имен Busi nessCom pone Создание и применение доступа к данным Рис. 5-9. окно Add Reference 5. В окне Solution правой кнопкой файл Bookings.cs) и в контекстном меню выберите View Code, чтобы открыть окно кода.

Замените его содержимое кодом:

Visual Basic Imports System. Runtime.

Imports Runtime.

Public Class Inherits Private As OataSet Private flights As Private As Public Sub New() flt_bkgs = New flights = Mew bookings = New Dim dr As New Bookings", End Sub 260 баз данных с применением Public Function As DataSet Return flt_bkgs End Function Public Function As DataSet) As DataSet flt_bkgs = Hew Bookings") Dim As New Bookings", Return End Function End Class Visual using using using using using System;

using BusinessComponents;

public class FlightBookings :

{ private DataSet flt_bkgs private Flights flights ;

private Bookings bookings ;

public { flt_bkgs = new flights = new bookings flt_bkgs. Tables.

= new Bookings", public DataSet Практикум Создание и применение доступа к данным return flt_bkgs;

} public DataSet ) { flt_bkgs - new dr new Bookings", return } } 6, В меню Build выберите Solution, чтобы скомпилировать решение.

Упражнение 4. Создание службы для хостинга компонента удаленного доступа к данным Сейчас вы должны создать службы Windows, настройку и хостинг компонента Flight Book ings, созданного в ходе предыду щего упражнения.

Как создать службу-хост для компонента 1. В меню File\Add Project щелкните Add New Project, чтобы добавить к решению но вый проект;

на панели Templates значок Windows Service и в поле Name 2. Измените имя файла на Щелкните правой кнопкой файл (RemoteAccessAgent.cs) и в контекстном меню выберите View Designer. Щелкните в окне правой кнопкой, что бы вызвать страницу свойств службы Windows. Измените значения Name и на RemoteAccessAgent.

4. В Solution Explorer щелкните правой кнопкой файл RemoteAccessAgent.vb (RemoteAccessAgent.cs) и в контекстном меню выберите View Code. Найдите следую щую строку и замените в ней I на RemoteAccessAgent:

В проекте на Visual Basic для этого придется раскрыть область кода, генерированного дизайнером.

Visual Basic New 262 данных с применением Глава C# = new { new };

5. Щелкните правой кнопкой проект RemoteAccessAgent в окне Solution Explorer и в контекстном меню выберите Add Reference, чтобы вызвать одноименное окно. На вкладке добавьте ссылку на пространство имен System. Затем на вкладке Projects добавьте ссылку на проект 6. Отредактируйте код метода добавьте ссылки на необходимые пространства имен и объявите закрытую переменную, как ниже:

Visual Basic Imports Imports Imports Imports Class RemoteAccessAgent Inherits Private channel As TcpChannel Designer Generated code Protected Overrides Sub args() As channel New = "Remote Flight System Access" End Sub End Class Visual using System;

using using using using using using using using using namespace RemoteAccessAgent и применение к данным ;

public class RemoteAccessAgent :

private TcpChannel channel ;

// Designer Generated code protected override OnStart(string[] args) // TODO: Add code here to start your new "Remote Flight System Access";

7. Добавьте к службе RemoteAccessAgent установочные компоненты.

Примечание О том, как добавляются установочные компоненты, — в вы 2.

8. Б случае проекта на Basic измените стартовый объект. Для этого щелк ните правой кнопкой проект RemoteAccessAgent в окне Solution Explorer и в стном меню выберите Properties;

затем из списка Startup Object выберите объект RemoteAccessAgent.

9. В меню Build команду Solution, чтобы скомпилировать решение.

Упражнение 5. Создание удаленного клиента этого упражнения — создать Windows-приложение, которое позволит подключаться к компоненту Flight ings с локального или удаленного ком пьютера.

Создание приложения В меню File | Add Project щелкните Add New Project, чтобы добавить к решению но вый проект. На вкладке Templates шелкните Windows Application;

в поле Name введи те 2. Перетащите с панели Windows Forms Toolbox на форму элементы управления DataGrid и Button. Измените значение свойства Text формы Forml на Flight а свойства Text кнопки — на Save. Форма должна принять следующий вид:

Глава баз данных с применением 3. Щелкните правой кнопкой проект в окне Solution Explorer и в контек стном меню выберите Add Reference, чтобы открыть одноименное диалоговое окно.

На вкладке добавьте ссылку на пространство имен Затем на вкладке Projects добавьте ссылку на проект nts.

4. Щелкните правой кнопкой файл Forml.vb и в контекстном меню выбери те View Code, чтобы открыть окно кода. Замените его содержимое следующим ко дом:

Visual Basic Imports Imports Imports Imports Imports Public Class Inherits Private As Private ds As Private Sub sender As e As Handles Try ds New DataSet() ds = ds Catch ex As Exception Практикум Создание и применение доступа к данным End Try End Sub Private Sub sender As e As System. EventArgs) Handles Try Dim As DataSet = ds = ds = ds = Catch ex As Exception End Try End Sub End Class Visual • using System;

using using using using using using using System. Runtime. Channels:

using using namespace RemoteClient I /// /// Summary description /// public class Forml :

!

internal internal private FlightBookings flight_Bookings ;

private DataSet ds ;

private void Button1_Click{object sender, e) !

try 256 баз данных с применением Глава DataSet = ds = = ds;

= catch (Exception ex ) { private void e) { try { ds = new DataSet();

= new ds = = ds;

Pages:     | 1 | 2 || 4 | 5 |   ...   | 6 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.