Среди множества методов классов DataReader (SqlDataReader и OleDbDataReader) около десятка методов, имена который начинаются с приставки Get..., следом за которой – имя какого-то типа. GetInt32, GetBoolean, ...
С помощью этих методов от DataReader можно получить и типизированные значения, а не только объекты базового типа!
int CustomerID;
string Customer;
// Определить порядковый номер поля 'CustomerID'
CustomerID = myDataReader.GetOrdinal("CustomerID");
// Извлечь строку из этого поля и прописать ее в переменную Customer
Customer = myDataReader.GetString(CustomerID);
DataAdapter – составная часть провайдера данных. То есть подсоединенная компонента объектной модели ADO .NET. Используется для заполнения объекта DataSet и модификации источника данных. Выполняет функции посредника при взаимодействии БД и объекта DataSet.
Обеспечивает связь между источником данных и объектом DataSet. С одной стороны, база данных, с другой – DataSet. Извлечение данных и заполнение объекта DataSet – назначение DataAdapter'а.
Функциональные возможности DataAdapter'а реализуются за счет:
Fill, который изменяет данные в DataSet. При выполнении метода Fill объект DataAdapter заполняет DataTable или DataSet данными, полученными из БД. После обработки данных, загруженных в память, с помощью метода Update можно записать модифицированные записи в БД;Update, который позволяет изменять данные в источнике данных с целью достижения обратного соответствия данных в источнике данных по отношению к данным в DataSet.Фактически, DataAdapter управляет обменом данных и обновлением содержимого источника данных.
DataAdapter представляет набор команд для подключения к базе данных и модификации данных.
Три способа создания DataAdapter:
Достойны особого внимания ЧЕТЫРЕ свойства этого класса, фактически представляющие команды БД. Через эти команды объект DataAdapter и воздействует на DataSet и Базу.
SelectCommand – содержит текст (строку sql) или объект команды, осуществляющей выборку данных из БД. При вызове метода Fill эта команда выполняется и заполняет объект DataTable или объект DataSet.InsertCommand – содержит текст (строку sql) или объект команды, осуществляющий вставку строк в таблицу.DeleteCommand – содержит текст (строку sql) или объект команды, осуществляющий удаление строки из таблицы.UpdateCommand – содержит текст (строку sql) или объект команды, осуществляющий обновление значений в БД. Под транзакцией понимается неделимая с точки зрения воздействия на базу данных последовательность операторов манипулирования данными:
Прежде всего, необходимым условием применения транзакций как элементов модели ADO .NET является поддержка источником данных (базой данных) концепции транзакции. Обработка транзакций гарантирует целостность информации в базе данных. Таким образом, транзакция переводит базу данных из одного целостного состояния в другое.
При выполнении транзакции система управления базами данных должна придерживаться определенных правил обработки набора команд, входящих в транзакцию. В частности, гарантией правильности и надежности работы системы управления базами данных являются четыре правила, известные как требования ACID.
Atomicity – неделимость. Транзакция неделима в том смысле, что представляет собой единое целое. Все ее компоненты либо имеют место, либо нет. Не бывает частичной транзакции. Если может быть выполнена лишь часть транзакции, она отклоняется. Consistency – согласованность. Транзакция является согласованной, потому что не нарушает бизнес-логику и отношения между элементами данных. Это свойство очень важно при разработке клиент-серверных систем, поскольку в хранилище данных поступает большое количество транзакций от разных систем и объектов. Если хотя бы одна из них нарушит целостность данных, то все остальные могут выдать неверные результаты. Isolation – изолированность. Транзакция всегда изолированна, поскольку ее результаты самодостаточны. Они не зависят от предыдущих или последующих транзакций – это свойство называется сериализуемостью и означает, что транзакции в последовательности независимы. Durability – устойчивость. Транзакция устойчива. После своего завершения она сохраняется в системе, которую ничто не может вернуть в исходное (до начала транзакции) состояние, т.е. происходит фиксация транзакции, означающая, что ее действие постоянно даже при сбое системы. При этом подразумевается некая форма хранения информации в постоянной памяти как часть транзакции. Указанные выше правила реализуются непосредственно источником данных. На программиста возлагаются обязанности по созданию эффективных и логически верных алгоритмов обработки данных. Он решает, какие команды должны выполняться как одна транзакция, а какие могут быть разбиты на несколько последовательно выполняемых транзакций.
Работа с транзакцией предполагает следующую последовательность действий:
Обеспечивается вызовом метода BeginTransaction() от имени объекта Connection, представляющего открытое соединение. В результате выполнения этого метода возвращается ссылка на объект – представитель класса Transaction, который должен быть записан в свойство Transaction всех объектов-команд, которые должны быть задействованы в данной транзакции.
Transaction вызывается метод Commit(), который подтверждает изменение состояния источника данных. В противном случае (блок catch), от имени объекта – представителя класса Transaction вызывается метод Rollback(), который отменяет ранее произведенные изменения состояния Базы данных.Ниже приводится пример исполнения транзакции с помощью объекта соединения класса OleDbConnection с именем xConnection и пары объектов OleDbCommand с именами xCommand1 и xCommand2:
System.Data.OleDb.OleDbTransaction xTransaction = null;
try
{
xConnection.Open();
// Создается объект транзакции.
xTransaction = xConnection.BeginTransaction();
// Транзакция фиксируется в командах.
xCommand1.Transaction = xTransaction;
xCommand2.Transaction = xTransaction;
// Выполнение команд.
xCommand1.ExecuteNonQuery();
xCommand2.ExecuteNonQuery();
// Если ВСЕ ХОРОШО и мы все еще здесь – ПРИНЯТЬ ТРАНЗАКЦИЮ!
xTransaction.Commit();
}
catch
{
// Если возникли осложнения – отменяем транзакцию.
xTransaction. Rollback();
}
finally
{
// В любом случае соединение закрывается.
xConnection.Close();
}