КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лек ция № 7. Создание клиентских приложений Windows
Многим коммерческим приложениям необходимо взаимодействовать с базами данных. Платформа .NET Framework предоставляет программисту богатый выбор объектов, позволяющих обращаться к базам данных. Совокупность классов этих объектов носит имя ADO.NET. Некоторые понимают под этой аббревиатурой технологию доступа к данным, другие библиотеку – подмножество библиотеки NET Framework (а именно пространства System.Data, System.Data.SqlClient, System.Data.OleDb, где размещены используемые при доступе к данным классы). В общем случае ADO.NET – это и то и другое. Все, что находится в System.Data и вложеных в него пространствах, подчинено строгой реализации идеологии обмена данными в.NET Framework. Эта идеология – отражение Web-модели построения приложений, использующих язык XML для обмена данными и протокол HTTP как базовый транспорт для доставки сообщений. Web-приложения построены на двухстороннем обмене данными между клиентским приложением-потребителем данных и сервером, их предоставляющим. ADO.NET представляет собой отсоединенную (disconnected) архитектуру данных. При отсоединенной архитектуре данные извлекаются из базы и кэшируются на локальном компьютере. Там приложение обрабатывает их и связывается с базой данных только тогда, когда возникает необходимость изменить в ней какие-либо записи или получить новые данные. В отсоединении от базы данных есть много преимуществ. Самое важное из них состоит в том, что такой подход позволяет избежать многих проблем, возникающих при работе с подсоединенными объектами данных, которые плохо масштабируются. Подключение к базе данных активно использует ресурсы, и одновременная поддержка тысяч (или десятков тысяч) подключений представляет собой трудную задачу. Отсоединенная архитектура использует ресурсы не так интенсивно. Первый раз ADO.NET связывается с базой данных для получения информации, а затем связывается снова - уже для внесения изменений, сделанных вами. Большинство приложений значительную часть времени просто читают данные и выводят их на экран; ADO.NET предоставляет приложению отсоединенное подмножество данных, которые можно читать и выводить. Отсоединенные объекты данных работают в режиме, напоминающем веб-сеансы. Все веб-сеансы являются обособленными, и их состояния не сохраняются между запросами веб-страниц. Отсоединенная архитектура данных позволяет осуществлять более чистое взаимодействие с базами данных в Сети. В.NET выделяют два вида обмена данными между приложениями и источником данных. Для отсоединенного режима с двухсторонним обменом данными характерно чтение данных потоком с источника данных, длительное автономное использование данных в отсоединенном режиме и пакетное обновление обратно в источник. Наиболее часто такой обмен применяют в приложениях Windows. Общая схема взаимодействия приложения и источника показана ниже. Сначала приложение соединяется с источником данных и считывает оттуда данные (рис. 1), затем разрывает соединение и обрабатывает данные в отсоединенном режиме (рис. 2). После окончания обработки соединение с источником устанавливается вновь и приложение производит пакетное обновление данных из источника (рис. 3).
В качестве базового принимают требование минимизации числа возможных соединений между приложением и источником данных. В идеале их должно быть два – в начале сеанса работы, при считывании данных, и в конце, при пакетном обновлении данных их приложения в источник. Для обеспечения такой "идеальной" модели в приложения стараются "загружать" максимальный объем данных, необходимых для решаемых приложением задач. Если выдвигается предположение, что те или иные данные понадобятся приложению в процессе его работы, то, чтобы лишний раз не устанавливать соединение с источником, эти данные заливают в приложение на начальной стадии его работы. Если же объемы таблиц в источнике данных невелики, то в приложение полностью загружают все содержимое таких таблиц, не особенно ломая при этом голову. Загрузка больших объемов данных в клиентские приложения сегодня никого не удивляет ввиду значительного размера оперативной и дисковой памяти у современных "настольных" компьютеров. Для обеспечения описанного выше режима работы структура приложения в ADO.NET должна отвечать структуре, показанной на рис. 4. Центральной структурой данных в приложении ADO.NET является набор данных –объект типа DataSet. Эта хранящаяся в памяти реляционная структура включаетв себя некоторое число таблиц данных – объектов типа DataTable. Между таблица-ми набора могут иметься отношения. Каждое реализуется объектом DataRelation,а все отношения между таблицами набора хранятся в коллекции DataRelations этого набора. В наборе же хранятся и ограничения, накладываемые на отдельные столбцы таблиц. Одна из главных особенностей набора данных – его автономность по отношению к конкретному источника данных. Своих средств для взаимодействия с источником данных у набора нет. Набору все равно, кто, каким образом, когда и откуда занесет данные в его таблицы. В различные таблицы набора можно занести данные не только из разных источников данных, но и из разнотипных. Например, в одну таблицу можно занести данные из базы MS SQL Server, в другую таблицу – из Access, в третью – из текстового файла. Первичное соединение приложения с источником данных выполняется при помо- щи объекта типа SqlConnection или OleDbConnection. После загрузки соединение разрывают, вплоть до того момента, когда записи, измененные в приложении, потребуется записать обратно в источник.
Загрузка данных из источника данных в набор данных приложения производится адаптером данных – объектом типа SqlDataAdapter или OleDbDataAdapter. Адаптер служит как бы мостом между набором данных и источником. Адаптер содержит объект команды данных, выполняющей извлечение данных из источника. Команда данных – это объект типа SqlCommand или OleDbCommand, выполняющий запрос на сервере. Для считывания данных применяется запрос, содержащий оператор SELECT. Приложение инициирует загрузку данных, вызывая метод Fill адаптера данных. Команда отсылает источнику данных запрос, содержащий оператор SELECT. Источник выполняет этот запрос и возвращает выбранные записи, если они есть. Записи поступают в приложение и размещаются в таблице данных (объект DataTable). Отметим, что каждый адаптер обслуживает только одну таблицу набора данных. Сколько в наборе таблиц, столько должно быть и адаптеров, хотя для простоты приведенный выше рисунок и содержит изображение только одного адаптера. После загрузки соединение с источником данных разрывается. Наступает этап обработки данных в приложении. По окончании этого этапа таблицы набора данных могут содержать некоторое количество измененных записей, в том числе старых откорректированных и удаленных, а также вновь добавленных. Источник данных ничего не знает об этих изменениях до их актуализации. В процессе актуализации в приложении происходит формирование потоков измененных записей, устанавливается повторное соединение с источником данных и производится перезапись изменений в источник. Вслед за этим соединение вновь разрывается. Актуализацию изменений производит также адаптер. Актуализация начинается, когда приложение вызывает метод Update адаптера. За актуализацию конкретного вида изменений отвечает отдельная команда данных. Каждая из них выбирает в наборе данных приложения записи с изменением конкретного вида и отсылает их источник данных совместно с соответствующим запросом – оператором UPDATE, INSERT или DELETE. Рассмотренный выше принцип взаимодействия приложения и источника данных существенно отличается от принятого ранее в клиент-серверных системах, где между приложением и источником существовала постоянная связь. Считывание данных в приложение из источника производилось всякий раз по потребности. Запросы на выборку данных строились таким образом, чтобы получить только те записи, которые будут реально востребованы в приложении. Запись изменений из приложения в источник выполнялась для каждой измененной записи, либо для группы записей, либо, реже, пакетом для всех измененных в приложении записей. Другой режим - однонаправленное использование данных "только-на-чтение". В этом режиме приложение единожды считывают данные и формируют по ним какие-либо отчеты в режиме "только-на-чтение", перебирая полученные записи последовательно по направлению от первой к последней. Соединение с источником данных устанавливается перед считыванием данных и сохраняется в процессе считывания (рис. 5). Затем приложение интерпретирует данные в отсоединенном режиме (рис. 6), после чего вновь запрашивает у источника другие данные (рис. 7). Схема приложения, функционирующего в режиме однонаправленного чтения, показана ниже (рис. 8). В таких приложениях функциональность, предоставляемая набором данных, избыточна, поэтому наборы данных в таких приложениях не применяют. Не применяют и адаптеры данных. Когда нужно считать из источника поток записей, применяют команду данных, отсылающую к источнику на выполнение оператор SELECT. Далее записи из полученного от источника потока по одной считываются в режиме "только-на- чтение" ридером – объектом типа SqlDataReader, OleDbDataReader или, если приложение имеет дело с потоком данных в формате XML, типа XmlTextReader. Если подобное приложение осуществляет перезапись данных обратно в источник (рис. 9), то использует для этого отдельные команды данных, выполняющие в источике операторы INSERT, UPDATE и DELETE. В ряде случаев применяют также команды, изменяющие структуру данных в источнике, например посредством операторов CREATE TABLE, ALTER TABLE и пр. Подобный принцип обмена данными с источником характерен для Web-приложений.
Объектная модель ADO.NET Объектная модель ADO.NET довольно велика, но по сути своей является просто набором классов. Самый важный из них- класс DstaSet. Этот класс представляет подмножество базы данных, которое находится на локальном компьютере без непрерывной связи с базой данных. Этот объект можно также рассматривать как локальную копию фрагмента БД. В DataSet данные можно загрузить из любого допустимого источника, например из БД SQL Server, Microsoft Access или XML-файла. Объект DataSet хранится в памяти, его содержимым разрешено манипулировать и обновлять независимо от БД, играющей роль источника данных. При необходимости объект DataSet может служить шаблоном для обновления серверной БД. Периодически объект DataSet восстанавливает соединение с родительской базой данных для внесения в нее изменений, сделанных в объекте DataSet, и для внесения в него изменений, произошедших в базе данных. Такой подход весьма эффективен, но при этом от объекта DataSet требуется, чтобы он был устойчивым подмножеством базы данных и включал в себя не просто несколько строк какой-то таблицы, а целый набор таблиц со всеми метаданными, необходимыми для отражения отношений и ограничений, присутствующих в исходной базе данных. ADO.NET удовлетворяет всем этим требованиям. Объект DataSet состоит из объектов DataTable и DataRelation, доступных через его свойства. Свойство Tables возвращает коллекцию DataTableCollection, которая содержит все объекты DataTable. Каждый объект Data- Table представляет в памяти компьютера одну таблицу. Структура объекта Data Table определяется двумя наборами: DataColumns, куда входят все столбцы таблицы, ко- торую представляет объект DataTable, и набором ограничений таблицы. Вместе эти два набора составляют схему таблицы. В DataTable также входит набор Data Rows, где, собственно, и хранятся данные объекта DataSet. Объект DataTable может быть создан программно либо в результате запроса к базе данных. Объект DataTable обладает рядом открытых свойств, в число которых входит коллекция Columns, которая возвращает объект DataColumnCollection, состоящий из объектов DataColuirn. Каждый объект DataColumn представляет собой столбец таблицы. Кроме коллекции Tables объект DataSet имеет свойство Relations, которое возвращает коллекцию DataRelationCollection, состоящую из объектов DataReiation. Каждый такой объект представляет собой отношение между двумя таблицами, выраженное через объекты DaraColumn. Например, таблицы Customers и Orders имеют отношение, выраженное через столбец CustomerlD. Это отношение вида «один-ко-многим» или «предок-к-потомку». У каждого заказа есть единственный заказчик, но у заказчика может быть любое количество заказов. Подобная ситуация — пример связи типа один ко многим, такую связь можно определить посредством объекта DataRelation. Коллекция Rows объекта DataTable возвращает набор строк указанной таблицы. Эта коллекция используется для изучения результатов запроса к базе данных. Циклический перебор элементов коллекции Rows позволяет проанализировать каждую запись. В ADO.NET программист не перебирает элементы DataSet; вместо этого он обращается к нужной таблице и перебирает элементы коллекции ROWS (как правило, в цикле fогеасh). Связь с БД создается и поддерживается при помощи провайдера данных (Data Provider). В действительности провайдер — это набор взаимосвязанных компонентов, обеспечивающих эффективный высокопроизводительный доступ к данным. В настоящее время с.NET Framework поставляются четыре провайдера данных, в том числе SQL Server.NET Data Provider, созданный для работы с SQL Server версии 7.0 и выше, и OleDb.NET Data Provider— для подключения к БД других типов. Любой провайдер данных состоит из близких версий следующих универсальных классов компонентов: • Connection — обеспечивает подключение к БД; • Command — применяется для управления источником данных; позволяет исполнять команды, не возвращающие данных, например INSERT, UPDATE и DELETE, либо команды, возвращающие объект DataReader (такие, как SELECT); • DataReader — предоставляет доступный только для однонаправленного чтения набор записей, подключенный к источнику данных; • DataAdapter — заполняет отсоединенный объект DataSet или DataTable и обновляет его содержимое. Доступ к данным в ADO.NET осуществляется так: объект Connection устанавливает между приложением и БД соединение, напрямую доступное объектам Command и DataAdapter. Объект Command позволяет исполнять команды непосредственно над БД. Если исполненная команда возвращает несколько значений, Command открывает к ним доступ через объект DataReader. Полученные результаты можно обрабатывать напрямую, используя код приложения, либо через объект DataSet, заполнив его при помощи объекта DataAdapter. Для обновления БД также применяют объекты Command или DataAdapter. Отдельные команды данных могут использоваться для выполнения запросов, выполняющих изменение данных в источнике (например, SQL-операторы INSERT,
Дата добавления: 2014-01-20; Просмотров: 589; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |