Partager via


Fonction JetOpenTemporaryTable

S’applique à : Windows | Windows Server

Fonction JetOpenTemporaryTable

La fonction JetOpenTemporaryTable crée une table volatile avec un index unique qui peut être utilisé pour stocker et récupérer des enregistrements, tout comme une table ordinaire créée via JetCreateTableColumnIndex.

Windows Vista:JetOpenTemporaryTable est introduit dans Windows Vista.

Les tables temporaires sont plus rapides que les tables ordinaires en raison de leur nature volatile. Ils peuvent rapidement trier et effectuer la suppression dupliquée sur les jeux d’enregistrements lorsqu’ils sont consultés de manière purement séquentielle.

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

Paramètres

sesid

Session qui sera utilisée pour cet appel.

popentemporarytable

Pointeur vers une structure de JET_OPENTEMPORARYTABLE qui contient la description de la table temporaire à créer en entrée. Après un appel réussi, la structure contient le handle des identifications temporaires de table et de colonne.

Valeur renvoyée

Cette fonction retourne le type de données JET_ERR avec l’un des codes de retour suivants. Pour plus d’informations sur les erreurs ESE possibles, consultez Erreurs du moteur de stockage extensible et Paramètres de gestion des erreurs.

Code de retour

Description

JET_errSuccess

L’opération s’est terminée avec succès.

JET_errOutOfMemory

L’opération a échoué, car il n’est pas possible d’allouer suffisamment de mémoire pour la terminer.

JetOpenTemporaryTable peut retourner JET_errOutOfMemory si l’espace d’adressage du processus hôte devient trop fragmenté. Le gestionnaire de tables temporaire alloue un segment de 1 Mo d’espace d’adressage pour chaque table temporaire créée, quelle que soit la quantité de données stockées.

JET_errInvalidParameter

L’un des paramètres fournis contenait une valeur inattendue ou la combinaison de plusieurs valeurs de paramètres a entraîné un résultat inattendu.

Cette erreur est retournée par JetOpenTemporaryTable dans les conditions suivantes :

  • Le membre cbStruct de la structure JET_OPENTEMPORARYTABLE ne correspond pas à une version de cette structure prise en charge par cette version du moteur de base de données

  • Le membre cbKeyMost de la structure JET_OPENTEMPORARYTABLE est inférieur à JET_cbKeyMostMin.

  • Le membre cbKeyMost de la structure JET_OPENTEMPORARYTABLE est supérieur à la plus grande valeur prise en charge pour la taille de page de la base de données pour le instance (JET_paramDatabasePageSize). Pour plus d’informations, consultez le paramètre JET_paramKeyMost dans la liste des paramètres informationnels .

  • Le membre cbVarSegMac de la structure JET_OPENTEMPORARYTABLE est plus grand que le membre cbKeyMost .

JET_errNotInitialized

L’opération ne peut pas se terminer, car le instance associé à la session n’a pas encore été initialisé.

JET_errClientRequestToStopJetService

L’opération ne peut pas se terminer, car toute l’activité sur le instance associée à la session a cessé à la suite d’un appel à JetStopService.

JET_errInstanceUnavailable

L’opération ne peut pas se terminer, car le instance associé à la session a rencontré une erreur irrécupérable qui exige que l’accès à toutes les données soit révoqué pour protéger l’intégrité de ces données.

Windows XP : Cette erreur sera retournée uniquement par Windows XP et les versions ultérieures.

JET_errTermInProgress

L’opération ne peut pas se terminer, car le instance associé à la session est en cours d’arrêt.

JET_errRestoreInProgress

L’opération ne peut pas se terminer, car une opération de restauration est en cours sur le instance associé à la session.

JET_errSessionSharingViolation

La même session ne peut pas être utilisée pour plusieurs threads en même temps.

Windows XP : Cette erreur sera retournée uniquement par Windows XP et les versions ultérieures.

JET_errInvalidSesid

Le handle de session n’est pas valide ou fait référence à une session fermée.

Note Cette erreur n’est pas retournée dans toutes les circonstances. Les handles sont validés uniquement sur la base du meilleur effort.

JET_errOutOfCursors

L’opération a échoué, car le moteur ne peut pas allouer les ressources nécessaires pour ouvrir un nouveau curseur. Les ressources de curseur sont configurées à l’aide de JetSetSystemParameter avec JET_paramMaxCursors.

JET_errTooManySorts

L’opération a échoué, car le moteur ne peut pas allouer les ressources nécessaires à la création d’une table temporaire. Les ressources de table temporaires sont configurées à l’aide de JetSetSystemParameter avec JET_paramMaxTemporaryTables.

