Материал: 0-Технология доступа к данным ADO.NET

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

13

Технология доступа к данным ADO.NET

Технология ADO.NET предоставляет приложениям средства доступа к таким источникам данных как SQL Server и XML, к источникам данных предоставляемых посредством OLE DB и ODBC. Приложения могут использовать ADO.NET для соединения с источниками данных и для получения, обработки и обновления имеющихся в них данных.

Архитектура данных ADO.NET

В Visual Studio .NET есть множество встроенных мастеров и дизайнеров, которые помогут оснастить приложение надежным механизмом доступа к данным, затратив минимум усилий на написание кода. Наряду с этим все возможности объектной модели ADO.NET доступны программно, что позволяет реализовать нестандартные функции или создавать приложения под нужды пользователя.

Доступ к данным в ADO.NET основан на использовании двух компонентов:

  • провайдера данных (Data Provider), выполняющего функции посредника при взаимодействии приложения и баз данных;

  • набора данных – объекта DataSet, в котором данные хранятся на локальном компьютере.

Провайдеры данных

Связь с БД создается и поддерживается при помощи провайдера данных. Провайдер – это набор классов, взаимосвязанных компонентов, обеспечивающих эффективный высокопроизводительный доступ к данным (рис. 1).

Рис. 1. Иерархия классов провайдеров данных ADO.NET

Любой провайдер данных состоит из четырех компонентов:

  1. Connection – обеспечивает подключение к источнику данных. Visual Studio поддерживает следующие классы: SqlConnection – для подключения к SQL Server, OleDbConnection – для подключения к разным базам данных. Данные, необходимые для открытия канала связи с БД, хранятся в свойстве ConnectionString объекта Connection. Объект поддерживает ряд методов, позволяющих обрабатывать данные с применением транзакций.

  2. Command – применяется для управления источником данных. Позволяет исполнять команды SQL для возврата данных, изменения данных, выполнения хранимых процедур и передачи или получения сведений о параметрах. Объект Command использует уже установленное соединение. Представлен классами SqlCommand и OleDbCommand.

  3. DataReader – предоставляет доступный только для однонаправленного чтения набор записей, подключенный к источнику данных. Обеспечивает высокопроизводительный поток данных. В отличие от других компонентов провайдера данных, создавать экземпляры DataReader напрямую нельзя. Его можно получить при помощи методов ExecuteReader объекта Command. Так как в любой момент времени в памяти находится только одна строка, использование объекта DataReader почти не снижает производительность системы, но требует монопольного доступа к открытому объекту Connection в течение времени жизни объекта DataReader. Представлен классами SqlDataReader и OleDbDataReader.

  4. DataAdapter – заполняет отсоединенный объект DataSet или DataTable и обновляет его содержимое. Выполняет функции посредника между объектом DataSet и источником данных. Использует объекты Command для выполнения команд SQL на источнике данных, для загрузки DataSet с данными и согласования изменений данных, выполненных в DataSet вновь с источником данных. Это основной класс ADO.NET, обеспечивающий доступ к отсоединенным данным. При вызове метода Fill() объект заполняет DataTable или DataSet данными, полученными из БД. После обработки данных, загруженных в память, можно записать модифицированные данные в БД, вызвав метод Update(). При вызове метода Update() все измененные данные копируются из объекта DataSet в БД с исполнением команды InsertCommand, DeleteCommand или UpdateCommand.

Организация доступа к данным

Доступ к данным в ADO.NET осуществляется следующим образом:

  1. Объект Connection устанавливает между приложением и БД соединение, напрямую доступное объектам Command и DataAdapter.

  2. Объект Command позволяет исполнять команды непосредственно над БД. Это могут быть команды, не возвращающие данные (INSERT, UPDATE, DELETE). Если исполненная команда возвращает несколько значений (SELECT), объект Command открывает к ним доступ через объект DataReader.

  3. Полученные результаты можно обрабатывать напрямую, используя код приложения, либо через объект DataSet, заполнив его с помощью DataAdapter.

  4. Для обновления БД также используют объекты Command или DataAdapter.

Объект DataSet

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

Объект DataSet содержит набор объектов DataTable (набор может быть пустым). Каждый объект DataTable представляет в памяти компьютера одну таблицу. Структура объекта DataTable определяется двумя наборами (составляющими схему таблицы):

  • набор DataColumns, куда входят все столбцы таблицы;

  • набор ограничений таблицы.

В DataTable также входит объект DataRows, где хранятся данные таблицы. Кроме того, DataSet содержит набор ExtendedProperties, в котором хранятся дополнительные данные объекта.

Класс DataSet в ADO.NET сконструирован для доступа к данным, независимо от их источника. Он может быть использован с разными источниками данных, с XML-данными или для управления локальными данными.

Подключение к базе данных

Есть несколько способов подключения к БД в приложении. Проще всего это сделать при помощи графических инструментов Visual Studio.

Для управления текущими соединениями с источниками данных служит окно Обозреватель баз данных (Server Explorer). Доступные текущие соединения отображаются в виде узлов дерева Подключения данных (Data Connections).

Создание нового подключения:

  1. В окне Обозреватель баз данных необходимо щелкнуть ПКМ по узлу Подключения данных и в контекстном меню выбрать пункт Добавить подключение … (рис. 2).

Рис. 2. Создание нового подключения

  1. В появившемся диалоговом окне Добавить подключение необходимо указать имя сервера, тип SQL-аутентификации и название базы данных (рис. 3). Окно Добавить подключение (Add Connection) позволяет выбрать провайдер данных. При нажатии кнопки Изменить (Change) появится диалоговое окно Сменить источник данных (Change Data Source), которое предоставляет список провайдеров для подключения к базе данных (рис. 4).

