Стан застосування Application
Наконец, последним способом сохранения состояния является состояние приложения Application. От предыдущих способов сохранения состояния его отличает то, что Application содержит глобальную информацию, доступную всем пользователям одновременно в рамках всех страниц веб-приложения. Это означает, что при сохранении информации в объект Application одним пользователем, другой пользователь, обратившись к приложению, также может получить доступ к этой информации. Обычно за сохранение состояния приложения отвечает объект приложения HttpApplication, доступный по имени Application.
Работа с объектом Application осуществляется аналогичным образом, как и два предыдущих способа. Объект Application – это коллекция "ключ-значение". Для работы с этим объектом может использоваться следующий код.
Таким образом, видно, что платформа ASP.NET обладает богатыми возможностями по сохранению состояния между HTTP-запросами.
Сложность разработки веб-приложений состоит в том, что взаимодействие по протоколу HTTP не предполагает сохранения состояния между обращениями. Однако, это бывает очень необходимо в большом числе ситуаций. Для этого в ASP.NET существует ряд инструментов для сохранения состояния. Состояние вида ViewState позволяет сохранять состояние между обращениями клиента к одной и той же странице. Состояние сеанса Session позволяет сохранять состояние для конкретного пользователя для всего веб-приложения. Наконец, состояние приложения Application позволяет сохранять глобальное состояние, доступное каждому пользователю в рамках приложения. Все эти способы доступны для работы через коллекции в стиле "ключ-значение" и очень просты в использовании
5 Технологія ADO.Net.
Деятельность большинства Web-приложений сосредоточена на извлечении, отображении и модификации данных. Эти задачи кажутся достаточно прямолинейными, но за последнее десятилетие способы использования данных постоянно менялись. Разработчики перешли от простых клиентских приложений с локальными базами данных к распределительным системам, основанным на централизованных базах данных и выделенных серверах. В то же время развивались технологии доступа к данным. Сегодня свыше 95% всех информационных систем так или иначе используют базы данных. Вот почему вопросы организации взаимодействия приложения с базой данных являются актуальными, а внимание ведущих разработчиков программного обеспечения приковано к этой проблеме.
На сегодняшний день ADO.NET является наиболее развитой технологией доступа к данным среди технологий, разработанных корпорацией Microsoft. Она развивает те принципы, которые были заложены в таких технологиях, как DAO и ADO, делая их более простыми в применении, более мощными и универсальными. В то же время ADO.NET является уже иной технологией доступа к данным.
5.1 Переваги і нововведення ADO.Net.
ADO.NET имеет ряд преимуществ по сравнению с предыдущими версиями ADO и другими компонентами для доступа к данным. Эти преимущества можно разделить на следующие категории.
Взаимодействие
Приложения ADO.NET отличаются гибкостью и обширной поддержкой XML. Так как XML является форматом передачи наборов данных через сеть, обрабатывать данные может любой компонент, поддерживающий чтение данных в формате XML. В сущности, принимающий компонент вообще не обязан быть компонентом ADO.NET: передающий компонент может просто передать набор данных получателю, вне зависимости от способа реализации последнего. Компонент-получатель может быть приложением Visual Studio или любым другим приложением, реализованным какими угодно средствами. Единственное требование состоит в том, что получатель должен уметь читать данные в формате XML. XML как общепризнанный стандарт был разработан именно для такого типа взаимодействия.
Масштабируемость
Так как подключение к Интернету может радикально увеличить количество запросов к данным, для веб-приложений масштабируемость становится определяющим фактором. Для веб-приложений верхней границы количества пользователей не существует. Хотя приложение может без особых проблем работать с десятком пользователей, с сотнями или сотнями тысяч оно может не справиться. Приложение, расходующее такие ресурсы, как блокировки баз данных и подключения к базам данных, не сможет нормально обслуживать большое число пользователей, так как потребность пользователей в этих ограниченных ресурсах очень быстро превысит их количество.
ADO.NET способствует повышению масштабируемости при помощи стимулирования сбережения ограниченных ресурсов программистами. Так как любое приложение ADO.NET использует неподключенный доступ к данным, блокировки баз данных и подключения действуют кратковременно.
Простота модификации
В течение срока службы развернутой системы в нее можно вносить незначительные изменения, однако попытки произвести коренные, архитектурные изменения случаются редко в силу исключительной сложности задачи. Но, по мере роста популярности развернутого приложения среди пользователей растет нагрузка на него, и иногда такой рост может потребовать архитектурных изменений. По мере того как нагрузка на сервер распределенного приложения возрастает, может возникнуть дефицит системных ресурсов, что может отразиться на времени ответа или производительности приложения. Столкнувшись с этой проблемой, разработчики программного обеспечения могут разграничить обработку бизнес-логики приложения на сервере и обработку пользовательского интерфейса, выделив их в разные уровни, выполняемые на разных машинах. В результате уровень сервера приложения заменяется двумя уровнями, что снижает остроту нехватки ресурсов.
Проблема заключается не в создании трехуровневого приложения. а в увеличении числа уровней приложения уже после его развертывания. Если первоначальное приложение реализовано на основе ADO.NET с использованием наборов данных, такое преобразование происходит гораздо легче. Необходимо помнить, что при замене одного уровня двумя нужно продумать способ обмена информацией между этими уровнями. Так как уровни могут обмениваться данными посредством наборов данных в формате XML, организовать связь относительно просто.
Простота программирования
Компоненты данных ADO.NET в Visual Studio инкапсулируют функциональные возможности доступа к данным различными способами, что помогает разрабатывать программные продукты значительно быстрее и с меньшим количеством ошибок.
5.2 Типи сховищ даних і рівні моделі постачальників
В современных интернет приложениях используемые данные могут храниться в различных базах данных и не только. На практике для хранения данных могут встречаться неструктурированные, структурированные неиерархические, иерархические, объектно-ориентированные и другие типы хранилищ. Как обеспечить доступ к различным источникам данных?
Одной из основных идей, лежащих в основе ADO.NET, является наличие поставщиков данных.
Поставщик данных - это набор классов, предназначенных для взаимодействия с хранилищем данных определенного типа. За счет этого модель ADO.NET является чрезвычайно гибкой и расширяемой. Рассмотрим уровни модели поставщиков ADO.NET (рис.5.1).
Как видно из рисунка 5.1 приложение .NET взаимодействует с базой данных посредством поставщиков данных. Каждый поставщик данных может обеспечивать доступ только к базе данных определенного формата. Так, для доступа к БД Microsoft SQL Server используется поставщик SQL Server для .NET, для доступа к БД Oracle - поставщик Oracle для .NET и т. д. Названные базы данных являются одними из самых распространенных во всем мире, поэтому поставщики данных для них выделены в отдельные элементы модели ADO.NET; тем не менее существует множество баз данных другого формата, к которым необходимо осуществлять доступ из приложения .NET. Для этого могут применяться поставщики данных OleDb для .NET или ODBC для .NET, обеспечивающие доступ к любым данным, для которых существует драйвер OleDb либо ODBC соответственно.
Рисунок 5.1 – Уровни моделей поставщиков ADO.NET
При построении приложения, использующего доступ к данным, необходимо сперва попытаться найти "родного" поставщика данных для .NET. Когда же такового не существует, можно воспользоваться OleDb, если существует соответствующий драйвер для источника данных, к которому устанавливается подключение. Т.к. технология OleDb существует достаточно давно, создано много драйверов для различных источников данных, поддерживающих ее. Если в системе не установлен соответствующий драйвер OleDb, его можно попытаться найти на сайте разработчика той базы данных, к которой осуществляется доступ, либо на сайте Microsoft. То же самое справедливо и для технологии ODBC. В ряде случаев существует несколько альтернативных вариантов организации доступа к данным определенного формата. Например, доступ к источнику данных на основе SQL Server можно организовать используя либо поставщик SQL Server для .NET, либо поставщик OleDb. Тем не менее, всегда предпочтительнее использовать тот поставщик данных, который специально предназначен для обеспечения доступа к конкретному источнику данных, т. к. он учитывает его особенности.
Каждый поставщик .NET реализует одинаковые базовые классы - Connection, Transaction, DataAdapter, Command, Parameter, DataReader имена которых зависят от поставщика. Например, у поставщика SQL Server существует объект SqlDataAdapter, у поставщика OleDb — OleDbDataAdapter и т. д.
У каждого поставщика данных существует собственное пространство имен. Хотя все поставщики относятся к пространству имен System.Data, каждый из них содержит свой подраздел этого пространства, который содержит объекты, специфичные для данного поставщика. Например, объект SqlDataAdapter находится в пространстве имен System.Data.SqlClient.
Все поставщики данных .NET реализуют одинаковые базовые функции, поэтому код, создаваемый для доступа к данным, выглядит приблизительно одинаково независимо от поставщика. Это означает, что, рассматривая использование интерфейсов отдельного поставщика, мы фактически рассматриваем возможность использования этих же интерфейсов применительно и к другим поставщикам данных.
5.3 Сполучені і роз'єднані оточення в ADO.Net
В клиент серверных приложениях традиционно использовалась технология доступа к источнику данных при которой соединения с базой данных поддерживается постоянно. При использовании Интернет приложений выявляются недостатки такого подхода. Это следующие:
- выделение системных ресурсов, что критично при большой нагрузке на сервер;
- web-приложение не позволяет серверу в каждый момент времени знать, что необходимо пользователю, так как до следующего запроса сервер не знает нужно ли еще поддерживать соединение;
- приложение с постоянным окружением очень трудно поддается масштабированию.
ADO.NET представляет собой набор библиотек, входящих в Microsoft .NET Framework и предназначенных для взаимодействия с различными хранилищами данных из .NET-приложений. Библиотеки ADO.NET включают все необходимые классы для подключения к источникам данных практически произвольного формата, выполнения запросов к этим источникам и получения результата. Кроме того, несомненным достоинством ADO.NET является возможность работы с отсоединенными источниками данных, представляющими собой структуры, которые организуют данные в оперативной памяти компьютера и работать с которыми возможно с использованием ставших уже привычными средств доступа к данным. Таким образом, ADO.NET можно использовать в качестве надежного, иерархически организованного отсоединенного от источника кэша данных для автономной работы, что незаменимо при построении масштабируемых приложений, особенно ориентированных на Web.
5.4 Підключені та автономні класи і об’єкти.
Рассмотрим архитектуру ADO.NET. Так как ADO.NET представляет собой набор классов для организации взаимодействия клиентского приложения с базой данных, рассмотрим объектную модель ADO.NET
На рисунке.5.2. показаны классы, составляющие объектную модель ADO.NET
Рисунок 5.2 – Иерархия объектов ADO.NET
Объекты, расположенные в левой части, называются подсоединенными и необходимы для управления соединением, транзакциями, выборкой данных и передачей изменений данных в БД. Они непосредственно взаимодействуют с базой данных. Объекты, расположенные в правой части, называются отсоединенными. Они позволяют работать с данными автономно. Отсоединенные объекты не взаимодействуют непосредственно с подсоединенными для получения данных из БД. Точнее, можно сказать, что они не взаимодействуют со всеми объектами левой части иерархии объектов. Можно сказать, что одной из форм взаимодействия этих двух групп является использование объектом DataAdapter объекта DataSet для заполнения последнего набором данных, извлеченных непосредственно из базы данных.
Рассмотрим их более подробно. объекты, изображенные на рисунке 5.2
Объект Connection представляет соединение с источником данных. С его помощью можно задать тип источника данных, его местонахождение, параметры доступа и ряд других атрибутов. Перед тем как начать взаимодействие с источником данных, необходимо установить подключение к нему с помощью объекта Connection.
Объект Command представляет запрос к источнику данных, вызов хранимой процедуры или прямой запрос на возврат содержимого конкретной таблицы. Как известно, существует несколько типов запросов. Часть из них возвращают данные, извлекаемые из источника данных, другие изменяют записи, третьи - управляют структурой базы данных. С помощью объекта Command возможно выполнить любой из перечисленных типов запросов. Различия в поведении объекта Command начинают проявляться тогда, когда необходимо исполнить тот или иной запрос. Так, например, при необходимости исполнения запроса, не возвращающего записи, необходимо использовать метод ExecuteNonQuery объекта Command, а при извлечении данных из базы данных - метод ExecuteReader, который, в свою очередь, возвращает объект DataReader, позволяющий просматривать полученные в результате запроса записи.
Объект DataReader предназначен для максимально быстрой выборки и просмотра возвращаемых запросом записей. Однако он позволяет просматривать весь результирующий набор записей путем перемещения от одной записи к другой и, таким образом, просматривать только одну запись за раз. Кроме того, DataReader не имеет возможности для обновления значений записей и поэтому может работать в режиме "только для чтения", за счет чего обладает высокой производительностью.
Объект Transaction позволяет осуществлять группировку записей в логическую единицу работы, называемой транзакцией. Транзакция логически объединяет несколько различных действий, связанных с манипулированием данными, в единое целое. В процессе выполнения действий, осуществляемых в рамках транзакции, СУБД обычно кэширует изменения, вносимые этими действиями в данные до момента завершения транзакции. Это позволяет производить отмену любых изменений, выполненных в рамках транзакции, в случае, если хотя бы одно из действий транзакции завершилось неудачно.
Объект Parameter позволяет вводить в запрос элемент, значение которого может быть задано непосредственно перед исполнением запроса. За счет этого отпадает необходимость каждый раз изменять текст самого запроса.
Объект DataAdapter представляет собой связующее звено между отсоединенными объектами ADO.NET и базой данных. С его помощью осуществляется заполнение таких объектов, как DataSet или DataTable, значениями, полученными в результате выполнения запроса к базе данных, для последующей автономной работы с ними. Помимо этого DataAdapter реализует эффективный механизм выполнения обновления данных, хранимых в базе данных, изменениями, внесенными в данные объектов DataSet и DataTable.
Объект DataTable позволяет просматривать данные в виде наборов записей и столбцов. Фактически, он представляет собой аналог таблицы БД, размещенный в памяти. Достоинством такой организации является возможность автономной работы с данными. Это означает, что после установления соединения с базой данных, чтения данных и заполнения ими объекта DataTable можно отключиться от источника данных и продолжать работать с ним в автономном режиме. Такая возможность чрезвычайно полезна при организации Web-приложений, которые должны быть хорошо масштабируемыми и ориентированы на многопользовательский режим работы. При этом, однако, возникают и побочные эффекты, один из которых связан с тем, что человек, работающий с автономным набором данных, не может увидеть изменений, вносимых в данные в этот момент другими пользователями.
Объект DataColumn представляет собой столбец объекта DataTable. Набор же всех столбов объекта DataTable представляет собой коллекцию Columns. Посредством этого объекта можно получить доступ к значению ячейки соответствующего столбца.
Объект DataRow представляет собой строку объекта DataTable. Набор всех строк этого объекта представляет собой коллекцию Rows. DataRow очень часто используется для доступа к значению конкретного поля определенной записи. При этом применяется свойство Item.
Объект DataSet представляет собой отсоединенный набор данных, который может рассматриваться как контейнер для объектов DataTable. DataSet позволяет организовывать внутри себя структуру, полностью соответствующую реальной структуре таблиц и связей между ними в БД. Это удобно в том случае, когда при работе с базой данных необходимы данные из разных таблиц. В этом случае вместо того, чтобы многократно обращаться к серверу и выбирать данные из одной таблицы за раз, можно поместить все данные в объект DataSet, а затем передать его клиентскому приложению. DataSet является очень мощным инструментом для работы с отсоединенными наборами данных. Все изменения, которые вносятся в данные, хранящиеся в DataSet кэшируются в объектах DataRow. Когда возникает необходимость передачи изменений из DataSet в БД, возможно осуществить передачу только измененных данных, вместо того чтобы передавать все данные объекта, и это значительно снижает объем данных, передаваемых между клиентским компьютером и сервером.
Объект DataRelation представляет собой описание связей между таблицами реляционной базы данных. Он предоставляется объектом DataSet и позволяет организовывать взаимосвязи между таблицами отсоединенного набора данных объекта DataSet. Объект DataRelation выполняет функцию, аналогичную той, которую выполняют связи, определяемые в СУБД между таблицами при создании структур данных. Это касается и соблюдения принципов ссылочной целостности информации. Например, DataRelation можно настроить таким образом, чтобы изменения значения первичного ключа родительской таблицы автоматически передавались дочерним записям, а при удалении записи в родительской таблице автоматически удалялись записи в дочерних таблицах, связанных с ней.
Объект DataView предназначен для организации возможности просмотра содержимого DataTable различными способами. Это относится к таким операциям, как сортировка и фильтрация записей. С помощью DataView допускается просматривать содержимое одного объекта DataTable с различными установками фильтрации и сортировки. Для этого необходимо использовать два различных объекта DataView, связанных с одним объектом DataTable. Такая возможность исключает необходимость хранения одного набора данных в двух разных структурах.