Категории
Войти
Поиск
Полезное:
Новые статьи
Опечатка?
Выделите текст и нажмите 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:
|
