Поделиться через


Функция JetMove

Применимо к: Windows | Windows Server

Функция JetMove

Функция JetMove размещает курсор в начале или конце индекса и просматривает записи в этом индексе вперед или назад. Можно также переместить курсор вперед или назад по текущему индексу на указанное количество записей индекса. Другой подход заключается в искусственном ограничении записей индекса, которые можно перечислить с помощью JetMove , настроив диапазон индексов на курсоре с помощью JetSetIndexRange.

    JET_ERR JET_API JetMove(
      __in          JET_SESID sesid,
      __in          JET_TABLEID tableid,
      __in          long cRow,
      __in          JET_GRBIT grbit
    );

Параметры

sesid

Сеанс, используемый для этого вызова.

tableid

Курсор, используемый для этого вызова.

Ворона

Произвольное смещение, указывающее требуемое перемещение курсора по текущему индексу.

Помимо стандартных смещения, этот параметр также можно задать с помощью одного из следующих параметров.

Значение

Значение

JET_MoveFirst

Перемещает курсор к первой записи индекса в индексе (если она существует). При этом сбрасывается любой диапазон индексов, заданный с помощью JetSetIndexRange.

Примечание Для обозначения этого параметра используется литеральное значение -2147483648. Не используйте это значение в качестве обычного смещения, иначе может возникнуть непреднамеренное поведение.

JET_MoveLast

Перемещает курсор на последнюю запись индекса в индексе (если она существует). При этом сбрасывается любой диапазон индексов, заданный с помощью JetSetIndexRange.

Примечание Для обозначения этого параметра используется литеральное значение 2147483647. Не используйте это значение в качестве обычного смещения, иначе может возникнуть непреднамеренное поведение.

JET_MoveNext

Перемещает курсор к следующей записи индекса в индексе (если она существует). Это значение точно равно обычному смещению +1. Он учитывает диапазоны индексов, заданные с помощью JetSetIndexRange.

JET_MovePrevious

Перемещает курсор на предыдущую запись индекса (если она существует). Он учитывает диапазоны индексов, заданные с помощью JetSetIndexRange.

Это значение точно равно обычному смещению –1 или 0 (ноль).

Курсор остается в текущей логической позиции, и будет проверено существование записи индекса, соответствующей этой логической позиции.

grbit

Группа битов, задающая ноль или более следующих параметров.

Значение

Значение

JET_bitMoveKeyNE

Перемещает курсор вперед или назад на количество записей индекса, необходимых для пропуска запрошенного количества значений ключа индекса, встречающихся в индексе. Это происходит при сворачивании записей индекса с повторяющимися значениями ключа в одну запись индекса. Обычно смещение перемещает курсор на указанное количество записей индекса независимо от их значений ключа.

Возвращаемое значение

Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения о возможных ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.

Код возврата

Описание

JET_errSuccess

Операция выполнена успешно. Для JetMove это означает, что запись индекса была найдена в запрошенном расположении или смещение текущего индекса.

JET_errClientRequestToStopJetService

Операция не может завершиться, так как все действия экземпляра, связанного с сеансом, прекратились в результате вызова JetStopService.

JET_errInstanceUnavailable

Операция не может завершиться, так как экземпляр, связанный с сеансом, столкнулся с неустранимой ошибкой, требующей отмены доступа ко всем данным для защиты целостности этих данных.

Windows XP: Это возвращаемое значение появилось в Windows XP.

JET_errNoCurrentRecord

Курсор в данный момент не располагается на записи индекса. Для JetMove это означает, что запись индекса не найдена в запрошенном расположении или смещение текущего индекса.

JET_errNotInitialized

Операция не может завершиться, так как экземпляр, связанный с сеансом, еще не инициализирован.

JET_errRecordDeleted

В настоящее время курсор логически расположен на записи индекса, соответствующей записи, которая была удалена.

JET_errRestoreInProgress

Операция не может завершиться, так как в экземпляре, связанном с сеансом, выполняется операция восстановления.

JET_errSessionSharingViolation

Один и тот же сеанс нельзя использовать для нескольких потоков одновременно.

Windows XP: Это возвращаемое значение появилось в Windows XP.

JET_errTermInProgress

Операция не может завершиться, так как экземпляр, связанный с сеансом, завершает работу.

