Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Вебмастеру -> Сеппа Д. -> "Microsoft ADO.NET" -> 174

Microsoft ADO.NET - Сеппа Д.

Сеппа Д. Microsoft ADO.NET — М.: Русская Редакция, 2003. — 640 c.
ISBN 5-7502-0223-2
Скачать (прямая ссылка): mcrsftado2003.pdf
Предыдущая << 1 .. 168 169 170 171 172 173 < 174 > 175 176 177 178 179 180 .. 260 >> Следующая

Как создать собственную логику обновления? В случае с соединяющим запросом ни объект CommandBuilder, ни мастер Data Adapter Configuration Wizard не окажут вам сколь либо значительной помощи. Однако можно временно опустить поле ProductName, создать нужную логику обновления с помощью любого из этих компонентов и затем снова добавить поле ProductName в запрос. Окольными путями, зато эффективно.
Вернемся к первой моей рекомендации. В разделе «Использование объектов Datuh'clation в объектах Da.UiCu!iiniii, основанных на главы 7 приво-
дится фрагмент кода, демонстрирующий, как средствами нескольких объектов
DataTable и объекта DataRelation симулировать результаты соединяющего опроса. Одно из преимуществ такого подхода — то, что логика обновления значительно
упрощается. Данные объектов DataTable соответствуют отдельным таблицам БД,
Объект CommandBuilder и мастер Data Adapter Configuration Wizard способны
сгенерировать необходимую вам логику обновления.
Вопрос. Вы рассказали об оптимистичном управлении блокировками. Как
в использовать пессимистичное управление ими?
Ответ. При пессимистичном управлении блокировками на '.ммсиж-ммо запись предварительно налагается блокировка. Поскольку содержимое PulaSe отсоединено от БД, простого способа, позволяющего перед изменением записи объекта DataSet наложить блокировку на данные БД, нет. Тем не менее реализовать аналогичную функциональность удается при помощи транзакций,
Допустим, пользователь редактирует данные на экране и, чтобы гарантировать передачу этих вам требуется наложить блокировку на
ответствующие данные БД. Можно открыть транзакцию и выполнить в ней
400
Часть III Автономная работа с данными: объект DataSet модели ADO.net
дующий запрос, чтобы наложить блокировку на нужные записи БД и запретить другим пользователям изменять их:
SELECT * FROM [Order Details] HOLDl.OCK WHERE OrderlD = 10503
Примечание Показанный запрос предназначен специально для SQL Server 2000. Не все БД поддерживают такой синтаксис. Если вы работаете с другими БД, подробнее о блокировке данных в запросах — в документации БД.
У этого подхода есть несколько значительных недостатков. Что, если пользователь забудет щелкнуть кнопку Changes приложения и пойдет на кухню за пончиком и порцией кофе? Записи БД останутся блокированными. Чем больше данных блокировано и чем дольше, тем ниже масштабируемость приложения.
Настала пора мне исповедаться. Не единожды в жизни я совершал ошибки. Много лет назад я использовал подобный подход в одном из приложений, но не потому, что был молод или мне требовались деньги. Такая «возможности была необходима пользователям этого приложения. Они хотели избежать ситуаций, когда сделанные невозможно в и данные приходится позже вводить заново.
Один из сотрудников, скажем, Стив (половину сотрудников той компании звали !. лззвдмп). постоянно забывал подтверждать сделанные им изменения. Когда другим пользователям не удавалось изменить данные БД, они искали меня, и я искал Стива, на что иногда требовалось довольно много времени. И хотя я объяснял им, что они сами хотели такой функциональности, веселее никому не становилось.
тогда я учился в колледже. Именно в этом возрасте дети экспериментируют со шгукззмп типа пессимистического управления блокировками. Я получил
хороший урок и никому особо не навредил. Даже Стиву.
Вопрос. Что, если мой объект DataSet содержит столбцы с BU Ш-дзинымп, а мне
требуется передавать обновления?
Ответ. Простейшее решение — разделить исходный запрос на два, один из которых только поля первичного ключа и поле с BLOB-данными, а другой возвращает все прочие поля.
Структура запросов, при помощи которых передает
статична, и поэтому в разделе SET запроса, заданного свойству объекта
используются значения всех полей, даже если измененные ные содержит только одно поле. Эта, казалось бы, маленькая для большинства запросов помеха (и необходимое зло при передаче обновлений средствами хранимой процедуры) может создать значительную проблему при работе с полями, содержащими BLOB-данныс. Почему?
Скажем, мы обрабатываем сведения о сотрудниках и в БД есть таблица Етр~
loyees, содержащая столбцы с именем, идентификационным номером, должностью и фотографией сотрудника. В столбце с фотографиями хранится большой
объем двоичной информации — содержимое JPEG-файлов.
Если у вас есть объект DataTable с аналогичными столбцами и вам требуется изменить лишь поле отдельной записи, DataAdapter включит в запрос,
ГЛАВА 10 Передача обновлений в базу данных
401
обновляющий содержимое записи БД, текущие значения всех полей. Это означает, что даже при изменении небольшого поля со строковым типом данных в БД все равно передается двоичное содержимое фотографии сотрудника,
Другой способ заключается в том, чтобы разделить данные на отдельные таблицы (рис. Ю-) I ; На рисунке показаны два объекта D.'tu;V(ii>ie. между которыми определено отношение на основе объекта DataRelation. Родительский объект ШМШ>й?включает основные столбцы таблицы Employees - EmployeelD, LastName и FirstName. Дочерний DataTable объект содержит столбец Photo с ВЮВ-данны-ми, а также столбец позволяющий поддерживать связь с
Предыдущая << 1 .. 168 169 170 171 172 173 < 174 > 175 176 177 178 179 180 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100