Рис. 3. Окно создания нового подключения Добавить подключение (Add Connection)

Выпадающий список Имя сервера позволяет выбрать доступный SQL-сервер. Если в списке сервера нет, то его можно непосредственно ввести в поле ввода. При работе с SQL Server 2012 Express в списке будет видно только имя компьютера. Следует помнить, что устанавливался именованный экземпляр и дописать полное имя сервера вручную (например, OLEG-PC\SQLEXPRESS).

Рис. 4. Окно Сменить источник данных (Change Data Source)

  1. В этом же окне нужно щелкнуть на кнопке Проверить подключение (Test Connection), чтобы убедиться в том, что подключение выполнено (рис. 5).

Рис. 5. Диалоговое окно проверки подключения

  1. После нажатия кнопки OK в узле Подключения данных окна Обозреватель баз данных будет добавлено подключение к БД Book. Под значком подключения расположены каталоги для объектов базы данных (рис. 6).

Рис. 6. Отображение созданного подключения

Объект Connection

Чтобы создать объект Connection в коде программы, надо создать новый объект Command и присвоить его свойству ConnectionString содержимое строки соединения с базой данных:

SqlConnection con = new SqlConnection( );

con.ConnectionString = " < строка подключения > ";

Можно также задать строку подключения в качестве параметра в конструкторе объекта Connection:

SqlConnection con = new SqlConnection(string ConnectionString);

Строку подключения можно взять из окна свойств соединения с базой данных из узла Подключения данных в окне Обозреватель баз данных (рис. 7).

Рис. 7. Окно свойств соединения с базой данных Book

В реальных приложениях строку соединения не задают жестко в коде программы, а выносят во внешний файл настроек приложения. Откройте окно свойств проекта и выберите вкладку Параметры (Settings).

Создайте новый параметр, который будет хранить строку соединения с базой данных:

  • Имя ConString;

  • Тип Connection string;

  • Область Application;

  • Значение – Data Source=OLEG-PC\SQLEXPRESS; Initial Catalog=Book; Integrated Security=True.

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

SqlConnection con = new SqlConnection();

con.ConnectionString = Properties.Settings.Default.ConString;

Рис. 8. Окно свойств проекта

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

Рис. 9. Окно свойств проекта

Объект Command

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

Подобно другим классам компонентов провайдера данных, класс Command представлен двумя вариантами: OleDbCommand – для взаимодействия с разными типами БД; SqlCommand – только для баз данных SQL Server.

Для класса Command достаточно активного подключения, взаимодействие с объектом DataAdapter ему не требуется. Поэтому объекты Command быстро и эффективно взаимодействуют с базами данных. Объект Command позволяет:

  • исполнять команды, не возвращающие значения (например, insert, update, DELETE);

  • исполнять команды, возвращающие единственное значение;

  • исполнять команды языка Database Definition Language (например, create table и ALTER);

  • работать с объектом DataAdapter, возвращающим объект DataSet;

  • возвращать результирующий набор непосредственно через экземпляр объекта DataReader (самый быстрый способ доступа к данным, особенно удобен, если данные требуются только для чтения);

  • возвращать результирующий набор в виде потока XML (эту возможность поддерживает только класс SqlCommand);

  • возвращать результирующий набор, созданный на основе нескольких таблиц или в результате исполнения нескольких операторов.

У объекта Command есть свойство CommandType, определяющее тип команды, содержащейся в свойстве CommandText, оно может принимать одно из следующих значений:

  • Text – значение свойства CommandText рассматривается как текст команды SQL; в свойстве CommandText должен быть один или несколько операторов SQL, разделенных точкой с запятой; в последнем случае операторы SQL выполняются по порядку (в версии Express не работает);

  • StoredProcedure – в свойстве CommandText указывается имя хранимой процедуры, которая будет исполнена при вызове команды;

  • TableDirect – в свойстве CommandText должно быть имя одной или нескольких таблиц. При исполнении команда вернет все столбцы и строки таблиц, заданных свойством CommandText (не для SQL Server, только для Access).

Например, для выборки данных из таблицы Users надо написать код:

SqlCommand cmd = new SqlCommand();

cmd.Connection = con;

cmd.CommandType = CommandType.Text;

cmd.CommandText = “SELECT * FROM Users”;

Свойство Connection устанавливается в соответствии с типом соединения: для объекта SqlCommand требуется соединение на основе объекта SqlConnection, а для OleDbCommand – соединение на основе OleDbConnection.

Объект Command поддерживает три метода:

  • ExecuteNonQuery() – исполняет команды, не возвращающие данные, например INSERT, UPDATE и DELETE;

  • ExecuteScalar() – исполняет запросы к БД, возвращающие единственное значение;

  • ExecuteReader() – возвращает результирующий набор через объект DataReader.

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

Метод ExecuteNonQuery() – самый простой, он не возвращает никаких значений. Этот метод обычно применяют для вызова хранимых процедур или команд SQL, таких как insert, update или delete. Метод ExecuteScalar() возвращает только значение первого поля первой строки, извлеченной заданной командой, независимо от того, сколько строк выбрано этой командой в действительности.

Метод ExecuteReader() возвращает неизменяемый объект DataReader, допускающий только последовательный однонаправленный просмотр без использования объекта DataAdapter. Если не нужно модифицировать содержимое базы данных или манипулировать им, этот способ извлечения данных является самым быстрым и эффективным.

Класс SqlCommand поддерживает еще один метод – ExecuteXmlReader(), возвращающий результирующий набор в формате XML. Результаты возвращаются в виде неизменяемого объекта XmlReader, доступного только для последовательного однонаправленного просмотра.