ЛР5 Oracle 11g Разработка приложения C

advertisement
Лабораторная работа № 5
База данных Oracle Database 11g Express Edition. Разработка
приложений в среде Visual Studio C#
1. Цель работы
Изучение средств Microsoft Visual Studio и языка C# для программирования
приложений базы данных (БД) Oracle Database 11g Express Edition.
2. Задачи
Разработка приложения с простым отчетом в среде Microsoft Visual Visual Studio
2013 на языке C#. Программирование пользовательского интерфейса
приложения.
3. Теоретическая часть
Визуальная среда программирования Microsoft Visual Studio, реализующая
методологию платформы Microsoft .NET Framework, предоставляет достаточно
много средств для разработки профессиональных приложений баз данных, в том
числе и БД Oracle. В рамках .NET Framework для доступа к данным используется
интерфейс ADO.NET. В ADO.NET используется многоуровневая архитектура,
которая обращается вокруг небольшого числа ключевых концепций, таких как
объекты Connection, Command и DataSet. Однако архитектура ADO.NET серьезно
отличается от классической архитектуры ADO. Двумя основными компонентами
ADO.NET 3.0 для доступа к данным и их обработки являются поставщики данных
.NET Framework и класс DataSet.
3.1. Поставщики данных в ADO.NET
Поставщик данных (data provider) — это набор классов ADO.NET,
которые позволяют получать доступ к определенной базе данных, выполнять
команды SQL и извлекать данные. Поставщиками данных .NET Framework
являются компоненты, которые специально сконструированы для обработки
данных и быстрого, однонаправленного доступа к данным только для чтения. По
сути, поставщик данных — это мост между приложением и источником данных.
Общая схема взаимодействия приложения с БД через интерфейс ADO.NET
следующая. Приложение .NET (т.е. такое приложение, которое использует
библиотеку .NET Framework) использует конкретного поставщика данных .NET,
который в свою очередь открывает доступ к соответствующей БД.
В первом приближении поставщик данных можно рассматривать как набор
типов, определенных в данном пространстве имен, который предназначен для
взаимодействия
с
конкретным
источником
данных.
Например,
для
взаимодействия с БД Oracle небходимо использовать поставщика данных Oracle
для .NET; для взаимодействия с БД Microsoft SQL Server – поставщика данных
SQL Server для .NET. Однако независимо от используемого поставщика данных,
каждый из них определяет набор классов, обеспечивающих основную
функциональность.
Основные объекты поставщиков данных ADO.NET:
Connection - позволяет подключаться к источнику данных и отключаться от
него. Объект Connection представляет собой средство для соединения объекта
DataSet с источником данных. Кроме того, объекты подключения обеспечивают
доступ к соответствующим объектам транзакций.
Command - представляет SQL-запрос или хранимую процедуру. Кроме
того, объекты команд предоставляют доступ к объекту чтения данных конкретного
поставщика данных. Например, объект Command позволяет послать команду
(обычно это SQL запрос или вызов хранимой процедуры) к базе данных. Часто
командные объекты создаются неявно, во время формирования объекта DataSet.
Но ADO.NET позволяет и явно обращаться к таким объектам.
DataReader - предоставляет доступ к данным только для чтения в прямом
направлении с помощью курсора на стороне сервера. Считывает из источника
данных однонаправленный поток данных только для чтения.
DataAdapter - пересылает наборы данных из источника данных к
вызывающему процессу и обратно. Адаптеры данных содержат подключение и
набор из четырех внутренних объектов команд для выборки, вставки, изменения и
удаления информации в источнике данных. ADO.NET использует объект типа
DataAdapter как мост между объектом DataSet и источником данных, который
является основной базой данных. DataAdapter содержит метод Fill() для
обновления данных из базы и заполнения DataSet.
Transaction - инкапсулирует транзакцию в базе данных. Прикрепляет
команды к транзакциям в источнике данных.
Конкретные имена этих основных классов различаются у различных
поставщиков (например, SqlConnection, OracleConnection, OdbcConnection и
MySqlConnection), но все эти объекты порождены от одного и того же базового
класса (в случае объектов подключения это DbConnection), который реализует
идентичные интерфейсы (вроде IDbConnection).
В ADO.NET термин "объект подключения" на самом деле относится к
конкретному типу, порожденному от DbConnection; объекта подключения "вообще"
нет. То же можно сказать и об "объекте команды", "объекте адаптера данных" и
т.д. По соглашению имена объектов в конкретном поставщике данных имеют
префиксы соответствующей СУБД (например, SqlConnection, OracleConnection,
SqlDataReader и т.д.).
Одной из ключевых идей, лежащих в основе модели поставщиков ADO.NET,
является расширяемость. Другими словами, разработчики могут создавать
собственные
поставщики
для патентованных источников данных.
В
действительности доступно множество подтверждающих это примеров, которые
демонстрируют, как создавать настраиваемые поставщики ADO.NET, служащие
оболочками для нереляционных хранилищ данных, таких как файловая система
или служба каталогов. Некоторые независимые производители также продают
собственные поставщики данных для .NET.
В рамках .NET Framework поставляется небольшой набор из четырех
поставщиков:
SQL Server - Предоставляет оптимизированный доступ к базам данных SQL
Server (версии 7.0 и выше).
OLE DB - Предоставляет доступ к любому источнику данных, который
имеет драйвер OLE DB. Это включает базы данных SQL Server версий,
предшествующих 7.0.
Oracle - Предоставляет оптимизированный доступ к базам данных Oracle
(версии 8i и выше).
ODBC - Предоставляет доступ к любому источнику данных, имеющему
драйвер ODBC.
Поставщик данных .NET Framework для Oracle (OracleClient) обеспечивает
доступ к источникам данных Oracle через клиентское программное обеспечение
(ПО) Oracle для связи. Поставщик данных поддерживает клиентское ПО Oracle
версии 8.1.7 или более поздней версии. Поставщик данных поддерживает как
локальные, так и распределенные транзакции.
Поставщик данных .NET Framework для Oracle требует установки в системе
клиентского ПО Oracle для связи (версии 8.1.7 или более поздней) до того, как
можно будет соединяться с источником данных Oracle.
Поставщик данных .NET Framework для классов Oracle находится в
пространстве
имен
System.Data.OracleClient
и
содержится
в
сборке
System.Data.OracleClient.dll. При компиляции приложения, использующего этот
источник данных, необходимо ссылаться как на System.Data.dll, так и на
System.Data.OracleClient.dll.
В версии .NET Framework 4 поставщик Oracle объявлен устаревшим. И хотя
он по-прежнему работает, в Microsoft рекомендуют применять вместо него для
доступа к базам данных Oracle поставщик от стороннего производителя, такой как
ODP.NET (Oracle Data Provider для .NET) производства Oracle, который доступен
на веб-сайте http://www.oracle.com. Этот поставщик обеспечивает расширенную
поддержку для специализированных типов данных Oracle, вроде LOB, временных
меток и данных XML, а также обладает несколькими дополнительными
средствами.
Объект класса DataSet представляет собой отображение используемой
базы данных, перенесенное на машину пользователя. При этом нет
необходимости постоянно подключаться к серверу базы данных для модификации
данных. Лишь иногда вы соединяете объект DataSet с его родительской базой
данных и модифицируете ее внесенными вами изменениями. В то же время вы
модифицируете DataSet теми изменениями в базе данных, которые сделали
другие процессы.
Объект DataSet инкапсулирует объекты DataTable и объекты DataRelation.
К ним можно обращаться как к свойствам объекта DataSet. Свойство Tables
возвращает объект типа DataTableCollection, который содержит все объекты
DataTable используемой БД.
Объект типа DataTable представляет собой таблицу базы данных. Такой
объект может быть создан программно или путем запроса к базе данных. Объект
DataTable состоит из строк и столбцов. Строки представляют собой отдельные
записи таблицы, столбцы — соответствующие поля.
Для получения совокупности столбцов объект DataSet имеет свойство
Columns, возвращающее DataColumnCollection, которое в свою очередь состоит
из объектов типа DataColumn. Каждый объект DataColumn представляет собой
отдельный столбец таблицы, из которого можно получить любую запись.
Свойство Rows объекта DataTable возвращает совокупность всех строк
таблицы - DataRowCollection. Это свойство следует применять для того, чтобы
пользоваться результатами запросов к базе данных. В ADO.NET нет
необходимости в итерационном обходе DataSet для получения данных. Вы
можете обращаться к записям таблицы как к элементам простого массива. Это
значительно упрощает процесс доступа к элементам базы.
Кроме набора таблиц DataSet имеет свойство Relations, которое
возвращает объект типа DataRelationCollection, состоящий из объектов
DataRelation. Каждый объект DataRelation хранит данные о связях между двумя
таблицами посредством объектов DataColumn – столбцов, по которым
установлены связи между таблицами.
На рис. 5.1 показаны связи между компонентами поставщика данных и
объектом DataSet в архитектуре ADO.NET.
Рис. 5.1. Архитектура ADO.NET
Финальными объектами, обеспечивающими доступ к данным со стороны
приложения, в архитектуре ADO.NET являются DataReader или DataSet. При
решении вопроса о том, должно ли приложение использовать DataReader или
DataSet, следует рассмотреть тип функциональности, который необходим для
приложения. DataSet предназначен для выполнения следующих задач:




