Лекция: Взаимодействие базы данных с ADO.NET. Объект OleDbDataAdapter. Заполнение DataSet. Обновление источников данных
ADO.NET — это часть Microsoft .NET Framework, т.е. набор средств и слоев, позволяющих приложению легко управлять и взаимодействовать со своим файловым или серверным хранилищем данных.
В NET Framework библиотеки ADO.NET находится в пространстве имени System.Data. Эти библиотеки обеспечивают подключение к источникам данных, выполнении команд, а также хранилище, обработку и выборку данных.
ADO.NET отличается от предыдущих технологий доступа к данным тем, что она позволяет взаимодействовать с базой данных автономно. Автономный доступ к данным необходим, когда невозможно удерживать открытое физическое подключение к базе данных каждого отдельного пользователя или объекта.
Важным элементом автономного доступа к данным является контейнер для табличных данных, который не знает о СУБД. Такой незнающий о СУБД автономный контейнер для табличных данных представлен в библиотеках ADO.NET классом DataSet или DataTable:
DataSet. Класс DataSet является ядром автономного режима доступа к данным в ADO.NET. Лучше всего рассматривать, как будто в нем есть своя маленькая СУБД, полностью находящаяся в памяти.
DataTable. Больше всего этот класс похож на таблицу БД. Он состоит из объектов DataColumn, DataRow, представляющих из себя строки и столбцы.
Класс OleDbDataAdapter gредставляет набор команд данных и подключение базы данных, которые используются для заполнения DataSet и обновления источника данных.
Иерархия наследования:
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Data.Common.DataAdapter
System.Data.Common.DbDataAdapter
System.Data.OleDb.OleDbDataAdapter
Синтаксис:
public sealed class OleDbDataAdapter: DbDataAdapter, IDbDataAdapter, IDataAdapter, ICloneable
Существует несколько способов работы с DataSet, которые могут применяться отдельно или в сочетании. Можно сделать следующее:
Программно создать DataTable, DataRelation и Constraint внутри DataSet и заполнить таблицы данными.
Заполнить DataSet таблицами данных из существующего реляционного источника данных с помощью DataAdapter.
Загрузить и сохранить содержимое DataSet с помощью XML-кода.
Заполнение DataSet из адаптера данных DataAdapter
Набор данных ADO.NET DataSet является находящимся в памяти представлением данных, предоставляющим согласованную реляционную программную модель, независимую от источника данных. Набор данных DataSet представляет собой полную совокупность данных, которая включает таблицы, ограничения и связи между таблицами. Набор данных DataSet является независимым от источника данных, поэтому DataSet может включать данные, локальные по отношению к приложению, а также данные из нескольких источников данных. Управление взаимодействием с существующими источниками данных осуществляется с помощью DataAdapter.
Свойство SelectCommand объекта DataAdapter представляет собой объект Command, получающий данные из источника данных. Свойства InsertCommand, UpdateCommand и DeleteCommand, принадлежащие DataAdapter, являются объектами Command, которые управляют обновлением данных в источнике данных в соответствии с изменениями данных в DataSet.
Метод Fill объекта DataAdapter служит для заполнения набора данных DataSet результатами выполнения метода SelectCommand объекта DataAdapter. Метод Fill принимает в качестве аргумента подлежащий заполнению набор данных DataSet, а также объект DataTable или имя объекта DataTable, который должен быть заполнен строками, возвращенными методом SelectCommand.
Пример:
// Assumes that connection is a valid SqlConnection object.
string queryString = «SELECT CustomerID, CompanyName FROM dbo.Customers»;
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
DataSet customers = new DataSet();
adapter.Fill(customers, «Customers»);
Обновление источников данных с помощью объектов DataAdapter
Метод Update объекта DataAdapter вызывается для решения задачи по передаче изменений из DataSet обратно в источник данных. Метод Update, как и метод Fill, принимает в качестве аргументов экземпляр DataSet, а также (необязательно) объект DataTable или имя DataTable. Экземпляр DataSet представляет собой объект DataSet, который содержит выполненные изменения, а DataTable указывает на таблицу, из которой должны быть получены эти изменения. Если ни один объект DataTable не задан, используется первый объект DataTable в DataSet.
При вызове метода Update в DataAdapter анализируются внесенные изменения и выполняется соответствующая команда (INSERT, UPDATE или DELETE). Если в DataAdapter обнаруживается изменение в DataRow, то в этом объекте используется команда InsertCommand, UpdateCommand или DeleteCommand для обработки этого изменения. Это позволяет максимально повысить производительность приложения ADO.NET путем задания синтаксиса команды во время разработки, а также, по возможности, за счет применения хранимых процедур. Необходимо явно задавать команды перед вызовом Update. Если вызывается Update, и не существует подходящая команда для конкретного обновления (например, отсутствует DeleteCommand для удаленных строк), то активизируется исключение.
Пример:
В следующем примере показано, как выполнить обновления применительно к модифицированным строкам путем явного задания значения UpdateCommand объекта DataAdapter и вызова его метода Update. Обратите внимание на то, что задан параметр, указанный в предложении WHERE инструкции UPDATE, чтобы использовалось значение Original объекта SourceColumn. Это важно, поскольку значение Current могло быть изменено, поэтому может не соответствовать этому значению в источнике данных. Значение Original представляет собой значение, которое использовалось для заполнения DataTable из источника данных.
private static void AdapterUpdate(string connectionString)
{
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlDataAdapter dataAdpater = new SqlDataAdapter(
«SELECT CategoryID, CategoryName FROM Categories»,
connection);
dataAdpater.UpdateCommand = new SqlCommand(
«UPDATE Categories SET CategoryName = @CategoryName » +
«WHERE CategoryID = @CategoryID», connection);
dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryName", SqlDbType.NVarChar, 15, «CategoryName»);
SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryID", SqlDbType.Int);
parameter.SourceColumn = «CategoryID»;
parameter.SourceVersion = DataRowVersion.Original;
DataTable categoryTable = new DataTable();
dataAdpater.Fill(categoryTable);
DataRow categoryRow = categoryTable.Rows[0];
categoryRow[«CategoryName»] = «New Beverages»;
dataAdpater.Update(categoryTable);
Console.WriteLine(«Rows after update.»);
foreach (DataRow row in categoryTable.Rows)
{
{
Console.WriteLine("{0}: {1}", row[0], row[1]);
}
}
}
}
Главная функция OleDbDataAdapter — это перемещение данных из памяти в DataSet и обратно в память, он также создает полностью новые таблицы из существующих данных или выкладывает их как XML.
Три метода используются для удаления, вставки и обновления данных в наборе. Коллекция TableMappings(Отображение таблицы) определяет, как таблицы и столбцы из источников подходят к наборам данных.
Создание объекта OleDbDataAdapter
10: 'Dim objCmd as New OleDbDataAdapter (strSQL,Conn)
13: 'or
14: 'Dim objCmd as New OleDbDataAdapter (strSQL,,strConnectionString)
Запомните: при использовании методов Update, Insert и Delete основные данные фактически не изменяются, а вместо этого изменяется отсоединенный DataSet. Изменения отражаются в источнике данных только после вызова метода OleDbDataAdapter.Update.
Заполнение DataSet
Посмотрим пример заполнения DataSet и затем исследуем различные методы Листинг Заполнение DataSet
1: dim strConnectionString as String =_
2: «Provider=Microsoft.Jet.OLEDB.4.0;» Sb_
3: «Data Source=C: \ASPNET \data \banlcing.mdb»)
4: Dim ds as DataSet =New DataSet{«MyDataSet „)
5: Dim strSQL as String =“SELECT *FROH tblUsers „
6:
7: Dim objCmd as new OleDbDataAdapter{strSQL,_
8: strConnectionString)
9:
10: objCmd.Fill(ds,“Users)