Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы Java и C# технологии.doc
Скачиваний:
171
Добавлен:
01.03.2016
Размер:
3.04 Mб
Скачать
    1. Задание на лабораторную работу

Доработать приложение, описанное в порядке выполнения работы, чтобы в компоненте TreeViewотображались дополнительно перечисления и структуры, а также не только публичные поля классов, но и приватные. Также необходимо чтобы при нажатии на любой класс, интерфейс, структуру или перечисление в компонентеListViewотображалась подробная информация о них. При нажатии на метод, конструктор или поле необходимо выводить вListViewтипы полей, входные и возвращаемые параметры методов и параметры конструкторов.

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

    1. Содержание отчета

  • фамилия и имя исполнителя лабораторной работы;

  • номер и название лабораторной работы;

  • цель лабораторной работы;

  • краткие теоретические сведенья на одну страницу;

  • ход работы (листинги программ, скриншоты программ);

  • выводы о проделанной работе.

    1. Контрольные вопросы

  1. Что такое сборка?

  2. Из чего состоит сборка?

  3. Что такое рефлексия?

  4. Как загрузить сборку?

  5. Как получить данные о типах сборки?

  6. Чем отличается сборка с расширением exeот сборки с расширениемdll?

  1. Лабораторная работа №3ADO.NET

    1. Цель работы

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

    1. Теоретические сведенья

      1. Общие сведения об ADO.NET

ADO.NET (ActiveX Data Object.NET)– набор классов, используемый для доступа к источникам данных в платформе .NET.ADO.NETподдерживает асинхронный доступ к данным и сериализацию данных, получаемых из хранилища, в форматеXML.

ADO.NETне предлагает единого набора типов для связи со всеми СУБД. В пространстве именSystem.Data.Commonнаходятся базовые классы и интерфейсы, а соответствующие производные типы для разных поставщиков данных – в одноименных пространствахSystem.Data.SqlClient,System.Data.Odbcи т.п.

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

Библиотеки ADO.NETмогут использоваться в рамках двух концептуально различных способах взаимодействия: на связном уровне, для чего используются классы подсоединенных объектов или несвязном уровне, где нужны классы отсоединенных объектов (рис.3.1).

Рисунок 3.1 –Организация классовADO.NET

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

      1. Связный уровень взаимодействия ado.Net

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

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

Предположим, что в файле конфигурации указаны строки соединения и поставщика данных:

< cоnfiguration>

<appSettings>

<!-- Какой поставщик? -->

<add key="provider" value="System.Data.SqlClient" />

<!-- Какая строка соединения? -->

<add key="cnStr" value=

"Data Source=localhost;uid=sa;pwd=;Initial Catalog=Pubs"/> </appSettings>

</configuration>

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

// Получение строк соединения и поставщика данных

// изконфигурационногофайла

string dp = ConfigurationManager.AppSettings("provider");

string cnStr = ConfigurationManager.AppSettings("cnStr");

// Создание источника поставщика.

DbProviderFactory df = DbProviderFactories.GetFactory(dp);

// Создание объекта соединения

DbConnection сn = df.CreateConnection();

cn.CornneccionString = cnStr;

cn.Open();

Далее необходимо разместить и настроить объект команды, передав ему объект соединения в виде аргумента конструктора или с помощью свойстваConnection. Вид соответствующей команды указывается с помощью свойстваCommandType, которое может принимать значенияStoredProcedure,TableDirect, и по умолчанию принимает значениеText.

//Создание объекта команды

DbCommand cmd = df.CreateComnmand();

cmd.Connection = cn;

cmd.CommandText = "Select * From Authors";

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

После создания активного соединения и SQL-команды следующим шагом является предъявление запроса источнику данных. Тип DbDataReader(реализующийIDataReader) обеспечивает самый простой и самый быстрый способ получения информации из хранилища данных. Объекты чтения данных создают однонаправленный и доступный только для чтения поток данных, возвращающий по одной записи за один раз. Поэтому должно быть вполне очевидно, что объекты чтения данных используются для отправки хранилищу данных только SQL-операторов выборки данных.

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

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

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

// Вывод данных с помощью объекта чтения данных

DbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

while (dr.Read())

Console.WriteLine("{0}, {1}", dr[au.lname"], dr[au.fname");

// Поскольку был указан CommandBehavior.CloseConnection,

// то для соединения нет необходимости явно вызывать Close()

dr.Close();

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

Также, объекты команд ADO.NET поддерживают коллекцию дискретных типов параметра. По умолчанию эта коллекция пуста, но можно добавить в нее любое число объектов параметра, которые должны будут отображаться в "заместитель" параметра в SQL-запросе. Чтобы ассоциировать параметр в SQL-запросе с членом коллекции параметров данного объекта команды, нужно добавить к текстовому SQL-параметру префикс @ (это работает, как минимум, при использовании MicrosoftSQLServer, но такое обозначение поддерживают не все СУБД).

string sql = string.Format("Insert Into Inventory" + "(CarlD, Make, Color, PetName, Values" + "(@CarID, @Make, @Color, @PetName)");

// Наполнение коллекции параметров

SqlParameter param = new SqlParameter();

param.ParameterName = "@СагID";

param.Value = newCarID;

param.SqlDbType = SqlDbType.Int;

cmd.Parameters.Add(param);