- •1.4. Адаптер данных (объект DataAdapter) 13
- •1. Ado.Net как базовый объект доступа к базам данных
- •1.1. Структура компонента доступа к данным ado.Net
- •1.1.1. Работа в отрыве от источника данных
- •1.1.2. Взаимодействие с базой данных через команды
- •1.1.3. Взаимодействие с базой данных через объект DataSet
- •1.1.4. Независимость набора данных DataSet от источника данных
- •1.1.5. Обмен данными в формате xml
- •1.1.6. Схемы, определяющие структуру данных
- •1.2. Сравнение ado.Net и ado
- •1.2.1. Представление данных в памяти
- •1.2.2. Навигация по данным и курсоры
- •1.2.3. Минимизация открытых соединений
- •1.2.4. Разделение данных между приложениями
- •1.3. Соединение с источником данных (объект Connection)
- •1.3.1. Строка соединения
- •1.3.2. Открытие и закрытие соединения
- •1.3.3. Пул соединений
- •1.3.4. Транзакции
- •1.3.5. Конфигурирование свойств Connection
- •1.3.6. Объект Connection и безопасность
- •1.3.7. Создание объекта Connection в режиме дизайнера с помощью Server Explorer
- •1.3.8. Инструменты Visual Studio для создания объектов Connection
- •1.3.9. Создание объекта Connection в ado.Net
- •1.4. Адаптер данных (объект DataAdapter)
- •1.4.1. Адаптеры данных и связанные таблицы
- •1.4.2. Адаптеры данных и объекты Command
- •1.4.3. Чтение и обновление данных с использованием объекта DataAdapter
- •1.4.4. Параметры команд объекта DataAdapter
- •1.4.5. Свойство TableMappings объекта DataAdapter
- •1.4.6. Создание объекта DataAdapter
- •1.4.7. Конфигурирование параметров объекта DataAdapter
- •1.4.8. Связывание колонок таблиц источника данных и объекта DataSet через адаптер данных
- •1.4.9. Предварительный просмотр данных, полученных объектом DataAdapter
1.4. Адаптер данных (объект DataAdapter)
Объект DataAdapter — один из важнейших элементов ADO.NET. Этот объект является посредником между источником данных и набором данных DataSet. В приложениях DataAdapter обеспечивает считывание информации их базы данных и пересылку ее в DataSet, возврат изменений, сделанных пользователем, в исходную базу данных. Объект DataAdapter может работать не только с базами данных, он способен связать объект DataSet с любым источником и набором данных.
Вообще, DataAdapter является объектом с перестраиваемой конфигурацией, что позволяет разработчикам задавать, откуда и какую информацию перемещать в объект DataSet и из него. Задача перемещения данных решается через использование команд на основе SQL-запросов или хранимых процедур. В Visual Studio имеется два типа адаптера данных:
-
Объект OleDbDataAdapter, который используется для работы с любым источником данных, доступных через OLE DB-провайдера;
-
Объект SqlDataAdapter, который используется для работы с данными, хранящимися в SQL Server версии 7.0 и выше. Поскольку SqlDataAdapter оптимизирован для работы именно с этим источником данных, то он работает с ним более эффективно и быстрее чем
OieDbDataAdapter.
Вы можете создать и управлять адаптерами, используя части .NET Framework, указанные на рис. 1.8.
Каждый объект DataAdapter обеспечивает обмен данными между одной таблицей источника данных (базы данных) и одним объектом DataTable в наборе данных DataSet. Если DataSet сдержит несколько таблиц (объектов DataTable), то необходимо иметь и несколько адаптеров данных (рис. 1.9).
Когда требуется заполнить данными таблицу в DataSet, вызывается соответствующий метод (Fill) объекта DataAdapter, который по сути дела выполняет SQL-запрос или хранимую процедуру. Также DataAdapter создает объект чтения данных (OleDbDataReader или SqlDataReader), чтобы считать данные из источника в DataSet. Точно так же, когда необходимо модифицировать базу данных, вызывается соответствующий метод (Update) объекта DataAdapter, который вызывает на исполнение соответствующий SQL-запрос или хранимую процедуру (рис. 1.9). В результате этого все изменения, внесенные пользователем в таблицы набора данных, будут возвращены в соответствующие таблицы базы данных.
1.4.1. Адаптеры данных и связанные таблицы
Несмотря на то, что в объекте DataSet может быть несколько связанных таблиц, DataAdapter не имеет в SQL-запросах или хранимых процедурах команд (параметров), отражающих эти реляционные связи. Да это и физически невозможно — ведь, как мы уже раньше отмечали, DataAdapter работает только с одной таблицей в базе данных и с одной таблицей в наборе данных DataSet. Для создания и хранения реляционных связей в DataSet используется другой объект — DataRelation. Кроме возможности создавать и хранить реляционные связи данный объект позволяет управлять ограничениями на работу с таблицами набора данных (например, реализовать каскадное обновление или удаление), а также обеспечивает навигацию в дочерней таблице при перемещении по записям в родительской таблице.
Например, представьте, что вам нужно получить данные из двух связанных таблиц базы данных Northwind: Customers и Orders ("Клиенты" и "Заказы") и показать их в одном объекте DataGrid. Раньше для этого понадобилось бы выполнить объединение этих двух таблиц в одну, например, с использованием оператора join в SQL-запросе, чтобы получить единственный набор записей Recordset и затем его связать с DataGrid. Теперь достаточно определить два объекта DataAdapter: один, чтобы заполнить таблицу customers ("Клиенты") в DataSet и второй, чтобы заполнить таблицу Orders ("Заказы"). В DataSet с использованием объекта DataRelation можно указать, что записи таблицы orders связаны с записями таблицы customers полем customeriD, после чего связать DataSet с объектом DataGrid. Теперь, имея заполненный объект DataSet и отключившись от исходной базы данных, вы по своему желанию можете работать как с каждой таблицей отдельно, так и, вызвав необходимые свойства и методы объекта DataRelation, со связанной парой таблиц. Этого в принципе невозможно было сделать с объектом Recordset, так как он заполнялся информацией из уже объединенного набора записей. Такая возможность является неоспоримым преимуществом
объекта DataSet над объектом Recordset.
Объекту DataAdapter для работы нужно иметь открытое соединение с источником данных, чтобы читать и записывать информацию. Поэтому DataAdapter использует объекты OleDbConnection или SqlConnection, чтобы связаться с источником данных. DataAdapter может одновременно поддерживать до четырех открытых соединений, по одному для каждого типа действия, которое он может выполнить: select, update, insert и delete. Объект OleDbConnection обеспечивает соединение с любым источником данных OLE DB-провайдера. Объект SqlConnection обеспечивает соединение с SQL Server 7.0 и выше. В обоих случаях, объект Connection представляет уникальный сеанс соединения с источником данных.