WWW.DISSERS.RU

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

Product while ( ) Листинг Страница демонстрирующая отображение возвращенных хранимой процедурой «Ten Most Expensive Products» из базы данных Время заняться данными! using System;

using using using using using using using using namespace Chapter08_SimpleSPSelect ( /// /// Сводное описание /// public class WebForml :

{ protected protected public { += new private void sender, e) !

// Разместите здесь пользовательский код // страницы "Integrated Host Expensive try { i catch 310 Глава private void sender, EventArgs e) // Здесь также закрывается подключение private void sender, EventArgs e).

// // Этот вызов необходим для // Web Designer.

// ffregion Web Designer generated code /// /// Этот метод для поддержки Designer /// не содержимое метода /// средствами редактора исходного текста.

/// private void InitializeComponentO { += new new } tfendregion } ' Листинг Файл программной логики демонстрирующий вызов хранимой процедуры в ASP.NET На рис. 8-5 показана страница, полученная в результате выпол нения SimpleSPSelect.

Время заняться данными! доцппшЕишншшапш БЙ Help Price Cote Thuringer S 123. $97. Sir Tigers $55. Dried Apples $53. au 49. Sauerkraut.i,, :

Рис. Результаты работы SimpleSPSelect.aspx — список самых дорогих товаров, возвращенный хранимой процедурой Следующие две строки з 5impleSPSelect.aspx.cs (листинг 8-6) задают параметры вызова процедуры;

Host Expensive Конструктору передается не SQL-оператор, а имя хранимой процедуры. Затем я устанавливаю Command Type команды в Как вы помните, в предыдущих примерах главы при выполнении SQL-команд не устанавливал так как меня устраивало зна чение этого свойства по умолчанию. Дальнейшие операции по вызову метода no отношению к объекту SqICom mand и сохранения возвращенного SqlDataReader ана логичны тому, что вы видели в предыдущих примерах.

Примечание Внимательные читатели обратили что в предыдущих примерах для досту па к данным используется класс и классы с приставкой А в примерах работы с хранимыми процедурами используется класс 312 Глава u с приставкой Различия между этими классами и уместность того или дру гого класса мы обсудим чуть позже в разделе «Клас сы и В листинге 8-5 я еще раз спосо бом отображения данных в таблице:

Wend С подобным кодом ряд потенциальных проблем.

Pages:     | 1 | 2 || 4 | 5 |



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

Pages:     | 1 | 2 || 4 | 5 |

«т Посвящается Тиму и Эрин — я живу благодаря людям, которых люблю. ...»

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

Классы элементов управления ASP.NET Все сущности в Framework являются объектами. Ну ладно, немного преувеличил — не совсем все, так как типы значений, такие, как целые и по умолчанию объектами не явля ются. Однако вас не должен удивлять тот факт, что создаваемые вами компоненты будут так иначе производными от класса Object. На рис. 6-1 показана иерархия классов, которая являет ся основой любого компонента.

Пространство имен содержит класс Sys которому наследуют все серверные элемен ты управления. От два наибо лее важных пространства имен — и Пространство имен элементы управления, которые напрямую отображают в стандартные серверные элементы управления HTML (созда ваемые с помощью стандартного синтаксиса с добавле нием пары «атрибут — значение» Пространство имен WebControls включает все элементы управления ASP.NET, тэги которых в содержат например Создание компонентов Л Содержит серверные HTML-элементы Легенда Абстрактный класс Рис. Иерархия классов серверных элементов управления Примечание Если вы что мир станет если в эту иерархию добавить классы элементов управления Windows-форм, я хочу еще раз напомнить что, увы, мир разработчиков далек от совершенства. Достаточно один раз взгля нуть на класс чтобы тут же понять, насколько непохожи друг на друга две среды элементов управления и Windows.

на элементы управления Web не распро страняются такие понятия, как или описатели окон (window handles), в то же время на элементы управления Windows не распространя ются такие понятия, рендеринг (rendering) или со страницы (view state). Эти классы имеют между собой много общего, и безусловно, привычно иметь со многими свой ствами Web-элементов например Text.

Но это сходство не должно вводить вас в заблуж дение, поскольку и реализация, и назначение эле ментов управления в Web и Windows очень сильно разнятся.

202 Глава Хотя в пространства имен и включено большинство элементов управления, которые станут базовыми для ваших элементов, это не единственные пространства имен, которые можно взять за основу для построения элементов управ ления. Как видно на в этой иерархии два наиболее важ ных класса и Page базовым классом для всех Web-страниц в что хотя класс Page используется иначе, чем остальные классы элементов управле ния, в своей основе он похож на любой другой элемент ния. (Очень важно изучить элементы управления. Это понадобит ся даже тем программистам на Visual Basic, кто не создает элемен ты управления, а только использует их в повседневной работе.) Так же как и Page, в класса иногда используют по хожий на него класс Правда описывает не всю страницу, а ее часть. На странице разрешается размещать несколько объектов класса UserControI, а также вкла дывать их друг в друга.

В ранних бета-версиях ASP.NET поль зовательские элементы управления назывались pagelets. Это название мне нравилось больше, чем тем не менее UserControI - это окон чательное их название.

Жизненный цикл элемента управления Для осмысления работы всех элементов управления необходимо очень ясно понимать жизненный цикл элемента управления. В какой момент времени, например, восстанавливается состояние страницы (view state)? Что происходит раньше — событие Load или оповещение о событии отправки формы (postback)?

В таблице 6-1 показан жизненный цикл элемента управления ASP.NET (это немного модифицированная таблица из Изучая таблицу, не забывайте, что HTTP — это не под держивающий состояния. Введение понятия жизненного цикла должно создать видимость поддержки состояния формы и ее элементов. Изменяя жизненный цикл через события, можно со здать иллюзию состояния благо или во вред — это кому как нравится).

Создание компонентов ASP.NET Таблица 6-1. Жизненный цикл элемента управления ASP.NET Фаза Действия элемента Переопределяемый управления метод или событие Инициализация параметров, Событие необходимых на протяжении жизни Web запроса Определение способа восста- Метод LoadViewState страницы страни state) путем переопределения метода LoadViewState Обработка дан- Обработка данных Метод формы и обновление на сервер (На этом этапе участвуют только обрабатывающие отправлен ные на сервер данные. Чтобы обработать это событие, эле мент должен реа лизовывать интерфейс Загрузка Выполняются общие для всех Событие Load (метод запросов например открытие к данных. При событии Load создаются и инициализируют ся серверные элементы управ восстанавливается состояние, а в элементах управления формы отража ются изменения на стороне клиента Отправка уве- Инициируются события об Метод домлений об из- изменениях в на менении формы нение состояния между сервера щей и отправ ками формы. Как и этап «Обработка данных, отправ ленных на сервер», этот этап имеет место только для эле ментов управления, реали зующих интерфейс (см. стр.) 204 Глава Таблица 6-1. (продолжение) Фаза Действия элемента Переопределяемый управления метод или Обработка со- Обработка события на сторо- Метод отправки не клиента, которое стало формы причиной отправки формы и инициирует соответствующие события на сервере. Как этап «Обработка данных, отправ ленных на этот этап имеет место только для эле ментов реали зующих Подготовка Выполнение всех изменений, Событие к рендерингу которые необходимы для (метод рендеринга элемента управ Рендеринг элемента заклю в модификации HTML-страницы, содержа и отображаемой в браузере клиента. Изменения состоя внесенные на этом этапе, в отличие от изменений, сделанных на этапе рендеринга Сохранение Сохранение текущего Метод состояния тояния элемента управления.

По этого этапа свойство элемента хранится в стро ковом которые от правляется на клиент как скрытое поле HTML-страницы в браузере клиента. Путем переопределения метода SaveViewState элемент управ ления иногда для изменения свойства например для создания более эффективного состояния страницы Создание компонентов Таблица (продолжение) Фаза Действия элемента Переопределяемый управления метод или событие Рендеринг Создание выходных дан- Метод Render которые увидит клиент Ликвидация Выполняет финальную чист- Метод ку. Хотя «уборщик мусора» со самостоятельно освободит память от всех без ссылок, здесь можно выполнить обязатель ное освобождение дорого стоящих например подключений к базе данных Выгрузка Выполняется завершающая Событие Unload очистка перед уничтожением (метод элемента управления. Как правило, разработчики эле ментов предус матривают очистку в методе Dispose и не обрабатывают это событие При создании вам наверняка табли ца Если обнаруживается, что некое действие не ожидаемого эффекта, посмотрите, на каком этапе жизненного цикла компонента оно выполняется. В большинстве не поладка устраняется действия более подходяще му событию.

пользовательских элементов управления Я надеюсь, вы не забыли, как мы создавали Web-формы в гла ве 5, поэтому обсуждение элементов управления мы начнем с изучения похожего процесса создания производного от который мы разместим на тестовой странице.

Пользовательский элемент создают одним из двух способов. Первый и, пожалуй, наиболее состоит в сле дующем: формируется страница с атрибутами и элементами уп равления, которые в пользовательский элемент управления, а затем она преобразуется в пользовательский эле 206 Глава мент управления. Второй способ заключается з программном создании элемента управления, который затем тестируется на другой странице. Я предпочитаю создавать элемент как обычную Web-страницу, которую затем в элемент В любом случае, в результирующем с расширением.ascx, содержит ся либо код, либо атрибут Src со ссылкой на с производным от В ASCX-файле вместо ди рективы @ Page размещается директива @ Control.

Подготовка Web-страницы для преобразования в пользовательский элемент управления Наиболее способ проверки пользовательского элемен та управления заключается в преобразовании Web-страницы в пользовательский элемент управления, особенно это верно для ситуаций, когда от него требуется выполнения некоторых виальных задач. Например, многократного входа в систему на нескольких страницах. Для решения этой задачи я возьму про стую страницу входа в систему из главы 5 и немного ее изменю (листинг Import Security void EventArgs E) !

// Аутентификация эта страница // предоставляет доступ // только пользователю с // и if == { // // false);

' else = "Invalid Credentials: Please try again";

!

Создание компонентов ASP.NET

runat=server />

/> />
208 Глава />
Листинг Форма из листинга 5-1, подготовленная для преобразования в пользовательский элемент Этот листинг от листинга 5 небольшими косметичес кими изменениями: я добавил тэги чтобы ограничить ширину таблицы, и задал цвет фона в соответствии со на которую предполагается разместить элемент управления, а также немного изменил текстовые поля формы. В атрибуте задал размер текстовых а в атрибуте — максимальное число символов в текстовых полях.

Единственное существенное изменение — в функции if == Value == "password"» { // // false);

Создание компонентов Поскольку здесь используется другой метод класса то, чтобы предотвратить переадресацию к стра нице, я получаю и игнорирую URL-адрес переадресации. Это не обходимо, так как обращения к Login Page за з возвращении пользователя со страницы входа G си стему, определенной в файле на запрошенную страницу, а если такой страницы нет, то к файлу default.aspx в том же приложении. Этот пользовательский элемент управления располагается на странице в качестве компонента, который контролирует доступ пользователя к системе, причем что пользователь остается на той же странице.

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

Примечание Вокруг cookie-файлов и возможного вторжения с их помощью в частную жизнь вателей до сих пор ведутся спо ры. Как вы ин хранящийся на клиентской машине. Су ществует два типа кратковремен ные, или сеансовые располагаются в памяти и существуют пока на клиентской машине открыт браузер, и долговременные, или постоянные (persistent), -- эти записываются на жесткий диск клиентской машины. Хороший тон требует спраши вать у пользователя разрешения на запись постоян ных cookie-файлов.

В результате работы создается страни ца, показанная на рис. 6-2.

Глава asp Рис. Вид готовой для преобразования в пользовательский элемент управления Преобразование Web-страницы в элемент управления Создаваемый нами пользовательский элемента управления дол жен располагаться сбоку, где обычно находится панель для пе ремещения по страницам. Страница на рис. 6-2 уже имеет необ ходимый нам вид: это сравнительно узкая пикселов в ши рину) компактная таблица. Чтобы преобразовать Web-страницу в пользовательский элемент управления, выполните последова тельность описанную далее.

1. Удалите со страницы тэги , и 2. Если на странице есть директива @ замените ее дирек тивой @ Control. листинге 6-1 директивы @ Page нет.) 3. Добавьте в директиву @ Control атрибут (Если ди рективы @ Control нет, создайте ее.) Атрибут в пользовательском элементе определяет имя клас са. этого имени обеспечивает строгий контроль ти пов элемента управления при вставке элемента управления на страницу или в другие серверные элементы уп равления.

компонентов 4. Измените расширение с.aspx на.ascx, чтобы отразить назначение файла.

Полностью текст страницы Logm.ascx показан з листинге 6-2.

Control X> Import void sender, E) { // Аутентификация эта страница // предоставляет доступ // только пользователю с именем // и паролем if == == { // // = "Logged In } else { Msg.Text = "Invalid Credentials: Please again";

Создание компонентов

Email:

runat=server />

/> />

/>

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

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

Чтобы протестировать пользовательский элемент управления я создал страницу показанную в листин ге 6-3.

Register X> 3 т Посвящается Тиму и Эрин — я живу благодаря людям, которых люблю. Douglas J. Reiily DESIGNING Microsoft* ASP.NET APPLICATIONS Press Д. Рейли СОЗДАНИЕ ПРИЛОЖЕНИЙ Microsoft* ASP.NET Москва 2002 004.45 Visual Basic is a Label> Листинг 7-6. Файл TestPostLink.aspx, применяемый для тестирования элемента управления PostLink Как видно из листинга 7-5, по окончании загрузки страницы вы зывается обработчик Если переменная возвращает True, надпись меняется в соответствии со значениями переменных _EVENTTARGET и _EVENTARGUMENT.

При щелчке элемента управления PostLink сервер отсылает бра узеру страницу, показанную на рис. 7-3.

Элемент управления PostLink передается браузеру в таком <а Глава is a This is a test flbcalhostfChapterQT test from I - This a test Рис. 7-3. Файл TestPostBack.aspx после щелчка ссылки и изменения сервером ее названия функции гарантиру ет, что браузер получит JavaScript-функцию и что в конечном размещается только одна копия сценария.

В клиентских и другие методы класса Page. В следующем разделе наиболее важный из них — метод Создание расширенных элементов управления на стороне клиента В предыдущем примере работа элемента управления лась не только на клиентском сценарии. А в этом разделе мы рассмотрим элемент управления, для которого клиентский сце нарий не просто одной из его частей, а его су Одна из распространенных проблем, с которой сталкиваются разработчики, — необходимость дублирования суще системы. Например, недавно мне понадобилось со здать запасную систему регистрации пациентов, которая приме няется при остановке работы основной системы для планового обслуживания или при отказе. Пользователи основ Распределение функций между сервером и клиентом ной системы были готовы некоторыми функциями, но отдельные вещи изменить нельзя. Основная система регист рации пациентов пользователям данные в формате (где дд — мм — а гг — год) или После даты ее формат изменялся на а при введенном значении отображалось сообще ние о неверной дате.

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

При создании в которых есть выполняемый на сто роне клиента код, требуется четко работу дизай неров страниц и JavaScript-сценариев. Технология предлагает лучшее решение — в удобном виде необходимые алгоритмы, легко «перетаски вается» из панели прямо на Web-форму.

На рис. 7-4 показан элемент управления который должным образом форматирует дату при выходе из фокуса.

if.

Рис. Элемент управления ReformatDate до и после выхода из фокуса 270 Глава В листинге 7-7 показан полный исходный текст элемента управ ления System;

using using using [assembly:

namespace { /// /// Краткое описание /// public class ReformatDate :

{ private protected override bool { return blsValid;

\ public override public String Text ( get !

return (String) set Распределение между сервером и клиентом = value;

protected void e) { if ( ) ;

IsValid=bIsValid;

if ( { + "SCRIPT Language=JavaScript + + } } protected override void e) :

/// /// Создание текста элемента управления при помощи /// объекта output /// ///

} else I if ( !

return Листинг 7-8. Файл используемый в элементе управления на рис. 7-8, ет быструю проверку правильности даты независимо от того, использовался ли при наборе слэш (/). Для доступа к содержимо му элемента управления я использовал объект Element — он доступен, так как функция FormatDate вызывается как обработчик события.

Если введенное значение не содержит двух наклонных черт, дата расценивается как введенная без слэшей. Если строка содержит шесть или восемь символов, она разбивается на части — день, месяц и год. Чтобы получить численное значение (и облегчить последующее форматирование), я использовал JavaScript-функ цию Интересно, что строку с ведущими нулями она по умолчанию интерпретирует как число в восьмеричной системе исчисления. Таким образом, числом не считается, ведь в восьмеричной нет цифры «9». К у функ ции есть еще параметр, в котором передается основание между сервером и клиентом счисления. Вызов функции в форме возвращает корректное значение. Если удается определить, что строка, без знаков наклонной скорее датой, она форматируется с использованием этих зна ков и значение свойства value элемента Если дата введена неверно, функция открывает на стороне клиента информационное окно с соответствующим сообщением. Все это происходит без участия клиента.

Примечание Насколько важна возможность изме нять JavaScript-файлы? В версии Beta 2 среды содержалась ошибка в К счастью, ошибочный код не был встроен в элементы управ и это позволило Microsoft проинструктиро вать разработчиков, как самостоятельно устранять эту неполадку. В данном примере порядок формати рования даты можно изменить, не корректируя эле мент управления, например задать формат Посмотрите еще раз на листинг 7-7. класс наследует классу в нем необходимо реа лизовать одну функцию Вот как это сделал protected override { return Метод возвращает True, если введено корректное значение, и в противном случае. Метод ServerFormatDate класса практически ту же проверку, что и JavaScript-функция В общем, если браузер поддер JavaScript, некорректная дата никогда не попадет на сер вер, — другими словами серверная функция в ка честве дополнительной линии обороны.

Внимание! Функция не только проверку «последней инстанции», когда клиентский браузер не поддерживает JavaScript, но также не позволяет пользователям вводить и 280 Глава неверные данные. Не забывайте, что нельзя точно как именно данные попа дают на ваш сервер. Поэтому все поступающие от клиента данные следует как ненадеж пока не доказано обратное!

Элемент управления реализует два и Если нужно инфор мировать элемент об обращении клиента к необходимо реализовать В этом се необходимо реализовать два метода и Raise Post Data t:

public virtual postDataKey, values) ( String presentValue = String = try if { Text = postedValue;

return true;

catch ( Exception e ) { return false;

public virtual void < Serve IsValid=bIsValid;

} В метод LoadPostData передается параметр post DataKey. Он используется в качестве ключа для второго парамет ра, в данном примере названного values, — объекта NameValue Collection. С помощью postDataKey можно находить значение текущего элемента управления и получать доступ к нему. В этом функций сервером и клиентом примере я присваиваю свойству возвращаемое свойством если это значение отличается от текущего. Событие в данном примере вы зывает функцию которая пере менную класса — это позволяет элементу управления сигнализировать о некорректности своего значения, то если его содержимое не удается интерпретировать как дату.

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

Метод обработчик события если последний не пуст (то есть не установлен в Null). Text Change — это обработчик события, который я данном классе. Клиентская программа может использовать это событие для выполнения некоторых при изменении текста. Во многих случаях объявление обработчиков событий и их вызов позволяет пользователям вашего элемента управления управлять его поведением.

Заключение Решение о разнесении функций в разные части приложения все гда дается очень и в Web ситуация не намного лучше. В выбор языка для программирования серверной части становится несущественным. Можно использовать Visual Basic или любой другой язык, поддержка которого будет обес печена для платформы Конечно, даже в этом случае необ ходимо понимать и учитывать определенные различия между но в целом можно просто на люби мом языке.

Клиентская часть налагает более жесткие ограничения. На кли енте единственно возможный который боль шинство браузеров, Это неплохой язык, но ли шены выбора, Если к тому же вспомнить об отсутствии возмож ности управления состоянием среды исполнения JavaScript-сце нариев на клиенте, станет понятно, что перенесение на клиент слишком большого числа функций по обработке данных — не самое удачное решение.

282 Глава Тем не менее программирование клиента иногда необходимо. На пример, на перегруженных Интернет-сайтах перенесение началь ной проверки и обработки данных на сторону клиента ускорит пользователя и приложения и снизит нагрузку на сервер. А это уже совсем неплохо.

Самые развитые и сложные приложения Интернета и на работе с изменяющейся информаци получаемой из различных баз данных. В 8 я расскажу немного о создании таких приложений. Для данных в приложениях ASP.NET используется технология Пусть это название не сбивает вас с толку — в действительности это очень «родственник» технологии ADO Data а не прямой ее наследник. Способность создавать не просто хорошие а хорошие приложе которые к тому же отлично масштабируются, в огромной степени основано на умении все новинки Глава Одна из наиболее важных задач любого Web-приложения заклю чается в извлечении и отображении данных. Именно возмож ность создания управляемого данными, динамического инфор наполнения стало одной из причин попу лярности ASP. В традиция простого доступа к данным сохранена и приумножена. Помимо обычных механиз мов доступа к данным в предусмотрена встроенная все объемлющая поддержка XML. И это неудивительно, ведь XML это язык данных в Интернете, a базируется на Framework.

Очень странно то, что доступ к базам данных в Framework сильно от механизмов, к которым привыкли програм мисты, пишущие на ASP и Microsoft Visual Basic 6.0. Технология доступа к базам данных в называется К сожале нию, программистам ASP, привыкшим к ActiveX Data Objects (ADO), должен сообщить, что это не просто немно го модернизированная «классическая» технология ADO, которую они любят и изучили вдоль и поперек. — это совершен но новый подход к работе с данными.

В главе я расскажу об XML и объясню, как его применять в своих программах. Кроме того, мы подробно обсудим некоторые различия между ADO и и вы узнаете, как применять в приложениях ASP.NET.

284 Глава XML как универсальный язык данных В главе 4 я затронул тему рассказывая о конфигурационных файлах и в Если коротко, то XML — это язык и представления данных с помощью простого текста, в последнем он во многом похож на HTML.

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

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

REILLY DOUGLAS NET По виду записи можно частично догадаться, что скрывается за строкой длины. В этом примере видно, что «REILLY DOUGLAS» — это имя и фамилия, а в конце скорее все го указан адрес электронной почты. В записи с разделителями и адрес электронной почты также хорошо видны, но теперь, когда поля четко выделены, можно заметить, что одно из двух полей содержит дату. Конечно, мы не знаем, что эта за дата, но судя по тому, что речь идет о клиенте, а дата 45-летней давности, то, вероятно, это дата его рождения.

Вот другой пример строки с разделителями, но здесь задача иден тификации информации намного сложнее:

Время заняться Как в точности человека — Frank Lee или Lee Frank? Оба варианта И что это за дата — дата рож дения очень молодого клиента или дата первой покупки давнего клиента? Для решения задачи недостаточно данных.

Сравнение существующих решений форматирования данных с подходом на основе XML Отдельные компании и отраслевые консорциумы неоднократно предпринимали попытки создать стандартный язык передачи данных. Мне приходилось работать с форматом HL7 (Health Level который применяется для и передачи данных о пациентах посредством одноранговых Вот простой пример информации о визите пациента в формате HL7:

Р|2. 3 | <сг> 100 PROSPECT <сг> | | | |HED| |NOF| | | | Для сути не нужно знать все подробности визита.

Первая строка (MSH) — это заголовок Здесь же объявляются разделители, применяемые на различных уровнях сообщения. Следующая строка (EVN) содержит часть сообщения и информирует о событии. В обеих строках идет о визите пациента (об этом говорит код А01 в обеих В третьей строке содержится информация о пациенте. (Для удобства PID разнесена на несколько строк, но на самом деле это одна строка, заканчивающаяся переводом каретки.) Здесь такой текст: L /. Вертикальная черта (|) разделитель наивысшего уровня, а «крышечка» использует ся внутри отдельных сегментов. Так как уже известно, что это запись о визите пациента, можно предполо жить, что это имя пациента. На строке указыва ется имя родственника — Amy. Последняя строка (PV1) содержит относящуюся к данному конкрет ному визиту. Все сегменты любых (а они иногда со стоят из сотен строк) тщательно задокументированы, 286 Глава больницы страны успешно используют стандарт HL7 переда чи информации между системами.

Вот та же информация о приеме пациента в формате XML:

123456789 123456789 123456789 123456789 A В предыдущем сообщении формата HL7 почти зачем нужны но в XML-представлении той же ции абсолютно очевиден. Говорят, что XML является самоописы вающим форматом. Конечно, придется приложить определенные усилия на создание программы разбора, но даже через 20 лет, посмотрев на этот файл, вы сможете безошибочно определить что к чему.

Идеален ли XML?

Как известно, бесплатным сыр бывает только в мышеловке, за удобство XML приходится платить увеличением нагрузки на систему. В примере формата HL7 информация о визите пациен та занимает около 64 байт (1 байт на символ), а в формате на это требуется 308 байт. В реальных приложениях разница в размере не так уж важна. На то ряд причин.

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

При нынешнем состоянии технологий разумно сжимать XML-дан ные при передаче по линиям с ограниченной пропускной способ ностью или при хранении.

заняться данными! Как вы увидите в главе XML также основой XML Web сервисов. Используемый в качестве представления инфор XML позволяет поддерживающим XML приложениям, на писанным на разных и работающим на разных платфор мах, успешно взаимодействовать друг с другом. XML критически важен для обработки данных в вообще и в XML Web-серви сах в частности, поэтому вы не ошибетесь, предположив, что в Framework имеются мощные механизмы поддержки этого языка.

Интерфейс Приступая к изучению поддержки различных типов обработки данных в важно прежде всего познакомиться с особенностями их реализации. Как вы в дальнейшем увидите, в Framework доступна масса Все варианты доступа независимо от того, расположены ли данные в массиве, в базе данных SQL Server или в имеют одну общую чер ту доступ осуществляется через интерфейс Как вы помните, интерфейс — это определение набора методов и свойств, которые может поддерживать класс. В множе ственное наследование запрещено, однако в среде несколько интерфейсов. lEnumerator — это простой интерфейс, содержащий одно свойство и два мето да;

они перечислены в таблице Таблица 8-1. Элементы-члены интерфейса Элемент Описание Current Извлекает текущий элемент набора Метод Перемещает перечислитель к следующему элементу набора Метод Reset перечислитель на начальную пози цию, перец первым элементом набора Реализация этого относительно простого позволяет объекту создавать привязку к другим объектам, которые ожида ют наличия интерфейса lEnumerator. В Basic 6.0 поддержи валась привязка поля со списком или списка с набором записей базы данных. В можно создавать привязку ука 288 Глава элементов с чем угодно — от массива до XML потока.

Для обеспечения доступа к перечислителю (numerator) и поддер жки структуры For Each необходимо реализовать у которого только один метод (таблица 8-2).

Таблица 8-2. интерфейса Элемент интерфейса Описание Метод Возвращает В листинге 8-1 показана программная логика страницы. В дополнение к обычному относящемуся к странице классу здесь есть еще один класс с именем merator. Он реализует оба интерфейса - - и merable.

Using System;

using using using using using using using using using namespace { public class :

private int what;

private int public { } // Метод public lEnumerator < return this;

Время заняться данными! // Свойства и методы public object Current get return public if ( return true;

else { return false;

I public void fleset() id /// Сводное описание WebForml.

/// public class WebForml :

protected ListBoxl;

public += new private void e) // Установить источник данных на новый экземпляр private void Page_Init(object sender, EventArgs e) 290 Глава // Этот необходим для // Web Form Designer.

// Web Form Designer generated code /// /// Этот для Designer, /// Не изменяйте его редактора кода.

/// private void } fiendregion Листинг 8-1. страницы, демонстрирующей использование интерфейса lEnumerator Класс в листинге представляет простой который возвращает строки с номерами из диа пазона 1 Две закрытых (private) переменных ра класса. Переменная what содержит a максимальное значение.

В свойстве Current части интерфейса lEnumerator используется упаковки и вызывается метод переменной what. Метод MoveNext интерфейса уве личивает значение если только оно не больше или равно MoveNext возвращает значение типа указываю щее на наличие или отсутствие следующего значения. Последний элемент интерфейса Reset, который в этом примере устанавливает переменную what в нуль. Реализация проста. Метод просто возвращает this (в Visual Basic это потому что оба интерфейса и lEnumerator — реализует один Класс программной логики самой страницы похож на примеры в предыдущих главах — различие лишь в методе На Время заняться данными!

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

private void sender, { // Установить источник данных // на следующий экземпляр MyEnumerator ListBoxl.

Сначала я установил свойство в новый экземпляр MyEnumerator. Это возможно, потому что MyEnumerator реализует Кроме разрешается передавать кото рый реализует заполняет текстовое поле значениями из источника данных Рис. Текстовое поле, которое класс MyEnumerator заполняет значениями из источника данных Это пример самого простого использования мощи интерфейсов и На практике задача решается посред ством цикла, который заполняет список элементами. Можно так же заполнить массив и создать к нему в методе следующим образом:

292 Глава private void sender, e) { Collections.

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

Основные об ADO.NET V ASP-программистов возможность совершить переход от ASP к сравнительно безболезненно — можно игнориро вать и продолжать работать, как это делали в ASP. Так вы откажетесь от многих преимуществ но если требуется на новую технологию с минимальными издержками, придется познакомиться с изменениями в Visual Basic Переход от ADO к ADO.NET отличается от перехода от ASP к Хотя в ADO.NET присутствует большинство функцио нальных ADO, но на самом деле это принципиаль но новая технология. Чтобы использовать ADO.NET, необходи мо изучить нескольких новых пространств имен, а также несколь ко возможностей (их немного), которые доступны ADO, но не возможны ADO.NET. К счастью, большинству разработчиков (фактически это все они не нужны. По этому для начала я познакомлю вас с ADO.

Краткий экскурс в ADO ADO состоит из трех Connection, Command и Recordset. Первый применяется для создания канала связи меж ду программой и источником данных. Он позволяет устанавли вать строку подключения, управлять транзакциями и устанавли вать тип курсора. ADO поддерживает серверные и клиентские Время заняться данными! а также управление многими другими сора, предназначенными для управления видимостью и т. п.

Command применяется для выполнения запросов про извольных SQL-строк или хранимых процедур. Он поддержива ет параметры, что облегчает поддержку передачи значении, ко торые трудно передавать в обычной строке SQL-кода. Например, на такую строку:

SELECT * FROM Titles Up Она не выполнится, как ожидается, так как второй апостроф ин терпретируется как конец строки, а оставшаяся часть строки от как несоответствующая синтаксису. Параметры объекта Command позволяют успешно подобные строки.

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

Основной недостаток ADO сложность выполнения операций выбора нужного места курсора, его типа и других Например, как узнать какой курсор исполь зовать — клиентский или серверный? Какой тип блокировки тре буется? Должны ли другие пользователи видеть изменения з наборе до того, как вы зафиксируете изменения? Хотя ADO — достаточно гибкая технология, большинству пользовате лей, особенно в ASP, достаточно сложно ее освоить и научится применять правильно.

Различия ADO и ADO.NET Посмотрев, что может предложить ADO.NET, программисты, привыкшие к ADO, неизменно восклицают: «Но там слишком много И это верно. Посмотрев на пространство имен в вы увидите, что оно битком наби то классами и перечислениями. Сложность что классы раз биты на три различные группы. Одна предназначена для ODBC источников данных, вторая — для OLE DB, а третья ориентиро вана на Microsoft SQL Server. Классы этих групп похожи, но не идентичны. На рис. 8-2 показана структура классов в ADO.NET.

294 Глава Примечание На момент этих строк что ODBC-классы станут доступными как дополнение к Framework. До сих пор неяс должны ли поставляться как приложение или как часть Framework. Загрузить дан ных ODBC можно со страницы com/do ads/.

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

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

System. Data DataSet System.

OdbcDataAdapter OleDbDataAdapter Data Adapter OdbcDataReader OleDbDataReader Рис. Иерархия классов ADO.NET Время данными! Например, одна из стандартных задач заклю чается в отображении запроса. В подавляющем боль шинстве Web-приложений никаких записей изменять не требу ется. Для таких случаев замечательно подходит Объект играет роль посредника между DataSet и источником данных в и сохране ния данных. Метод Fill объекта SqIDataAdapter в источниках на базе SQL Server) заполняет объект нуж ными данными из источника. Метод Update изменяет данные в источнике в соответствии с изменениями в Природа приложений не подходит к этой модели. Напри мер, данные часто отображаются при первом посещении стра ницы, а изменения реализуются при отправке формы. В таких обстоятельствах применение одного объекта как для так и загрузки данных в источник данных дает не слишком много преимуществ.

Самое большая сложность в ADO — ограничения при примене нии СОМ. А наиболее значительное из них — небольшое число поддерживаемых типов данных. Если в наборе записей ADO не обходимо разместить объект, его нужно каким-то образом мар как один из типов данных СОМ. В в каче стве средства передачи данных применяется XML, поэтому в этой технологии можно воспользоваться способностью самоописания з XML. Кроме того, и это важно для разработчиков корпоратив ных приложений, транспортировка наборов записей ADO через брандмауэры так как брандмауэров сконфигурированы так, что предотвращают В NET результаты без проблем проходят через брандмауэ ры ведь это текстовый протокол, для которого достаточно обычных открытых портов.

Многих из вас наверняка заинтересует, какое место объект бор записей» (recordset) занимает в В ADO набор за — это универсальный нож» раз работчика базы данных. Нужно получить Пользуйтесь recordset. записи? recordset. запи си? Пользуйтесь recordset. Ну, вы поняли — наборы записей нуж ны во всех этих ситуациях.

296 Глава DataSet в — самый аналог набора за писей в ADO. добавлять записи.

Этот также отслеживает состояние в том числе изменение или удаление. В отличие от где при навигации в пределах набора изменения записи фиксируют ся, как только курсор «уходит» с нее, в DataSet позволяет выполнять изменения по мере необходимости (причем на все время подключение к источнику данных отсут ствует) и лишь в конце зафиксировать их.

модель доступа к данным «в отключенном состоянии» очень хорошо работает в мире Забудьте на минутку все свои навыки работы с наборами ADO и познакомьтесь с методами получения данных в NET. определенные различия, но зато позволяет значительно повысить производительность и масштабируемость приложения.

Использование ADO.NET в ASP.NET Многие из наиболее захватывающих достижений в использова нии данных в ASP.NET связаны с введением дополнительных серверных элементов которые можно применять в Web-формах. Я расскажу о них в главе 9, а сейчас покажу, как под ключаться к источнику данных, извлекать, вставлять и обновлять данные, используя как SQL-операторы, так и хранимые процедуры, Выборка данных В листинге 8-2 показан Be пример выборки дан ных из базы данных Northwind на SQL Server. Оператор выборки так:

SELECT FROM Customers WHERE После выборки данных они отображаются на странице в HTML таблице.

Imports Imports Public Class Inherits Public dr As Время заняться данными! Web Designer Generated Code необходим Designer.

Private Sub End Sub Private Sub Page_Init(ByVal sender As e As Handles Этот вызов необходим для Web Designer его средствами редактора кода.

End Sub tfEnd Private Sub sender As ByVal e As Handles пользовательский код инициализации Dim As Dim As = New 01eDbConnection( _ + "Integrated cmd = New "SELECT + _ Customers WHERE dr = End Sub Private Sub sender As ByVal e As Handles End Sub End Class 8-2. SimpleSelect.aspx.vb, который применяется для отображения результатов простого запроса 298 Глава Примечание В этом и некоторых других примерах этой главы строка подключения размещена в Code В строках подключения применяется интегрированный механизм безопасности Windows (Integrated поэтому имя пользовате ля и пароль не указываются. Пользователю, в контексте будет выполняться страница, придется предоставить праза доступа к базе данных. В качестве пользователя может выступать конечный пользова тель, если применяется олицетворение, или пользо ватель Internet Information Services Другая альтернатива заключается в ис пользовании раздела о котором я рассказывал в главе 4.

В листинге 8-3 показана страница, которая отображается в ре зультате запроса выборки. Значения полей Company Name и ContactName отображаются в простой HTML-таблице.

Раде 3 т Посвящается Тиму и Эрин — я живу благодаря людям, которых люблю. Douglas J. Reiily DESIGNING Microsoft* ASP.NET APPLICATIONS Press Д. Рейли СОЗДАНИЕ ПРИЛОЖЕНИЙ Microsoft* ASP.NET Москва 2002 004.45 Visual

Data Example Время заняться данными!

while end while
Company Name Contact/Owner
Листинг 8-3. Страница SimpleSelect.aspx, отображающая данные, полученные в результате работы объекта OleDbDataReader в файле SimpIeSelect.aspx.vb 8-2) Примечание В листинге 8-3 каждая запись разме в отдельной строке таблицы. В это не так. Подробнее о более совершенных способах отображения данных в я расскажу в гла ве 9.

Глава На 8-3 показана страница, созданная в результате выполне ния кода, который показан в листинге 8-3 и в из листинга 8-2.

Data Example Name у helados Ana АНТОН Antonio Moreno Moreno BONAP Bon CHOPS Wang I Manuel Stop Shop UNOD Рис. Результаты, возвращенные при выполнении показанного в листингах 8-2 и 8- Большая часть работы по получению данных выполняется в ме тоде 8-2). Используя локальные объекты и а также открытый я выполняю простой запрос данных в базе данных на SQL Server. Этот пример написан на Visual Basic но те же объекты Framework используются и в других языках, поддерживаемых Совет В ранних версиях Framework применя лось отдельное пространство имен для классов, под держивающих работу с базами данных, отличными от SQL Server. Примеры из других книг или тов, в которых применяется не станут работать в финальной версии Framework.

Процесс доступа к данным в не сильно отличается от того, к чему вы привыкли в ADO. Сначала создается объект OleDbConnection. (Обратите внимание, что в отличие от ADO, в VBScript, для присвоения нового Время заняться данными! экземпляра не используется оператор Sef.) После создания объек та я передаю з конструктор SQL-строку. Она попозже. Я устанавливаю объек та OleDbCommand в объект который создает ся несколькими строками ранее, наконец, создаю объект OleDbDataReader, вызывая метод объекта OleDb Command следующим образом:

= Параметр, передаваемый в — это одно из пяти значений перечисления которые можно ком бинировать побитово. Они перечислены в таблице 8-3.

Таблица 8-3. Значения перечисления CommandBehavior Значение Описание При команды объект подключение закрывается, если закрыт объект Data Reader Запрос возвращает информацию о столбце и ном ключе. Запрос без блокировки ка бы то ни было из выбранных строк. Когда исполь зуется провайдер SQL Server, он добавляет в оператор выражение FOR BROWSE Запрос возвращает только схему Результаты на уровне столбцов как поток, что позволяет приложению читать большие двоичные значения, применяя методы Запрос возвращает лишь один результат Ожидается, что запрос возвратит одну строку. Некото рые провайдеры данных используют эту цию для оптимизации запроса. Обратите что во многих случаях использование хра нимой процедуры с выходными параметрами оказыва ется более производительным, если речь идет о запро возвращающих лишь одно значение В этой ситуации альным аргументом для передачи, так как объект создан с применением локального аргумента. При ве закрытие dr вызовет закрытие подключения, ко торое этот объект использовал. Есть и другие способы избавить 302 Глава ся от написания кода закрытия подключения, например превра тить объект в открытую переменную класса. В других ситуациях, например, когда метод класса класса длл подключения следует от править в метод Вот пример. Допустим, у нас есть объект метод щает класса DataReader. To, что метод Execute Reader с означает, что под ключение, выделенное и открытое в будет закры то при закрытии DataReader. При этом у вас нет доступа к подключению, созданному объектом GetCustomer.

Создание запросов на изменение Операции обновления и удаления в SQL иногда вают запросами на изменение faction query), то они выпол няют определенные а не простую выборку данных. В их еще называют Код такого запроса похож на код обычной выборки (листинг В листинге 8-4 показано содержимое SimpleExecuteNonQuery.aspx.vb, в котором создается простая форма содержащая три кнопки: Insert, Update и Delete.

Imports Imports Public Class Inherits Page Protected Insert As Button Protected WithEvents Update As Button Protected WithEvents As Button Protected WithEvents As ttRegion Web Form Designer Generated Code вызов необходим для Web Form Designer, Private Sub Время заняться данными! End Sub Private Sub Page_Init(ByVal sender As e As Handles 'CODEGEN: Этот вызов необходим Web Form Designer его средствами редактора кода.

End Sub tfEnd Region Private Sub sender As ByVal e As Handles пользовательский код инициализации страницы End Sub Private Sub Ins6rt_Click(ByVal sender As ByVal e As Handles As Dim cmd As = New + "Data + "Initial cmd = New INTO + = Try Catch dbe As = "Exception while Inserting Record! + End Try End Sub Private Sub sender As ByVal e As Handles Dim As Dim cmd As = New + _ "Data + "Initial 304 Глава = New Territories + _ + _ WHERE = Try Catch As = "Exception while Record! + End End Sub Private Sub sender As e As Handles Dim As Dim cmd As = New + _ "Data + _ "Initial cmd = New "DELETE FROM Territories + " WHERE = Try Catch dbe As = "Exception while Deleting Record! + dbe.ToStringO End Try End Sub End Class Листинг 8-4. Файл реализующий команды обновления и удаления Обработчики событий трех кнопок практически идентич ны, а различия — в SQL-коде, передаваемом конструктору та OleDbCommand. Запрос вставлен в блок обработки Try Catch dbe As Labell.Text = "Exception while Inserting Record! + Время заняться данными!

End ошибка, возникающая при данных, — по пытка создать дублирующую запись. В этом примере, если щел кнуть кнопку Insert не нажав после первого щелчка кнопку Delete, вы получите сообщение об ошибке. Вместо стан дартного сообщения о необработанном исключении вы увидите показанную на рис. 8-4.

I of at lion, at Data Data OlcDb at e) Рис. Информация об исключении, отображенная на странице при попытке вставить уже существующую запись В большинстве приложений достаточно отображать часть этой информации. Это осуществимо, так как у объекта O/eDb много различных предоставляющих доступ к самым разным элементам информации об ошибках.

Совет Один способов улучшить расположе ние отображаемых данных об ошибках заключает в замене символов возврата каретки (которые интерпретируются как свободное пространство на HTML-странице) тэгами
. Замена этой строки:

dbe.ToStringO И 306 Глава позволит улучшить внешний вид Использование хранимых процедур реляционных баз данных поддерживают хранимые процедуры. Хранимые процедуры блоки SQL-кода, вызов которых во многом похож на вызов функций в обычных проце дурных языках. Хранимые процедуры разбираются и проверяют в момент сохранения, кроме того, план запроса в хранимой процедуре также рассчитывается только раз. Только этих двух достаточно, чтобы оправдать их Помимо этого можно создать хранимые процедуры для преоб результатов в удобный формат. Обычно, если требу ется получить одну запись, создают запрос, возвращающий ее в набора. Однако вы вправе также создать хранимую проце дуру, которая возвращает требуемые поля как выходные пара метры. Выборка набора даже с записью довольно ресурсоемка, так как в этом случае возвращаются не только сами но и данные о данных (или Использование выходных параметров позволяет значительно повысить производительность.

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

Манипуляции с данными, требующие выполнения многих SQL операторов, хранимая процедура обычно выполняет намного эффективнее. В ситуации, когда пришлось бы извлекать большой массив данных на клиентскую машину и выполнять фильтрацию уже на ней, лучше воспользоваться хранимой процедурой. Я пре красно знаком с «непроцедурной» версией языка Transact SQL в Microsoft SQL Server. Тем не менее в нем многие конструк ции, такие, как IF и WHILE, которые так нравятся «процедурным» программистам. Однако мощь хранимых процедур базируется на применении в них ориентированного на наборы непроцедурно го языка SQL.

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

Совет Другой способ решения указанной задачи заключается в создании представления (view) ра SQL Server с «разрешенными» столбцами табли цы. Пользователям запрещается доступ к основной таблице, а все права управляются через представ ление.

Выполнение хранимых процедур в похоже на выпол нение обычных SQL-операторов. В подавляющем большинстве случаев в хранимую процедуру передаются параметры. Хранимая процедура, не принимающая никаких параметров, мало полезна, не менее в приведенном далее примере я применяю имен но ее.

В следующем примере SimpleSPSelect простая хра нимая процедура по имени «Ten Most Expensive Products» («Деся ток самых дорогих товаров»), которая не принимает никаких па раметров и возвращает набор Записи считываются в объект и затем отображаются точно так, как в запро се на выборку SimpleSelect.aspx.vb (листинг Текст Simple SPSelect.aspx показан D листинге 8-5, а соответствующий Code — в листинге 8-6.

Page Visual Studio 308 Глава

Unit Price
Метод GetString с порядковым числом (нумерация которого на чинается с нуля и который относительный номер столбца в наборе результатов) встречали и раньше, Вторая ячейка таблицы содержит Здесь выполняется следующее: первый столбец дан ных столбец таблицы) в виде десятичного числа и пре образовывается з строку с помощью метода з который передается строка с информацией о требуемом формате. В дан ном случае «С» означает, что значение следует представлять в денежном формате.

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

private void !

new // строка добавлена мной += new В строке есть оператор + =, он определяет ме тод как обработчик события Unload в этой форме.

Чтобы в Visual Basic метод использовался для обработки какого-нибудь события в жизненном цикле страницы, к опреде лению метода добавляется строка в следующем синтаксисе Handles Это одно из множества различий между и Visual Basic Время заняться данными! Примеры хранимых процедур в базе данных Northwind недоста точно демонстрируют вставку, обновление и удаление строк, поэтому я создал пару собственных хранимых процедур.

называется spSaveTerritory, а Сценарий их создания показан в 8-7.

USE Northwind SET OFF GO SET OFF GO CREATE PROCEDURE spDeleteTerritory AS SET NOCOUNT ON DELETE Territories WHERE GO SET OFF GO SET ON GO SET OFF GO SET OFF GO CREATE PROCEDURE SpSaveTerritory int AS SET NOCOUNT ON DECLARE SELECT FROM Territories WHERE IF - Then, INSERT BEGIN INSERT INTO return(1) END ELSE BEGIN UPDATE Territories SET END GO SET OFF GO SET ON GO 8-7. Хранимые процедуры, выполняющие вставку и удаление региона из базы данных Обе хранимые процедуры просты для понимания, поэтому л не буду подробно на останавливаться. Хранимая процедура вставляет или обновляет регион, используя поле для определения того, нет ли уже этого региона в базе данных.

При вызове из указанных хранимых процедур необходи мо задать параметры. V «параметр» есть ряд наиболее из которых перечислены в таблице 8-4.

Таблица 8-4. Свойства объекта Parameter Свойство Описание Tun параметра, провайдером ных Direction Один из перечислимых типов. Допустимые значе ния: умолчанию), Output, и ReturnValue. В хранимой процедуре одно значение ReturnValue, а на SQL Server всегда относится к типу Обратите что в отли чие от ADO, требование по умолчанию (и, насколь ко знаю, единственное) заключается в том, что имена параметров должны точно соответствовать имени параметра в SQL-коде или процедуре Время заняться Таблица 8-4. (продолжение) Свойство Описание Size Размер в байтах данных, в пара метре. Если опущено, строки слиш ком большого размера урезаются до разрешенно го максимума. Если Size определено и размер строки превышает генери руется исключение Tun SQL. Свойство связанно с DbType. При изме нении одного и другое. В об щем случае достаточно определить только одно свойство из двух Value Получает или устанавливает значение параметра.

В параметрах Input или очень важно установить свойство go выполнения команды В листинге 8-8 показан файл логики SimpleSPAc tionQueries.aspx.cs. В нем подготавливаются корректные парамет ры для вызова хранимых процедур и spDelete using System;

using using using using using using using using namespace { /// /// Сводное описание /// public class WebForml :

( protected Save;

protected protected public 316 Глава += new private void sender, e) { // здесь код // инициализации страницы I private void sender, EventArgs e) // Этот необходим для // Web Designer.

// ffregion Web Designer generated code /// /// Метод необходим для поддержки Designer /// Не изменяйте содержимое этого метода /// средствами редактора кода.

/// private void InitializeComponentO I += new += new new I tfendregion private void Save Click(object sender, e) { prm;

cn=new + 3);

Время заняться данными!

try ExecuteNonQueryO;

+ catch ( sqle ) finally void Delete_Click(object sender, e) i cmd;

cn=new + "Integrated try catch ( sqle ) I finally I Глава Листинг 8-8.

демонстрирующий вызов хранимой процедуры с Метод вызывает хранимую процедуру а метод — хранимую процедуру Обе процедуры требуют передачи но мы подробно обсудим только метод Save_Click.

Как и в предыдущих примерах, прежде всего создает и ', а затем — параметры.

Есть несколько способов создания параметров.

шесть перегрузок груктора Некоторые особен ности отдельных можно узнать с помощью средства IntelliSense в Visual Studio или в документации no Framework. Каждая перегрузка конструктора требует определен ный набор параметров. Кроме того, что при создании параметра можно задать дополнительные его Напри мер, чтобы создать параметр для обработки значения, возвраща емого хранимой процедурой, я написал следующий код:

Как это обычно случается, нет удобного конструктора, который без проблем позволил бы определить имя параметра Value, его фактическое значение 3 и направление Direction. ReturnValue. Я взял наиболее подходящий конструктор и установил Direction, так как принятое по умолчанию значение не подходило. Обратите внимание, что я не определяю тип данных ни в этом, ни в остальных примерах главы. По скольку Framework определяет тип передаваемого значения, его не обязательно явно. Завершив создание парамет ра, я вызываю метод Add no отношению к набору Parameters объекта Остальные параметры в следующем фрагменте;

Время заняться данными! В рассмотренном ранее конструкторе параметр добавлялся в набор Parameters. Здесь же я ваю метод Add набора Parameters с именами и значениями трех параметров.

Примечание Помните, что в отличие от ADO, в имя параметра должно в точности соот ветствовать имени хранимой процедуры. В храни мых процедурах SQL Server также обязательно сле дует указывать начальный символ в имени пе ременных. По определению в ADO имена парамет ров не важны. добавления параметров в набор Parameters определял ссылки между ми-параметрами, а имя параметра применялось только для получения выходных параметров.

Завершив установку параметров, я вызываю no отношению к После успешного выполне ния я получаю код возврата:

+ Я получаю нужный указывая имя члена набора Para meters. в виду, что синтаксис неверен:

Эта команда возвратит литерал а не значение (когда запись вставлена) или 0 (когда запись изменена). Во мно гих областях Framework использование Value позволяет воз вратить нужное значение, а не некоторое представление имени объекта.

Раздел finally структуры обработки применяется гарантированного закрытия подключения. В группе try/catch/finally код блока выполняется полностью или до точки, где ини циируется исключение. Блок catch выполняется, если сгенериро вано исключение корректного (как определено в предикате блока catch). И, наконец, блок finally выполняется что де лает его прекрасным местом для освобождения таких ценных ресурсов, как подключения к базе данных.

320 Глава Классы и В примерах в начале главы для доступа к данным использо набор классов в пространства имен OleDb, а в демонстрирующих использование хранимых процедур, — клас сы имен SqlClient. В чем же разница? Во многом.

Классы OleDb более универсальны. Они получить до ступ к любому OLE DB источнику в том числе к Microsoft SQL Server. Они обеспечивают приемлемую производительность. Трудно определить по отдельности вклад в повышение самой базы данных и улучшений в no сравнению с ASP.

Классы SqlClient, как правило, дублируют классы но ис пользуются в Microsoft SQL Server. В классе «родной» формат передачи информа ции с сервера SQL Server, в котором данные считываются непос редственно с подключения базы данных. Я не сравни тельных на быстродействие этих но по моему субъективному мнению, в большинстве случаев классы SqlClient работают Так, как же выбирать семейство классов для своего приложения?

Прежде всего, если з качестве предполагается использо вать только Microsoft, SQL Server версии 7.0 или выше, то выбор прост — классы SqlClient. Обращаясь к данным, они пользуются сокращенными путями и поэтому практически всегда работают быстрее классов Если же иногда предполагается работать с базой данных Oracle или Jet (Microsoft Access), нужно использовать классы no крайней мере для любых источников данных, отличных от Mic rosoft SQL Server. Хотя логично было бы ожидать, что классы OleDb позволяют получить доступ к любому поддерживающему OLE DB источнику данных, но это не так. В частности, классы OleDb не поддерживают доступ через провайдера OLE DB no протоколу ODBC Database Однако есть от дельный провайдер ODBC (он упомянут ранее в этой гла зе), который на момент написания этих строк проходил проце дуру раннего бета-тестирования.

Время данными! Как насчет упаковочного класса?

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

Есть несколько проблем, с которыми следует при решении этой задачи. Прежде Framework не под держивает множественное наследование. Такая же по важ ности трудность том, что и и SqICIient герметичные (sealed) то есть им нельзя наследовать.

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

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

Преобразование данных в XML-текст Одна из Framework заключается в расширении на бора данных еще одним — XML-классами. В листин ге 8-9 показан код, на основании резуль татов запроса к базе данных. Здесь выполняется выборка таблицы Territories из базы данных Northwind, после чего данные выгружаются в формате XML в файл Territories.xml.

using System;

using using using using using using using 322 Глава using using using using namespace { /// /// Сводное описание WebForml.

/// public class WebForml :

I public string public new private void sender, e) // здесь пользовательский код инициализации // страницы da;

ds;

sr;

+ "Integrated * FROM { ds = new fs = new FileStream( I catch ( ) • Время заняться данными! } { } } private void sender, e) // Этот необходим для // Web Designer.

// InitializeComponentO;

Web Designer generated code /// /// Этот метод необходим для поддержки Designer /// не изменяйте содержимое этого метода /// средствами редактора исходного текста, /// private void InitializeComponentO { += new \ } I Листинг 8-9. Файл выполняющий преобразование данных таблицы Territories базы данных в формат XML Практически работу на этой странице метод Объект SqIDataSet метод ко торый возвращает строку набора данных, преобразованную в формат Для создания объекта SqIDataSet я использую класс который выполняет посредника между ба зой данных Server и Метод Fill объекта SqlData «заселяет» SqIDataSet данными.

К готовому применяю метод GetXml и сохраняю воз значение в переменной Обратите внимание, что я указал в группе операторов using пространство 324 Глава имен В приложениях это имен обычно не используется, однако оно необходимо для записи фай лоз. Класс FileStream доступ к файлам. После со здания объекта для XML-файла я создаю и передаю ему объект Если вы посмот рите на иерархию классов, вам захочется использовать класс но этого сделать нельзя, так как класс, то есть объект этого класса создать невозможно.

Я метод Write передавая XML-стро ку. По завершении работы Write я закрываю объект StreamWriter.

Наконец, подключение к базе данных закрывается в блоке Если не указать путь, программа запишет XML-файл по относительному пути, используя в качестве исходного катало га System32. Это немного неожиданно, но становится если вспомнить, что рабочий каталог процесса System На рис. 8-6 показан XML-файл Territories, в Internet Explorer.

j Рис. Таблица Territories базы данных сохраненная в виде XML-файла в результате работы SimpIeXML.FileSave.aspx.cs Время заняться данными! Способность читать и записывать XML-данные с использовани ем классов Framework открывает мир доступа к дан ным. В Framework есть определенные ограничения поддер жки различных баз данных — отчасти из-за более поддержки ODBC, а также из-за того, что очень немного ODBC источников данных протестированы с данных ODBC XML быстро завоевывает популярность в качестве данных, поэтому даже если не удастся получить доступ к какому-нибудь источнику данных через вполне вероятно, что пересылка входящих и исходящих данных в Framework с применением XML позволит приложению вза практически с любой базой данных.

Заключение Доступ к данным в — это большой шаг вперед по срав нению с ASP. Модель лучше продумана, и хотя она бо лее сложна, но создает прекрасную среду для разработчиков Web-приложений. Классы быстрый, масштабируемый доступ к данным и годятся для решения прак тически любых задач доступа к данным в Web, Кроме по мере необходимости можно применять более узкоспециализиро ванные и богатые на функции, но менее масштабируемые клас сы. На первых порах некоторым разработчикам придется неслад ко из-за отсутствия библиотеки курсоров. Однако в действительно сти большинство разработчиков никогда в деталях и не понимали значения местоположения курсора и часто делали неоптимальный выбор. Эта глава экскурс то, как использовать в — огромнейшая область, и этой теме, конечно же, посвятят не одну книгу.

Из главы 9 вы узнаете, как в доступ к данным из Web-форм. В появился эле ментов управления, которые такую легкость ото данных, о которой вы даже и не мечтали.

Глава Если бы единственными отличиями в работе в были изменения в на разработчиков ASP они вряд ли произвели большое впечатление. К счастью, в суще ственно модифицированы процессы обработки отображаемых в данных. Формы в поддерживают до полнительные функции по созданию односторонней привязки с данными в режиме «только чтения».

Как и большинство замечательных новых средств в основой улучшений в с данными серверные эле менты управления. средством, своего рода «швейцарским армейским ножом», в Microsoft Visual Basic 6. можно считать элемент управления grid. Он отображает дан ные в форме и похож на электронную таблицу. Хоро шо это или плохо, но grid стал многих пользователь ских интерфейсов, создаваемых в Microsoft Basic 6.0. Такая возможность в вас не разочарует — элемент data grid позволяет воспользоваться всеми преимуществами к данным в Обеспечивая практически все функции стандартной связанной с данными таблицы, data grid в больше похож на Web-интерфейс. Это менее удобно для пользователя, но позволяет более эффективно использовать про пускную способность что особенно важно в Web-приложе ниях.

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

Они позволяют создавать лишь шаблон пользовательского ин Данные и формы терфейса, а по набору записей «поручить» каркасу. Прежде чем приступить к описанию улучшений в давайте-ка посмотрим, как выполнялся доступ к данным в ASP.

Доступ к данным с применением вы обратили внимание, что в ASP определен ный способ работы с данными. Он похож на используемый в примерах главы 8 — сначала создается набор записей, а затем в ASP-файле пишут похожий на этот:

while <> True

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

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