Проектирование баз данных и работа с ними Веб-приложений. Введение в БД, 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).
Объекты, расположенные в левой части называются подсоединенными и необходимы для управления соединением, транзакциями, выборкой данных и передачей изменений данных в БД, т.е. они непосредственно взаимодействуют с базой данных.
- Объект 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).
Как видно из рис. 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 могло осуществлять взаимодействие с источником данных, необходимо установить соединение с ним. Наиболее типичным сценарием работы Веб-приложения с БД является следующий:
- Устанавливается соединение, открывается подключение к базе данных.
- Выполняется один или несколько запросов, осуществляющих внесение изменений в наборы данных источника данных, а также выборку данных из БД.
- Осуществляется отключение от источника данных. При этом пользователь работает с отсоединенным набором данных, просматривая его, выполняя фильтрацию, внося изменения и т.д.
- При необходимости переноса изменений, из отсоединенного набора данных в БД, а также при необходимости просмотра изменений, внесенных в БД другими пользователями, осуществляется подключение к источнику данных, выполняются необходимые действия, после чего производится отключение от БД.
Рассмотрим описанные выше этапы более подробно.
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() ).