Войти



Поиск

Полезное:

Новые статьи

Опечатка?

Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!

Счетчики


Реализация поддержки транзакций в адаптере таблицы

Если вам требуется в рамках одной транзакции исполнить через адаптер таблицы несколько запросов, то найдется несколько способов это сделать. Вы можете использовать класс TransactionScope из нового пространства имен System. Transactions для исполнения нескольких запросов в области действия одной транзакции:

Если вы хотите экспонировать управление соединениями адаптера таблиц, добавив к сборке отдельный класс, это можно сделать при помощи простого класса вроде следующего:

Однако тут может иметь место распределенная транзакция, и в зависимости от структуры вашего приложения цена в смысле производительности может оказаться выше, чем при прямой транзакции с базой данных.

Если вы хотите управлять транзакцией непосредственно на адаптере таблицы, то вы можете расширить класс адаптера таблицы, определив в проекте свой собственный неполный класс с тем же именем, что и класс адаптера, который вы хотите модифицировать, а затем написать код, позволяющий клиенту задать транзакцию, заключающую в себе любые запросы, исполняемые через адаптер таблицы.

Если вы добавите в библиотеку проекта NorthwindDataAccess новый файл класса и введете в него код из листинга 2.6, класс CustomersTableAdapter будет расширен и код, генерированный конструктором типизированных наборов данных, приобретет новые возможности.

Код листинга 2.6 выполняет следующие действия.

1. Проверяет, открыто ли соединение и выбрасывает исключение, если оно не открыто.

2. Устанавливает это соединение в свойстве Connection адаптера таблицы, благодаря чему соединение становится доступным для всех командных объектов, содержащихся в сгенерированном конструктором коде.

3. Перебирает все команды в массиве _commandCollection, который входит в состав той части кода неполного класса адаптера, которая генерирована конструктором. Эти команды используются для специальных запросов, добавленных к адаптеру таблицы.

4. Проверяет и устанавливает каждую из команд, содержащихся во внутреннем адаптере данных. Это первичные команды, используемые для заполнения и обновления из соответствующей таблицы.

Метод BeginTransaction позволяет вам использовать адаптер таблицы примерно таким же образом, как вы работаете с транзакциями на сырых классах ADO.NET. Когда вы непосредственно работаете с транзакциями базы данных в ADO.NET, вы должны:

1. Открыть соединение.

2. Вызвать BeginTransaction для этого соединения.

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

4. Наконец, когда все операции закончены, вы вызываете метод Commit самого объекта-транзакции.

Метод BeginTransaction в неполном классе-расширении CustomersDa-taSet позволяет, работая с адаптером таблицы, действовать по той же схеме. При передаче ему соединения, которое вы намерены использовать для исполнения запросов, он открывает транзакцию. Транзакция, возвращаемая вызовом BeginTransaction для данного соединения, передается в свойства Transaction всех команд, содержащихся а адаптере таблицы, а затем возвращается вызывающему, благодаря чему вызывающий код сможет обратиться к методу Commit или Rollback данной транзакции.

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

Как видите, код действует по той же схеме, что и код транзакций, который пишется в ADO.NET для классов соединений и команд. Вначале он открывает соединение, затем вызывает BeginTransaction. В нашем случае BeginTransaction вызывается на адаптере таблицы, а не соединении, и делается это через метод расширения адаптера, принимающий в качестве параметра соединение и возвращающий вновь созданный объект SqlTrans-action. Как только транзакция открыта, можно вызвать любое число методов-запросов данного экземпляра адаптера, и все они будут включены в транзакцию базы данных, открытую вызовом BeginTransaction. Когда транзакцию можно будет закрыть, код вызывает метод Commit непосредственно на объекте SqlTransaction, возвращенного ВЫЗОВОМ BeginTransaction.




Newer news items:
Older news items:

 
Главная Страница Контактная Информация Поиск по сайту Контактная Информация Поиск по сайту