Если эта функция будет выполнена успешно, курсор будет располагаться в записи индекса, которая соответствует требуемому расположению или смещению. Если запись подготовлена к обновлению, это обновление будет отменено. Если диапазон индексов действует и указан JET_MoveFirst или JET_MoveLast, этот диапазон индексов будет отменен. Изменение состояния базы данных не произойдет.

Если эта функция завершается сбоем, положение курсора останется неизменным, если не был возвращен JET_errNoCurrentRecord. В этом случае курсор будет располагаться там, где была бы запись индекса, соответствующая требуемому расположению или смещению. Курсор можно переместить относительно этой позиции, но он по-прежнему не находится в допустимой записи индекса. Если запись подготовлена к обновлению, это обновление будет отменено. Если диапазон индексов действует и указан JET_MoveFirst или JET_MoveLast, этот диапазон индексов будет отменен. Изменение состояния базы данных не произойдет.

Комментарии

Курсор можно переместить в две специальные позиции с помощью JetMove: Before First и After Last. Если курсор находится на первой записи индекса в таблице и JetMove вызывается с JET_MovePrevious, вызов завершится ошибкой с JET_errNoCurrentRecord и курсор будет логически расположен перед первой записью в индексе. Эта логическая позиция сохраняется, даже если перед первой записью в индексе вставляется другая запись индекса. Аналогичная ситуация возникает для параметра After Last относительно конца индекса. Параметр Before First и After Last наиболее полезен при настройке диапазона записей индекса для итерации с помощью JetMove с использованием модели итератора, которая всегда должна переходить к следующему (или предыдущему) элементу до использования этого элемента.

Набор записей индекса, которые можно просматривать с помощью JetMove , можно ограничить, настроив диапазон индексов на курсоре. Это полезно для приложений, которые перечисляют набор записей индекса, соответствующих простым критериям, которые можно выразить с помощью пары ключей поиска, созданных для этого индекса. Дополнительные сведения см. в разделе JetSetIndexRange.

В выпусках до Windows Server 2003 с пакетом обновления 1 (SP1) в JetMove возникает проблема, которая в некоторых случаях влияет на правильное применение диапазона индексов, настроенного функцией JetSetIndexRange . Если курсор находится перед первой записью индекса, а диапазон индексов задан с верхним пределом, который меньше первой записи индекса, следующий вызов JetMove будет ошибочно переходить к этой записи индекса вместо сбоя с JET_errNoCurrentRecord, как ожидалось. Та же ошибка будет происходить в аналогичной ситуации, начиная с конца индекса. Такая ситуация может возникнуть в приложении, которое настраивает диапазон индексов и перемещается по нему с помощью итератора, который ожидает начаться до первой записи индекса, которая является членом набора записей для перечисления, а не с первой записи индекса этого набора. Эта ситуация также возникает в аналогичном случае, начиная с конца индекса. Обходной путь заключается в том, чтобы приложение вручную проверяло, что полученная запись индекса находится внутри диапазона индекса, сравнив ключ для текущей записи индекса (полученной с помощью JetRetrieveKey) с ключом, представляющим конец текущего диапазона индексов (извлекается с помощью JetRetrieveKey с помощью JET_bitRetrieveCopy).

Важно соблюдать осторожность при передаче вычисляемых смещения в JetMove. Если вычисленное смещение меньше или равно JET_MoveFirst, это смещение должно быть разбито на несколько частей, каждый из которых передается в JetMove отдельно, но в рамках одной транзакции, чтобы получить требуемый эффект. То же самое относится к смещениям, превышающим или равным JET_MoveNext. Маловероятно, что приложение будет проходить это в реальном мире, но хорошо иметь защиту от этого случая, учитывая очень разную семантику JET_MoveFirst и JET_MoveLast от обычного смещения.

При вызове JetMove с очень большим смещением, например если параметр cRow имеет значение 1000, JetMove проходит все 1000 записей индекса, чтобы достичь конечной позиции. В настоящее время API ESE не предоставляет эффективный способ перехода непосредственно к заданной записи индекса путем смещения без обхода каждой записи индекса.

Требования

Требование Значение

Клиент

Требуется Windows Vista, Windows XP или Windows 2000 Профессиональная.

Сервер

Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server.

Верхняя часть

Объявлено в Esent.h.

Библиотека

Используйте ESENT.lib.

DLL

Требуется ESENT.dll.

См. также:

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetRetrieveKey
JetSetIndexRange