JET_errCannotMaterializeForwardOnlySort

JetOpenTemporaryTable a échoué, car JET_bitTTForwardOnly a été spécifié et la table temporaire spécifiée n’a pas pu être créée à l’aide de l’optimisation avant uniquement.

Windows Server 2003 : Cette erreur sera uniquement retournée par Windows Server 2003 et versions ultérieures.

JET_errTooManyColumns

Une tentative d’ajout de trop de colonnes à la table a été effectuée. Une table ne peut pas avoir plus de JET_ccolFixedMost colonnes fixes, pas plus de JET_ccolVarMost colonnes de longueur variable et pas plus de JET_ccolTaggedMost colonnes étiquetées.

JET_errTooManyOpenTables

L’opération a échoué, car le moteur ne peut pas allouer les ressources requises pour mettre en cache le schéma de la table. Pour configurer le nombre de tables qui ont des schémas pouvant être mis en cache, utilisez JetSetSystemParameter avec JET_paramMaxOpenTables.

JET_errInvalidCodePage

Le membre cp de la structure JET_COLUMNDEF n’a pas été défini sur une page de code valide. Les seules valeurs valides pour les colonnes de texte sont Anglais (1252) et Unicode (1200). La valeur 0 signifie que la valeur par défaut sera utilisée (anglais, 1252).

JET_errInvalidColumnType

Le membre coltyp du JET_COLUMNDEF n’a pas été défini sur un type de colonne valide.

JET_errInvalidLanguageId

Impossible de créer l’index, car une tentative d’utilisation d’un ID de paramètres régionaux non valide a été effectuée. L’ID de paramètres régionaux peut être complètement non valide ou le module linguistique associé n’est peut-être pas installé.

JET_errInvalidLCMapStringFlags

L’index n’a pas pu être créé, car une tentative d’utilisation d’un ensemble d’indicateurs de normalisation non valides a été effectuée.

Windows XP : Cette erreur sera retournée uniquement par Windows XP et les versions ultérieures.

Windows 2000 : Sur Windows 2000, les indicateurs de normalisation non valides entraînent JET_errIndexInvalidDef.

JET_errIndexInvalidDef

Impossible de créer l’index, car une définition d’index non valide a été spécifiée. JetOpenTemporaryTable retourne cette erreur dans les conditions suivantes :

  • Les paramètres régionaux non linguistiques sont spécifiés.

  • Un ensemble d’indicateurs de normalisation non valides est spécifié.

Windows 2000 : Cette erreur sera uniquement retournée par Windows 2000.

JET_errTooManyOpenIndexes

L’opération a échoué, car le moteur ne peut pas allouer les ressources nécessaires pour mettre en cache les index de la table. Pour configurer le nombre d’index qui ont des schémas pouvant être mis en cache, utilisez JetSetSystemParameter avec JET_paramMaxOpenTables.

En cas de réussite, un curseur ouvert sur la table temporaire nouvellement créée est retourné. L’état de la base de données temporaire sera préparé pour contenir la nouvelle table temporaire. L’état des bases de données ordinaires utilisées par le moteur de base de données reste inchangé.

En cas d’échec, la table temporaire n’est pas créée et aucun curseur n’est retourné. L’état de la base de données temporaire peut être modifié. L’état des bases de données ordinaires utilisées par le moteur de base de données reste inchangé.

Notes

Les tables temporaires ne prennent pas en charge le complément complet des options de définition de colonne qui sont normalement prises en charge par le moteur de base de données. En fait, seuls les JET_bitColumnFixed et les JET_bitColumnTagged sont pris en charge. Cela signifie qu’il n’est pas possible de créer un incrément automatique, une version ou une colonne à valeurs multiples dans une table temporaire. Enfin, les colonnes de mise à jour d’entiercement ne sont pas prises en charge, car elles ne peuvent être utilisées que par une session à la fois. Si l’une de ces options est demandée, elles sont ignorées.

Les tables temporaires ne prennent pas en charge les valeurs par défaut. Si une définition de colonne contenant une spécification de valeur par défaut est fournie, cette spécification est ignorée.

Les tables temporaires sont retournées à l’appelant en raison de nombreuses fonctions ESE différentes. Par exemple, JetGetIndexInfo avec le jeu d’options JET_IdxInfo retourne une table temporaire contenant une liste de toutes les colonnes clés d’un index donné. Les tables temporaires suivent les mêmes règles de cycle de vie que les tables temporaires ordinaires, comme décrit ici.

