Функция JetGetSecondaryIndexBookmark

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

Функция JetGetSecondaryIndexBookmark

Функция JetGetSecondaryIndexBookmark извлекает специальную закладку для записи вторичного индекса в текущей позиции курсора. Затем эту закладку можно использовать для эффективного перемещения курсора обратно в ту же запись индекса с помощью JetGotoSecondaryIndexBookmark. Это наиболее полезно при изменении положения на вторичном индексе, который содержит повторяющиеся ключи или содержит несколько записей индекса для одной записи.

Windows XP: JetGetSecondaryIndexBookmark появилась в Windows XP.

    JET_ERR JET_API JetGetSecondaryIndexBookmark(
      __in          JET_SESID sesid,
      __in          JET_TABLEID tableid,
      __out_opt     void* pvSecondaryKey,
      __in          unsigned long cbSecondaryKeyMax,
      __out_opt     unsigned long* pcbSecondaryKeyActual,
      __out_opt      void* pvPrimaryBookmark,
      __in          unsigned long cbPrimaryBookmarkMax,
      __out_opt     unsigned long* pcbPrimaryKeyActual,
      __in          const JET_GRBIT grbit
    );

Параметры

sesid

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

tableid

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

pvSecondaryKey

Выходной буфер, получающий вторичный ключ.

cbSecondaryKeyMax

Максимальный размер выходного буфера для вторичного ключа (в байтах).

pcbSecondaryKeyActual

Получает фактический размер вторичного ключа в байтах.

Если этот параметр имеет значение NULL, фактический размер вторичного ключа не будет возвращен.

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

pvPrimaryBookmark

Выходной буфер, получающий закладку первичного ключа.

cbPrimaryBookmarkMax

Максимальный размер (в байтах) выходного буфера для закладки первичного ключа.

pcbPrimaryKeyActual

Получает фактический размер закладки первичного ключа (в байтах).

Если этот параметр имеет значение NULL, фактический размер закладки первичного ключа не будет возвращен.

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

grbit

Зарезервировано для последующего использования.

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

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

Код возврата

Описание

JET_errSuccess

Операция выполнена успешно.

JET_errBufferTooSmall

Операция завершилась успешно, но один из буферов вывода был слишком мал для получения запрошенных данных.

Выходной буфер был заполнен максимальной частью закладки. При запросе также был возвращен фактический размер закладки.

JET_errClientRequestToStopJetService

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

JET_errInstanceUnavailable

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

JET_errNoCurrentIndex

Курсор в настоящее время не находится на вторичном индексе.

Не имеет смысла получать закладку вторичного индекса, если курсор в настоящее время не использует вторичный индекс. JetGetBookmark следует использовать, если курсор не находится на вторичном индексе.

JET_errNoCurrentRecord

Курсор не располагается на записи.

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

JET_errNotInitialized

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

JET_errRestoreInProgress

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

JET_errSessionSharingViolation

Один и тот же сеанс нельзя использовать для нескольких потоков одновременно. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках.

JET_errTermInProgress

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

При успешном выполнении в выходных буферах будет возвращена вторичная закладка индекса для записи индекса в текущей позиции курсора. Изменение состояния базы данных не произойдет.

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

Комментарии

Закладки обычно следует рассматривать как непрозрачные блоки данных. Не следует пытаться использовать внутреннюю структуру этих данных. Однако для всех закладок ESENT можно знать следующие свойства:

  • Закладка однозначно идентифицирует запись в данной таблице.

  • Закладка записи не будет изменяться в течение времени существования этой записи.

  • Закладка записи совпадает с ключом этой записи в первичном индексе таблицы, содержащей запись. Если для этой таблицы не определен первичный индекс, ядро СУБД создаст собственную закладку для записи.

  • Закладки можно сравнивать друг с другом с помощью memcmp , чтобы установить их относительный порядок в основном индексе по таблице исходных записей. Если для этой таблицы не определен первичный индекс, относительный порядок закладок из этой таблицы не имеет смысла.

  • Сравнивать закладки записей из разных таблиц друг с другом бессмысленно.

  • Длина закладки всегда меньше или равна JET_cbBookmarkMost (256) байтам до Windows Vista. В Windows Vista и более поздних выпусках закладки могут быть больше. Максимальный размер закладки равен текущему значению JET_paramKeyMost + 1.

Ключи обычно следует рассматривать как непрозрачные блоки данных. Не следует пытаться использовать внутреннюю структуру этих данных. Однако для всех ключей ESENT можно знать следующие свойства:

  • Ключи можно сравнивать друг с другом с помощью memcmp , чтобы установить их относительный порядок в исходном индексе по таблице записей исходного индекса.

  • Бессмысленно сравнивать ключи записей индекса из разных индексов друг с другом.

  • Длина ключа всегда меньше или равна JET_cbKeyMost (255) байтам до Windows Vista. В Windows Vista и более поздних выпусках ключи могут быть больше. Максимальный размер ключа равен текущему значению JET_paramKeyMost.

Требования

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

Клиент

Требуется Windows Vista или Windows XP.

Сервер

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

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

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

Библиотека

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

DLL

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

См. также:

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetGetBookmark
JetGotoSecondaryIndexBookmark
JetRetrieveKey
memcmp