Опубликован: 04.05.2010 | Уровень: для всех | Доступ: платный
Лекция 7:

Проектирование баз данных и работа с ними Веб-приложений. Введение в БД, SQL Server, ADO.NET

9.2.2. ADO.NET

9.2.2.1. Общие сведения

ADO.NET представляет собой набор библиотек, входящих в Microsoft .NET Framework предназначенных для взаимодействия с различными хранилищами данных из .NET приложений [34-37]. Библиотеки ADO.NET включают все необходимые классы для подключения к источникам данных практически произвольного формата, выполнения запросов к этим источникам и получения результата. Кроме того, несомненным достоинством ADO.NET является возможность работы с отсоединенными источниками данных, представляющих собой структуры, организующие данные в оперативной памяти компьютера, работать с которыми возможно с использованием ставших уже привычными средств доступа к данным.

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

Иерархия объектов ADO.NET

увеличить изображение
Рис. 9.9. Иерархия объектов ADO.NET

Объекты, расположенные в левой части называются подсоединенными и необходимы для управления соединением, транзакциями, выборкой данных и передачей изменений данных в БД, т.е. они непосредственно взаимодействуют с базой данных.

  • Объект Connection представляет соединение с источником данных.
  • Объект Transaction позволяет осуществлять транзакции.
  • Объект DataAdapter представляет собой связующее звено между отсоединенными объектами ADO.NET и базой данных. С его помощью осуществляется заполнение таких объектов как DataSet или DataTable значениями, полученными в результате выполнения запроса к базе данных для последующей автономной работы с ними. Помимо этого, DataAdapter реализует эффективный механизм выполнения обновления данных, хранимых в базе данных изменениями, внесенными в данные объектов DataSet и DataTable.
  • Объект Command представляет запрос к источнику данных, вызов хранимой процедуры или прямой запрос на возврат содержимого конкретной таблицы.
  • Объект Parameter позволяет вводить в запрос элемент, значение которого может быть задано непосредственно перед исполнением запроса.
  • Объект DataReader предназначен для максимально быстрой выборки и просмотра возвращаемых запросом записей.

Объекты, расположенные в правой части называются отсоединенными и позволяют работать с данными автономно.

  • Объект DataSet представляет собой отсоединенный набор данных, который может рассматриваться как контейнер для объектов DataTable. DataSet позволяет организовывать внутри себя структуру, полностью соответствующую реальной структуре таблиц и связей между ними в БД.
  • Объект DataTable позволяет просматривать данные в виде наборов записей и столбцов.
  • Объект DataColumn представляет собой столбец объекта DataTable. Набор же всех столбов объекта DataTable представляет собой коллекцию Columns.
  • Объект DataRow представляет собой строку объекта DataTable. Набор всех строк этого объекта представляет собой коллекцию Rows.
  • Объект DataView предназначен для организации возможности просмотра содержимого DataTable различными способами. Это относится к таким операциям, как сортировка и фильтрация записей.
  • Объект DataRelation представляет собой описание связей между таблицами реляционной базы данных. Он предоставляется объектом DataSet и позволяет организовывать взаимосвязи между таблицами отсоединенного набора данных объекта DataSet.

Одной из основных идей, лежащих в основе ADO.NET является наличие поставщиков данных.

Поставщик данных – это набор классов, предназначенных для взаимодействия с хранилищем данных определенного типа. Рассмотрим уровни модели поставщиков ADO.NET (рис. 9.10).

Уровни моделей поставщиков ADO.NET

увеличить изображение
Рис. 9.10. Уровни моделей поставщиков ADO.NET

Как видно из рис. 9.10, приложение .NET взаимодействует с базой данных посредством поставщиков данных. Каждый поставщик данных может обеспечивать доступ только к базе данных определенного формата. Так, для доступа к БД Microsoft SQL Server используется поставщик SQL Server для .NET, для доступа к БД Oracle – поставщик Oracle для .NET и т.д. Если поставщики данных для каких-либо СУБД не выделены в ADO.NET, то для взаимодействия с ними может применяться поставщик данных OleDb для .NET или ODBC для .NET, которые обеспечивают доступ к любым данным, для которых существует драйвер OleDb, либо ODBC соответственно. Тем не менее, всегда предпочтительнее использовать тот поставщик данных, который специально предназначен для обеспечения доступа к данному источнику данных, т.к. он учитывает его особенности.

Каждый поставщик .NET реализует одинаковые базовые классы – Connection, Transaction, DataAdapter, Command, Parameter, DataReader имена которых зависят от поставщика. Например, у поставщика SQL Server существует объект SqlDataAdapter, у поставщика OleDb – OleDbDataAdapter и т.д.

