Функция JetOpenTemporaryTable

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

Функция JetOpenTemporaryTable

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

Windows Vista:JetOpenTemporaryTable появилась в Windows Vista.

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

    JET_ERR JET_API JetOpenTemporaryTable(
      __in          JET_SESID sesid,
      __in          JET_OPENTEMPORARYTABLE* popentemporarytable
    );

Параметры

sesid

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

popentemporarytable

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

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

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

Код возврата

Описание

JET_errSuccess

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

JET_errOutOfMemory

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

JetOpenTemporaryTable может возвращать JET_errOutOfMemory, если адресное пространство хост-процесса становится слишком фрагментировано. Диспетчер временных таблиц выделяет 1 МБ адресного пространства для каждой временной таблицы, созданной независимо от объема хранимых данных.

JET_errInvalidParameter

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

Эта ошибка возвращается JetOpenTemporaryTable при следующих условиях:

  • Элемент cbStruct структуры JET_OPENTEMPORARYTABLE не соответствует версии этой структуры, поддерживаемой данной версией ядра СУБД.

  • Элемент cbKeyMost структуры JET_OPENTEMPORARYTABLE меньше JET_cbKeyMostMin.

  • Элемент cbKeyMost структуры JET_OPENTEMPORARYTABLE больше, чем наибольшее поддерживаемое значение размера страницы базы данных для экземпляра (JET_paramDatabasePageSize). Дополнительные сведения см. в разделе параметр JET_paramKeyMost в списке информационных параметров .

  • Элемент cbVarSegMac структуры JET_OPENTEMPORARYTABLE больше, чем член cbKeyMost .

JET_errNotInitialized

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

JET_errClientRequestToStopJetService

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

JET_errInstanceUnavailable

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

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

JET_errTermInProgress

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

JET_errRestoreInProgress

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

JET_errSessionSharingViolation

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

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

JET_errInvalidSesid

Дескриптор сеанса недопустим или относится к закрытому сеансу.

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

JET_errOutOfCursors

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

JET_errTooManySorts

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

JET_errCannotMaterializeForwardOnlySort

Сбой JetOpenTemporaryTable , так как JET_bitTTForwardOnly был указан, а указанная временная таблица не может быть создана с помощью оптимизации только для пересылки.

Windows Server 2003: Эта ошибка будет возвращена только в Windows Server 2003 и более поздних выпусках.

JET_errTooManyColumns

Предпринята попытка добавить в таблицу слишком много столбцов. Таблица может содержать не более JET_ccolFixedMost фиксированных столбцов, не более JET_ccolVarMost столбцов переменной длины и не более JET_ccolTaggedMost помеченных столбцов.

JET_errTooManyOpenTables

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

JET_errInvalidCodePage

Член cp структуры JET_COLUMNDEF не имеет допустимой кодовой страницы. Единственными допустимыми значениями для текстовых столбцов являются английский (1252) и Юникод (1200). Значение 0 означает, что будет использоваться значение по умолчанию (английский, 1252).

JET_errInvalidColumnType

Член coltypJET_COLUMNDEF не имеет допустимого типа столбца.

JET_errInvalidLanguageId

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

JET_errInvalidLCMapStringFlags

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

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

Windows 2000: В Windows 2000 недопустимые флаги нормализации приведут к JET_errIndexInvalidDef.

JET_errIndexInvalidDef

Не удалось создать индекс, так как указано недопустимое определение индекса. JetOpenTemporaryTable вернет эту ошибку при следующих условиях:

  • Указан языковой стандарт, не зависящий от языка.

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

Windows 2000: Эта ошибка будет возвращена только Windows 2000.

JET_errTooManyOpenIndexes

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

При успешном выполнении будет возвращен курсор, открытый во вновь созданной временной таблице. Состояние временной базы данных будет подготовлено для хранения новой временной таблицы. Состояние всех обычных баз данных, используемых ядром СУБД, останется неизменным.

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

Комментарии

Временные таблицы не поддерживают полное дополнение параметров определения столбцов, которые обычно поддерживаются ядром СУБД. Фактически поддерживаются только JET_bitColumnFixed и JET_bitColumnTagged. Это означает, что невозможно создать столбец с автоматическим приращением, версией или многозначным столбцом во временной таблице. Наконец, столбцы депонирования обновления не поддерживаются, так как они могут использоваться только одним сеансом за раз. Если запрашивается какой-либо из этих параметров, они будут игнорироваться.

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

Временные таблицы возвращаются вызывающей объекту в результате применения множества различных функций ESE. Например, JetGetIndexInfo с набором параметров JET_IdxInfo вернет временную таблицу, содержащую список всех ключевых столбцов в заданном индексе. Временные таблицы следуют тем же правилам жизненного цикла, что и обычные временные таблицы, как описано здесь.

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

Все временные таблицы хранятся во временной базе данных. Временная база данных — это специальный файл базы данных, который хранится в течение времени существования экземпляра ESE и удаляется при завершении работы или перезапуске этого экземпляра. Расположение временной базы данных можно настроить с помощью JetSetSystemParameter с JET_paramTempPath. Размещение временной базы данных на диске относительно файлов журнала транзакций и файлов базы данных может быть важно, если приложение интенсивно использует временные таблицы или часто создает индексы.

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

Осторожностью Существует важная проблема в JetDupCursor , которая влияет на временные таблицы. Если предпринята попытка дублировать временную таблицу, которая находится в режиме "только вперед", результирующий курсор не будет создан должным образом и будет неисправен. По-прежнему можно дублировать курсор на материализованную временную таблицу.

Диспетчер временных таблиц может реализовать временную таблицу тремя способами. Первый метод заключается в обслуживании таблицы в памяти. Эта стратегия является самой быстрой, но ее можно использовать только для небольших, простых и временных таблиц. Второй способ — создать сортировку на основе диска, которая может управляться с помощью итератора только для пересылки. Эта стратегия может использоваться только при определенных обстоятельствах и является самым быстрым способом сортировки и удаления дубликатов из очень большого набора данных. Третий способ — создать дерево B+ во временной базе данных для хранения временной таблицы. Эта стратегия является самой медленной, но наиболее универсальной и называется материализованной временной таблицей. Эти стратегии можно использовать в сочетании, чтобы в конечном итоге достичь функциональных возможностей временной таблицы.

Если временная таблица не материализуется, она используется в основном на двух основных этапах. Первый этап — это этап вставки, на котором таблица заполняется своим исходным набором данных. На этом этапе разрешена только вставка данных. Этот этап завершается при попытке переместить курсор с помощью JetMove или JetSeek. Второй этап — это этап извлечения данных. На этом этапе данные, хранящиеся во временной таблице, можно извлечь в соответствии с возможностями, которые были запрошены при создании временной таблицы.

Возможности временного курсора таблицы

При материализации временной таблицы курсор имеет следующие возможности, но может быть дополнительно ограничен запрошенными параметрами:

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

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

Требования

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

Клиент

Требуется Windows Vista.

Сервер

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

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

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

Библиотека

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

DLL

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

См. также:

JET_ERR
JET_SESID
JET_OPENTEMPORARYTABLE
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
Информационные параметры
Параметры временной базы данных