Les tables temporaires sont également utilisées en interne par le moteur de base de données pour de nombreuses tâches. La plus importante de ces tâches est la création d’un index sur une table existante. Une table temporaire sera utilisée pour trier les clés d’index utilisées pour construire cet index.

Toutes les tables temporaires sont stockées dans la base de données temporaire. La base de données temporaire est un fichier de base de données spécial qui est conservé pendant la durée de vie d’un instance ESE et qui est supprimé lorsque cette instance est arrêtée ou redémarrée. L’emplacement de la base de données temporaire peut être configuré à l’aide de JetSetSystemParameter avec JET_paramTempPath. Le placement de la base de données temporaire sur le disque par rapport à vos fichiers journaux des transactions et fichiers de base de données peut être important si votre application utilise intensivement des tables temporaires ou crée fréquemment des index.

Le cycle de vie d’une table temporaire est lié aux curseurs qui la référencent. Si tous les curseurs qui font référence à une table temporaire sont fermés, implicitement ou explicitement, la table temporaire est supprimée. Si une table temporaire est créée à l’intérieur d’une transaction et que cette transaction est restaurée par la suite, la table temporaire est supprimée, car tous les curseurs qui l’ont référencée à ce stade seront implicitement fermés. Les nouveaux curseurs peuvent référencer une table temporaire uniquement à l’aide de JetDupCursor. Dans ce cas, les nouveaux curseurs seront positionnés sur la première entrée d’index de la table temporaire. JetDupCursor fonctionne uniquement pendant certaines phases d’utilisation de la table temporaire. Pour plus d’informations, consultez les remarques concernant les fonctionnalités de curseur de table temporaires. Il n’est pas possible de référencer une table temporaire à partir de plusieurs sessions à la fois.

Attention Il existe un problème important dans JetDupCursor qui affecte les tables temporaires. Si une tentative est effectuée pour dupliquer une table temporaire en mode avant uniquement, le curseur résultant n’est pas créé correctement et ne fonctionne pas correctement. Il est toujours sûr de dupliquer un curseur sur une table temporaire matérialisée.

Le gestionnaire de tables temporaires peut implémenter une table temporaire de trois manières. La première méthode consiste à gérer une table en mémoire. Cette stratégie est la plus rapide, mais ne peut être utilisée que pour de petites tables simples et temporaires. La deuxième méthode consiste à créer un tri sur disque qui peut être piloté à l’aide d’un itérateur vers l’avant uniquement. Cette stratégie ne peut être utilisée que dans certaines circonstances et constitue le moyen le plus rapide de trier et de supprimer les doublons d’un jeu de données très volumineux. La troisième méthode consiste à créer une arborescence B+ dans la base de données temporaire pour contenir la table temporaire. Cette stratégie est la plus lente, mais la plus polyvalente, et est appelée table temporaire matérialisée. Ces stratégies peuvent être utilisées conjointement pour obtenir les fonctionnalités demandées de la table temporaire.

Lorsque la table temporaire n’est pas matérialisée, elle est utilisée principalement dans deux phases majeures. La première phase est la phase d’insertion où la table est remplie avec son jeu de données initial. Pendant cette phase, seule l’insertion de données est autorisée. Cette phase se termine lorsqu’une tentative de déplacement du curseur est effectuée à l’aide de JetMove ou JetSeek. La deuxième phase est la phase d’extraction de données. Au cours de cette phase, les données stockées dans la table temporaire peuvent être extraites en fonction des fonctionnalités qui ont été demandées lors de la création de la table temporaire.

Fonctionnalités de curseur de table temporaire

Lorsque la table temporaire est matérialisée, le curseur a les fonctionnalités suivantes, mais peut être encore limité par les options demandées :

Lorsque la table temporaire n’est pas matérialisée et est en phase d’insertion, le curseur a les fonctionnalités suivantes, mais peut être encore limité par les options demandées :

Lorsque la table temporaire n’est pas matérialisée et est en phase d’extraction, le curseur a les fonctionnalités suivantes, mais peut être encore limité par les options demandées :

Spécifications

Condition requise Valeur

Client

Nécessite Windows Vista.

Serveur

Nécessite Windows Server 2008.

En-tête

Déclaré dans Esent.h.

Bibliothèque

Utilisez ESENT.lib.

DLL

Nécessite ESENT.dll.

Voir aussi

JET_ERR
JET_SESID
JET_OPENTEMPORARYTABLE
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
Paramètres d’information
Paramètres de base de données temporaires