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

 

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

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

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

Именно этот способ управления параллелизмом использует объект Builder. Мастер Data Adapter Configuration Wizard применяет данный способ управления параллелизмом по умолчанию.
Примечание Вообще говоря, БД не позволяют сравнивать два !)!.ОВ-зи.;чеш!м. В столбце с ВЮВ-данными можно хранить сотни мегабайт информации, и сравнение двух BLOB-значений окажется весьма неэффективным, если вообще возможным. Оредстна генерации кода типа объекта С\>щ-mandBuilderK мастера Data Adapter Configuration Wizard исключают столбцы с ВЮВ-данными из раздела WHERE обновляющих запросов. Помните об этом при создании собственной логики обновления.
ГЛАВА (J Передача обновлений в базу данных
385
Использование полей первичного ключа и полей типа timestamp
Поля типа timestamp позволяют упростить раздел WHERE обновляющих запросов На самом деле в SQL Server поле типа timestamp содержит не сведения о дате и времени, а двоичные данные, уникальные в пределах БД.
В таблице SQL Server можно определить поле типа timestamp, и при каждом изменении содержимого записи SQL Server будет изменять значение поля типа timestamp этой записи. Давайте добавим в таблицу Customers поле типа timestamp и изменим предыдущий запрос таким образом;
UPDATE Customers
SET CustomerlD = 'ABCDE', CompanyName = 'Original Company Name',
ContactName = 'New Contact', Phone = 'BOO-555-1212' WHERE CustomerlD = 'ABCDE' AND
TimestampColumn = OxOOuOOQOOOOOOOOCC
Поскольку при каждом обновлении записи сервер генерирует новое значение
поля типа timestamp, в разделе WHERE можно воспользоваться комбинацией полей первичного ключа и поля timestamp и тем самым предотвратить перезапись сделанных другими пользователями.
Большинство БД поддерживают аналогичный тип данных. В одних используется уникальное двоичное значение, в других — значение з ; ; щх-мя / Просмотрите документацию вашей СУБД, чтобы узнать конкретный тип данных и определить, как заставить БД обновлять соответствующее значение при каждом изменении содержимого записи.
На настоящий момент ни объект CommandBuilder, ни мастер Data Adapter Configuration Wizard не поддерживают генерацию логики для данного варианта оптимистичного управления параллелизмом.
Примечание В SQL Server 2000 типы данных т^Ыон и timestamp аналогичны, и в документации SQL Server рекомендуется использовать ключевое слово rowversion. а не timestamp. Термин timestamp используется здесь потому, что на момент написания данной книги он наиболее широко известен.
Для контроля параллелизма я предпочитаю использовать комбинацию полей первичного ключа и поля типа timestamp, поскольку при этом логика обновления гораздо проще, и БД при попытке обновления требуется просматривать меньше полей.
Использование полей первичного ключа и измененных полей
По умолчанию ядро курсоров ADO включает в раздел WHERE обновляющих запросов только поля первичного ключа и оригинальные значения измененных лей. Кроме того, в раздел SET запросов UPDATE ядро включает только измен, иные поля.
Рассмотрим наш пример, в котором реализована данная стратегия обновления. Предположим, пользователи А и Б одновременно выбрали одну и ту же запись о клиенте. Пользователь А изменил значение поля CompanyName, а пользователь Б — значение поля ContactName. Пользователь Б первым передал отложенное изменение поля ContactName. Его запрос UPDATE выглядиттак:
386
Часть III Автономная работа с данными: объект DataSet модели ajo.net
UPDATE Customers
SET ContactName = 'New Contact' WHERE CustomerID = 'ABCDE- AND
ContactNaite = 'Original Contact'
Затем пользователь А передает отложенное изменение поля CompanyName с помощью такого запроса UPDATE:
UPDATE Customers
SET CompanyName = 'New Company Name' WHERE CustomerID = 'ABCDE' AND
CompanyName = 'Original Company Name'
Содержимого записи изменится с
(.oatonx-rK. CompanyName ContactName
ABCDE Original Company Name Original Contact
на
CustomerlD CompanyName ContactName
ABCDE Original Company Name New Contact
и затем на
CustomerlD CompanyName ContactName
ABCDE New Company Name New Contact
Оба изменения будут переданы успешно, и изменение пользователя А не перезапишет изменение, внесенное пользователем Б.
Структура объекта DataAdapterADO.NET не подходит для этой стратегии обновления, поскольку и.Iм требуется О7з:оррск?ллзв"л структуру запроса на основе полей, измененных в записи, которая содержит отложенные изменения. Объект DataAdapter предоставляет значения параметров обновляющих запросов для каждой записи отдельно, но реальную структуру пзрлмсз рнзлешн! но запроса не редактирует.
Теоретически можно написать код, динамически изменяющий структуру соответствующего объекта Command, и использовать его при обработке события RaivUpckttmgoa\,cK\:\ DataAdapter. Полагаю, у данной стратегии есть свои преимущества, однако затраты на ее реализацию перевешивают их.
Работа со значениями NULL
В таблице Customers БД Non!twinli есть поле Region, принимающее строки до символов длиной, а также значения NULL. Поле Region многих записей имеет значение NULL. Для получения таких записей большинство программистов воспользуется следующим запросом:
Предыдущая << 1 .. 162 163 164 165 166 167 < 168 > 169 170 171 172 173 174 .. 260 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100