Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #28, МАРТ 2003 г.

DROP THE BASE! ADO И БАЗЫ БАННЫХ

Pony (pony@xakep.ru)

Спецвыпуск Xakep, номер #028, стр. 028-020-4


Теперь один из самых тонких вопросов - использование курсора. Итак, значение аргумента CursorType определяется константой adCursorTypeEnum:

adOpenForwardOnly - значение по умолчанию. Возвращает курсор только для чтения с прокруткой только вперед;

adOpenKeyset - символьный курсор. Обеспечивает прокрутку в любом направлении, переход в начало и конец записей. Отображаются изменения, вносимые другими юзерами (кроме добавленных ими записей). Доступ к записям, удаленным другим пользователем, теряется;

adOpenDynamic - динамический курсор, самый прожорливый до ресурсов из всего набора. Он в точности повторяет символьный, но позволяет видеть записи, вводимые другими юзерами;

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

Один из самых распространенных багов - открытие объекта Recordset с курсором по умолчанию (adOpenForwardOnly) и попытка последующего его обновления. В результате лови error и матюки.

БЛОКИРОВКА

Следующий аргумент - LockType. Он сообщает ADO, как блокировать базу. Блокировка важна. Например, представь, что два дятла одновременно дернули одну и ту же запись на обновление/запись данных. Фигня получится! Константы такие:

adLockReadOnly - значение по умолчанию. Доступ только для чтения;

adLockPessimistic - пессимистическая блокировка, наиболее жесткая. Блокированные записи остаются недоступными для других пользователей приложения до тех пор, пока объект Recordset не закроется. Устанавливается в момент доставки записи серваком. Исключает получение юзерами устаревших данных;

adLockOptimistic - оптимистическая блокировка. Устанавливается перед модификацией записей, снимается сразу после ее завершения. Данные остаются доступными другим юзерам, и несколько пользователей могут модифицировать одни и те же данные;

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

ВЫВОДИМ

Ну вот, Recordset открыт, заполнен. Как же вывести данные?

Для вывода данных юзают два метода объекта Recordset: MoveNext - для перемещения к следующей записи, и MovePrevious - для перемещения к предыдущей. Как узнать, что Recordset не пустой? Для этого есть свойство RecordCount, которое возвращает количество записей в Recordset'е. Но можно сделать по-другому: свойства Recordset.BOF (которое указывает на начало записей) и Recordset.EOF (которое указывает на конец записей) в пустом Recordset'е оба имеют значение true. Итак, код:

pomoi.Open "SELECT NAME FROM TRASHCAN"

if pomoi.EOF and pomoi.BOF then

Response.Write("Не найдено ни одной записи")

else

do while not pomoi.EOF

Response.Write (pomoi("ZAPAH") & "<br>")

pomoi.MoveNext

loop

end if

pomoi.Close

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

Из навигационных методов есть еще Recordset.MoveFirst и Recordset.MoveLast, которые пинают курсор к первой и последней записям.

Назад на стр. 028-020-3  Содержание  Вперед на стр. 028-020-5