Локальное кэширование данных в приложении для последующей
обработки. Если нужно только считывать результаты запроса, без
кэширования данных в приложении, класс DataReader подходит наилучшим
образом.
Удаленное взаимодействие с данными между уровнями (в многоуровневых
приложениях) или от веб-службы XML.
Динамическое взаимодействие с данными, например привязка к элементу
управления Windows Forms или комбинирование и связывание данных из
нескольких источников.
Выполнение интенсивной обработки, не требующей открытого соединения с
источником данных, что освобождает соединение для использования
другими клиентами.
Если функциональность, предоставляемая классом DataSet, не нужна,
можно повысить производительность приложения, используя класс DataReader
для возврата данных в однонаправленном режиме только для чтения. При этом
будет экономиться память, которую потреблял бы объект DataSet, и можно
избежать обработки, необходимой для создания и заполнения содержимого
DataSet.
3.2. Фундаментальные классы ADO.NET
Классы ADO.NET группируются в несколько пространств имен. Каждый
поставщик имеет свое собственное пространство имен, а обобщенные классы
вроде DataSet находятся в пространстве имен System.Data. Ниже описаны
наиболее важные пространства имен для базовой поддержки ADO.NET.
System.Data
Содержит ключевые классы контейнеров данных, которые моделируют
столбцы, отношения, таблицы, наборы данных, строки, представления и
ограничения. Дополнительно содержит ключевые интерфейсы, которые
реализованы объектами данных, основанными на соединениях.
System.Data.Common
Содержит базовые, наиболее абстрактные классы, которые реализуют
некоторые из интерфейсов из System.Data и определяют ядро
функциональности ADO.NET. Поставщики данных наследуются от этих
классов (DbConnection, DbCommand и т.п.), создавая собственные
специализированные версии.
System.Data.OleDb
Содержит классы, используемые для подключения к поставщику OLE DB,
включая OleDbCommand, OleDbConnection и OleDbDataAdapter. Эти классы
поддерживают большинство поставщиков OLE DB, но не те, что требуют
интерфейсов OLE DB версии 2.5.
System.Data.SqlClient
Содержит классы, используемые для подключения к базе данных Microsoft
SQL Server, в том числе SqlDbCommand, SqlDbConnection и
SqlDbDataAdapter. Эти классы оптимизированы для использования
интерфейса TDS к SQL Server.
System.Data.OracleClient
Содержит классы, необходимые для подключения к базе данных Oracle
(версии 8.1.7 и выше), в том числе OracleCommand, OracleConnection и
OracleDataAdapter. Эти классы используют оптимизированный интерфейс
OCI (Oracle Call Interface — Интерфейс вызовов Oracle).
System.Data.Odbc
Содержит классы, необходимые для подключения
драйверов
ODBC,
такие
как
OdbcCommand,
к большинству
OdbcConnection,
OdbcDataReader и OdbcDataAdapter. Драйверы ODBC поставляются для
всех видов источников данных и конфигурируются через значок Data
Sources (Источники данных) панели управления.
3.3. Разработка приложения с простым отчетом в среде Microsoft
Visual Studio 2013 C#
Создадим простое приложение в стиле Visual Studio C# Windows Forms,
которое будет отображать данные из произвольной таблицы базы данных в сетке
строк с возможностью их редактирования. Для соединения с базой данных будем
использовать объект DataSet, а настройку соединения произведем по упрощенной
методике с помощью Мастера настройки источника данных.
1. Запустите интегрированную среду разработки Visual Studio: Пуск -> Все
программы -> Visual Studio 2013 -> VS Express 2013 для Desktop.
2. Создайте новый проект: в открывшемся окне Visual Studio Начальная страница
выберите Создать проект … Далее в диалоговом окне Создать проект:
Установленные -> Шаблоны -> Visual C# -> Приложение Windows Forms ->
флажок Создать каталог для решения -> выберите каталог расположения
решения (где будут размещены файлы разрабатываемого приложения) в
строке Расположение: -> укажите имя решения (например, OracleApplication1) в
строке Имя: -> OK (рис. 5.2).
Рис. 5.2. Окно Создать проект
3. В свойство Text формы Form1 введите текст названия главного окна
приложения (например, Таблица БД). Сохраните решение (проект) в своей
рабочей папке Файл -> Сохранить (или Сохранить все). Не забывайте в ходе
выполнения работы периодически сохранять проект из меню Файл или
соответствующими кнопками панели инструментов.
4. Добавьте в проект источник данных: меню Проект -> Добавить новый источник
данных. Открывается окно Мастер настройки источника данных: Выбор типа
источника данных - База данных -> Далее -> Выбор модели базы данных –
Набор данных -> Далее -> Выбор подключения базы данных – Создать
подключение. Открывается диалоговое окно Добавить подключение (рис. 5.3).
Щелкните Изменить… Откроется диалоговое окно Сменить источник данных
(рис. 5.4). Выберите для Поставщик данных значение из выпадающего списка
Поставщик данных .NET Framework для OLE DB -> OK.
Рис. 5.3. Окно Добавить подключение
Рис. 5.4. Окно Сменить источник данных
5. В окне Добавить подключение (рис. 5.3) для Поставщик OLE DB из
выпадающего списка выберите значение Oracle Provider for OLE DB, затем
щелкните Каналы передачи данных… Открывается диалоговое окно Свойства
канала передачи данных (рис. 5.5).
Рис. 5.5. Окно Свойства канала передачи данных
6. Теперь надо правильно написать строку Источник данных. Для этого найдите
файл
tnsnames.ora
(обычно
он
находится
в
папке
oraclexe\app\oracle\product\11.2.0\server\NETWORK\ADMIN) и откройте его с
помощью текстового редактора Блокнот. Найдите в нем запись по базе данных
XE (рис. 5.6). Используя эту запись, введите строку Источник данных в
формате HOST:PORT/SERVICE_NAME. Введите имя и пароль пользователя
(HR), установите флажок Разрешить сохранение пароля. Щелкните на кнопке
Проверить соединение для того, чтобы убедиться в правильности параметров
соединения. Закройте Блокнот. Щелкните ОК, чтобы закрыть редактор свойств
канала передачи данных.
Рис. 5.6. Запись по базе данных XE в файле tnsnames.ora
7. Теперь окно Добавить подключение примет вид, соответствующий рис. 5.3.
Щелкните OK. Окно Выбор подключения базы данных принимает вид,
показанный на рис. 5.7. В нем показываются параметры подключения к БД.
Щелкните Далее.
Рис. 5.7. Окно Выбор подключения базы данных
8. В открывшемся окне Сохранение подключения в файле конфигурации
приложения проверьте установку флажка Да и наличие имени подключения,
затем Далее.
9. В открывшемся окне Выбор объектов базы данных (рис. 5.8) раскройте дерево
Таблицы и поставьте флажки на всех таблицах схемы HR, затем щелкните
Готово.
Рис. 5.8. Окно Выбор объектов базы данных
10. Проверьте правильность соединения с источником данных. Для этого откройте
окно Источники данных – оно в свернутом виде находится в левой части
главного окна Visual Studio Express 2013. Окно Источники данных можно также
открыть из пункта меню Просмотр -> Другие окна -> Источники данных. В этом
окне должно отобразиться дерево источника данных DataSet1 с именами
таблиц и их столбцов (рис. 5.9). Закройте окно Источники данных.
Рис. 5.9. Окно Источники данных
11. Приступим к разработке пользовательского интерфейса приложения. Общий
его вид будет следующим. На форме Form1 будет расположена панель с
закладками, имена закладок – это имена таблиц, а на самих закладках будут
находиться сетки строк с данными из соответствующих таблиц. Количество
закладок – не менее четырех. Откройте окно Панель элементов. Оно в
свернутом виде расположено в левой части главного окна Visual Studio Express
2013. Или же его можно также открыть из пункта меню Просмотр -> Панель
элементов. Найдите в группе Контейнеры элемент TabControl и перетащите
его на форму, расположив в средней части.
12. Далее откройте окно Источники данных и перетащите одну из таблиц в
центральную часть контейнера первой вкладки элемента tabControl1. При
необходимости отрегулируйте размеры формы и контейнера. В верхней части
формы при этом должна появиться панель навигатора, а в нижней панели
рабочего окна – имена автоматически созданных элементов BindingSource,
TableAdapter, TableAdapterManager, BindingNavigator (рис. 5.10).
Рис. 5.10. Форма приложения Form1
13. Запустите проект на компиляцию и выполнение. Убедитесь в отсутствие
ошибок и правильности отображения данных. Навигатор должен правильно
взаимодействовать с сеткой строк. Попробуйте перемещаться по строкам
таблиц и редактировать их – вставлять новые, изменять значения в столбцах,
удалять с подтверждением действий с помощью кнопок навигатора.
14. Произведите настройку навигатора, контейнера tabControl1 и сетки строк
…GridView с помощью окна Свойства, находящегося в правой части главного
окна Visual Studio (рис. 5.11). Для свойства Dock установите такие значения:
для навигатора – Bottom, для контейнера – Fill, для сетки строк - Fill. Запустите
проект на компиляцию и выполнение. Убедитесь, что при изменении размеров
формы происходит правильное изменение размеров визуальных компонентов.
Рис. 5.11. Окно Свойства
15. Произведите настройку контейнера tabControl1 для его свойства tabPages,
щелкнув по его кнопке … , при этом откроется окно Редактор коллекции
TabPage (рис. 5.12). С помощью кнопки Добавить установите нужное
количество вкладок. В свойстве Text вкладок запишите названия
соответствующих таблиц.
Рис. 5.12. Редактор коллекции TabPage
16. На все вкладки контейнера из окна Источники данных перетащите
соответствующие таблицы (п.12). Настройте свойство Dock компонентов
…GridView новых таблиц (п.14). Запустите проект на компиляцию и
выполнение. Переключая вкладки контейнера, убедитесь в правильности
отображения данных.
17. Мы не написали еще ни одной строчки кода, а приложение уже работает. Но
кое-что написать надо. Дело в том, что навигатор оказался связан только с
самой первой таблицей, которая была ассоциирована с первой вкладкой.
Теперь его надо связать и с остальными таблицами. Это можно сделать,
написав обработчик события изменения активной вкладки контейнера
tabControl1. Навигатор имеет свойство BindingSource, и в него надо
устанавливать значения … BindingSource соответствующих таблиц.
18. Для этого в окне Свойства контейнера tabControl1 перейдите на вкладку
События
(кнопка
с
пиктограммой
молнии).
Найдите
событие
SelectedIndexChanged в группе Поведение (рис. 5.13). Это событие возникает
при переключении вкладок. Дважды щелкните по имени этого события.
Рис. 5.13. Событие SelectedIndexChanged
19. В открывшемся окне кода программы Form1.cs напишите тело обработчика
события tabControl1_SelectedIndexChanged по образцу, показанному на рис.
5.14. Этот обработчик должен осуществлять привязку компонента навигатора к
той таблице, которая будет показана на активной вкладке компонента
tabControl1. В этом обработчике для всех вкладок компонента tabControl1,
идентифицируемых по индексу tabControl1_SelectedIndex, следует написать
оператор присвоения свойству BindingSource навигатора (в примере –
rEGIONBindingNavigator.BindingSource)
соответствующего
значения,
связанного с таблицей, которая отображается на выбранной вкладке
(например, cOUNTRIESBindingSource). Количество таких присвоений должно
равняться количеству вкладок в компоненте tabControl1.
Рис. 5.14. Обработчик события SelectedIndexChanged
20. Запустите проект на компиляцию и выполнение. Переключая вкладки
контейнера, убедитесь в правильности привязки навигатора к сеткам строк
актуальных таблиц.
4. Меры безопасности
Во время выполнения лабораторной работы необходимо:
 соблюдать правила включения и выключения вычислительной техники;
 не подключать кабели, разъемы и другую аппаратуру к компьютеру, не
