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, которые пинают курсор к первой и последней записям. |