У каждого поставщика данных существует собственное пространство имен. Хотя все поставщики относятся к пространству имен System.Data, каждый из них содержит свой подраздел этого пространства, который содержит объекты, специфичные для данного поставщика. Например, объект SqlDataAdapter находится в пространстве имен System.Data.SqlClient.

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

9.2.2.2. Организация взаимодействия с БД

Для того чтобы приложение .NET могло осуществлять взаимодействие с источником данных, необходимо установить соединение с ним. Наиболее типичным сценарием работы Веб-приложения с БД является следующий:

  1. Устанавливается соединение, открывается подключение к базе данных.
  2. Выполняется один или несколько запросов, осуществляющих внесение изменений в наборы данных источника данных, а также выборку данных из БД.
  3. Осуществляется отключение от источника данных. При этом пользователь работает с отсоединенным набором данных, просматривая его, выполняя фильтрацию, внося изменения и т.д.
  4. При необходимости переноса изменений, из отсоединенного набора данных в БД, а также при необходимости просмотра изменений, внесенных в БД другими пользователями, осуществляется подключение к источнику данных, выполняются необходимые действия, после чего производится отключение от БД.

Рассмотрим описанные выше этапы более подробно.

9.2.2.2.1. Подключение к БД

Для того чтобы подключиться к базе данных во время выполнения программы, необходимо создать объект Connection, а также задать его свойства, определяющие текущие параметры подключения. Основным параметром, устанавливающим необходимые опции для подключения к БД, является строка соединения, которая представляет собой набор пар "имя-значение", разделенных точкой с запятой. Строка соединения зависит от СУБД, к которой осуществляется подключение, а также от используемого поставщика данных. Тем не менее, существует несколько фрагментов информации, указываемой в строке подключения, необходимых практически всегда:

  • Адрес сервера, на котором находится база данных.
  • Имя базы данных, к которой производится подключение.
  • Способ аутентификации пользователя (например, имя пользователя и пароль для проверки возможности доступа к базе данных).

Дальнейшие примеры кода рассмотрены применимо к СУБД SQL Server 2008 Express.

Для подключения к БД используется объект Connection из пространства имен System.Data.SqlClient. Строка соединения с базой данных при этом будет выглядеть следующим образом:

string strSqlConnection = "Data Source=localhost\\sqlexpress;Initial
Catalog=FORTEST;Integrated Security=SSPI";

где

  • Data Source=localhost\\sqlexpress – указывает, что подключаемся к localhost;
  • Initial Catalog=FORTEST – указывает, что имя базы данных FORTEST ;
  • Integrated Security=SSPI – указывает на windows-авторизацию к SQL Server.

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

SqlConnection sqlCon=new SqlConnection(strSqlConnection);
sqlCon.Open();

или

SqlConnection sqlCon=new SqlConnection();
sqlCon.ConnectionString= strSqlConnection;
sqlCon.Open();

Строку соединения с базой данных можно жестко прописать в исходном коде приложения, однако, это не самый лучший вариант, т.к. при изменении пути к базе данных, либо других параметров соединения придется вносить изменения в исходный код приложения и перекомпилировать его. В связи с этим, лучше всего использовать строку соединения, сохраненную в файле web.config.

<connectionStrings>
    <add name="FORTEST_ConnectionString" 
         connectionString="Provider= System.Data.SqlClient;Data 
                           Source=C:\FORTEST.mdb"/>	
</connectionStrings>

Впоследствии эту строку можно извлечь из файла web.config:

string strSqlConnection = WebConfigurationManager.ConnectionStrings 
 ["FORTEST_ConnectionString"].ConnectionString;

Управление соединением осуществляется с помощью методов Open и Close объекта Connection. Однако следует учитывать, что при подключении к базе данных может произойти сбой, в результате которого установить соединение с ней окажется невозможно. Поэтому рекомендуется использовать конструкции try catch, позволяющие адекватно реагировать на возникшую ошибку:

try
{
    sqlCon.Open();
}
catch(Exception ex)
{
    return ex.Message;
}

Для обслуживания соединения с базой данных расходуются ресурсы компьютера, на котором выполняется Веб-приложение. В связи с этим, рекомендуется открывать соединение как можно позже, а закрывать как можно раньше, сразу после того, как все необходимые действия с объектами базы данных были выполнены. Кроме того, желательно строить программный код так, чтобы соединение с базой данных закрывалось при любом исходе соединения с ней (т.е. выполнялся метод Close() ).

Владимир Тадеуш
Владимир Тадеуш
Украина
Кирилл Дубовик
Кирилл Дубовик
Россия, Петрозаводск