относящиеся к лабораторной установке;
 при включенном напряжении сети не отключать, не подключать и не
трогать кабели, соединяющие различные устройства компьютера;
 в случае обнаруженной неисправности в работе оборудования или
нарушения правил техники безопасности сообщить руководителю
лабораторной работы;
 не пытаться самостоятельно устранить неисправности в работе
аппаратуры;
 по окончании работы привести в порядок рабочее место.
ВНИМАНИЕ! При работе за компьютером необходимо помнить: к каждому
рабочему месту подведено опасное для жизни напряжение. Поэтому во время
работы надо быть предельно внимательным и соблюдать все требования техники
безопасности!
5. Задание
1. Запустить интегрированную среду разработки Microsoft Visual Studio 2013.
Создать новый проект в стиле Приложение Windows Forms C#.
2. Создать подключение к базе данных и выбрать таблицы для отображения в
приложении.
3. Разработать пользовательский интерфейс приложения.
4. Создать обработчик события для переключения вкладки активной таблицы.
5. Протестировать работу приложения.
6. Требования к отчету
Отчет должен быть выполнен в текстовом редакторе MS Word. Отчет должен
содержать:
o Краткие теоретические сведения,
o Тексты всех использованных SQL-запросов,
o Результирующие таблицы с данными, показывающие работоспособность
приложений,
o Выводы по проделанной работе.
7. Контрольные вопросы
7.1. Что такое приложение БД?
7.2. Какие средства доступа к базам данных используются в рамках платформы
Microsoft .NET Framework?
7.3. Какие компоненты являются поставщиками данных?
7.4. Какова архитектура компонентов ADO.NET?
7.5. Что представляет собой объект класса DataSet?
7.6. Как производится подключение к базе данных при разработке приложения?
7.7.
Какие
графические
компоненты
используются
при
разработке
пользовательского интерфейса приложения базы данных?
7.8. Как связываются между собой визуальные и невизуальные компоненты при
программировании в среде Microsoft Visual Studio C#?
7.9. Как разрабатываются обработчики событий?
Download