CRecordset::Open
Ouvre le recordset en extrayant la table ou en exécutant la requête que le recordset représente.
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
Paramètres
nOpenType
Acceptez la valeur par défaut, AFX_DB_USE_DEFAULT_TYPE, ou utiliser l'une des valeurs suivantes pour enum OpenType:Recordset deCRecordset::dynaset Un avec le défilement bidirectionnel.L'appartenance et classer les enregistrements sont déterminés quand le recordset est ouvert, mais les modifications apportées par d'autres utilisateurs aux valeurs de données sont visibles suivant une opération d'extraction.Les feuilles de réponse dynamiques sont également appelées des recordsets clavier clavier.
Recordset statique deCRecordset::snapshot Un avec le défilement bidirectionnel.L'appartenance et classer les enregistrements sont déterminés quand le recordset est ouvert ; les valeurs de données sont déterminées lorsque des enregistrements sont récupérés.Les modifications apportées par d'autres utilisateurs ne sont pas visibles jusqu'à ce que le recordset est fermé et rouvert.
Recordset deCRecordset::dynamic Un avec le défilement bidirectionnel.Les modifications apportées par d'autres utilisateurs d'appartenance, dans l'ordre, et les valeurs de données sont visibles suivant une opération d'extraction.Notez que beaucoup de pilotes ODBC ne prennent pas en charge ce type de recordset.
Recordset en lecture seule deCRecordset::forwardOnly Un avec uniquement le défilement en avant.
Pour CRecordset, la valeur par défaut est CRecordset::snapshot.Le mécanisme par défaut permet aux assistants Visual C++ pour interagir avec CRecordset ODBC et DAO CDaoRecordset, qui ont des valeurs par défaut.
Pour plus d'informations sur ces types de recordsets, consultez l'article recordset (ODBC).Pour des informations connexes, consultez l'article « à l'aide de le bloc et les curseurs à défilement variable » dans Kit de développement logiciel Windows.
Attention Si le type demandé n'est pas pris en charge, l'infrastructure lève une exception.
lpszSQL
Un pointeur de chaîne contenant un des éléments suivants :Un pointeur de NULL .
Nom d'une table.
Une instruction SQL SELECT (éventuellement à un SQL WHERE ou la clause de ORDER BY ).
Une instruction de call spécifiant le nom d'une requête prédéfinie (procédure stockée).Prenez soin que vous n'insérez pas l'espace blanc entre accolades et le mot clé de call .
Pour plus d'informations sur cette chaîne, consultez la table et la révision du rôle de ClassWizard sous les notes.
[!REMARQUE]
L'ordre des colonnes dans le jeu de résultats doit correspondre à celui de RFX ou des appels de fonction RFX en bloc substitution dans la fonction de DoFieldExchange ou de DoBulkFieldExchange .
dwOptions
Un masque de bits qui peut spécifier une combinaison de valeurs listé ci-dessous.Certaines de ces derniers s'excluent mutuellement.La valeur par défaut est none.CRecordset::none aucune options.Cette valeur de paramètre et le s'excluent mutuellement toutes les autres valeurs.Par défaut, le recordset peut être mis à jour avec modification ou suppression et permet d'ajouter de nouveaux enregistrements à AddNew.Updatability dépend de la source de données ainsi qu'en l'option d' nOpenType vous spécifiez.L'optimisation pour les ajouts en bloc n'est pas disponible.L'extraction de lignes en bloc n'est pas implémentée.Les enregistrements supprimés ne seront pas ignorés pendant la navigation de recordset.Les signets sont pas disponibles.Le contrôle modifié automatique de champ est implémenté.
CRecordset::appendOnly ne permettent pas Modifier ou Supprimer dans le recordset.Autorisez AddNew uniquement.Cette option s'excluent mutuellement CRecordset::readOnly.
CRecordset::readOnly ouvrez le recordset en lecture seule.Cette option s'excluent mutuellement CRecordset::appendOnly.
Utilisation deCRecordset::optimizeBulkAdd une instruction SQL préparée d'optimiser ajouter de nombreux enregistrements en même temps.S'applique uniquement si vous n'utilisez pas la fonction API ODBC SQLSetPos pour mettre à jour le recordset.La première mise à jour détermine les champs modifiés marqué.Cette option s'excluent mutuellement CRecordset::useMultiRowFetch.
Extraction de lignes en bloc d' implémentation d'CRecordset::useMultiRowFetch pour permettre plusieurs lignes à récupérer en une seule opération d'extraction.C'est une fonctionnalité avancée conçue pour améliorer les performances ; toutefois, le mécanisme RFX en bloc n'est pas pris en charge par l'assistant classe.Cette option s'excluent mutuellement CRecordset::optimizeBulkAdd.Notez que si vous spécifiez CRecordset::useMultiRowFetch, l'option CRecordset::noDirtyFieldCheck est activée automatiquement (le mécanisme de double tampon ne sera pas disponible) ; sur les recordsets en avant seulement, l'option CRecordset::useExtendedFetch sera activée automatiquement.Pour plus d'informations sur l'extraction de lignes en bloc, consultez l'article recordset : Extraction globale d'enregistrements (ODBC).
Saut deCRecordset::skipDeletedRecords tous les enregistrements supprimés en naviguant dans le recordset.Cela lenteur d'exécution dans certains travail associés.Cette option n'est pas valide sur les recordsets en avant seulement.Si vous appelez Déplacement avec le jeu de paramètres d' nRows à 0, et le positionnement de l'option de CRecordset::skipDeletedRecords , Déplacer affirmera.Notez que CRecordset::skipDeletedRecords est semblable à l'encapsulation de gestionnaire, ce qui signifie que les lignes supprimées sont supprimées du recordset.Toutefois, si votre gestionnaire compresse les enregistrements, puis lui sautera uniquement les enregistrements que vous supprimez ; il ne sautera pas d'enregistrements supprimés par d'autres utilisateurs pendant que le recordset est ouvert.CRecordset::skipDeletedRecords sautera des lignes supprimées par d'autres utilisateurs.
L'utilisation deCRecordset::useBookmarks mai bookmarks du recordset, si prise en charge.La récupération de données lente de signets mais améliore les performances de la navigation de données.Non valide sur les recordsets en avant seulement.Pour plus d'informations, consultez l'article recordset : Signets et positions absolues (ODBC).
CRecordset::noDirtyFieldCheck arrête le contrôle modifié automatique de champ (mécanisme de double tampon).Cela améliore les performances ; toutefois, vous devez manuellement marquer des champs comme modifiés en appelant les fonctions membres d' SetFieldDirty et d' SetFieldNull . notez que le mécanisme de double tampon dans la classe CRecordset est semblable au mécanisme de double tampon dans la classe CDaoRecordset.Toutefois, dans CRecordset, vous ne pouvez pas activer le mécanisme de double tampon dans des champs ; vous l'activer pour tous les champs ou le désactiver pour tous les champs.Notez que si vous spécifiez l'option CRecordset::useMultiRowFetch, puis CRecordset::noDirtyFieldCheck est activée automatiquement ; toutefois, SetFieldDirty et SetFieldNull ne peuvent pas être utilisés sur les recordsets qui implémentent l'extraction de lignes en bloc.
CRecordset::executeDirect n'utilisent pas d'instruction SQL préparée.Pour de meilleures performances, spécifiez cette option si la fonction membre de Requery ne sera jamais appelée.
Implémentez SQLExtendedFetch deCRecordset::useExtendedFetch au lieu de SQLFetch.Cela est conçu pour implémenter l'extraction de lignes en bloc sur les recordsets en avant seulement.Si vous spécifiez l'option CRecordset::useMultiRowFetch sur un recordset en avant seulement, puis CRecordset::useExtendedFetch sera activée automatiquement.
CRecordset::userAllocMultiRowBuffers l'utilisateur allouera des tampons de stockage des données.Utilisez cette option conjointement avec CRecordset::useMultiRowFetch si vous souhaitez allouer votre propre mémoire ; sinon, l'infrastructure allouera automatiquement la mémoire nécessaire.Pour plus d'informations, consultez l'article recordset : Extraction globale d'enregistrements (ODBC).Notez que spécifie CRecordset::userAllocMultiRowBuffers sans spécifier CRecordset::useMultiRowFetch provoquera une assertion.
Valeur de retour
Une valeur différente de zéro si l'objet d' CRecordset a été correctement ouvert ; sinon 0 si retourne 0 de CDatabase::Open (si elle est appelée).
Notes
Vous devez appeler cette fonction membre pour exécuter la requête définie par le recordset.Avant d'appeler Ouvrir, vous devez construire l'objet recordset.
La connexion de ce recordset vers la source de données dépend de la manière dont vous construisez le recordset avant d'appeler Ouvrir.Si vous passez un objet de CDatabase au constructeur de recordsets qui n'a pas été connecté à la source de données, utilise GetDefaultConnect de cette fonction membre de la tentative d'ouverture de l'objet de base de données.Si vous passez NULL au constructeur de recordsets, le constructeur crée un objet d' CDatabase pour vous, et tente de Ouvrir de connecter l'objet de base de données.Pour plus d'informations sur fermer le recordset et la connexion dans ces circonstances variantes, consultez Fermez.
[!REMARQUE]
Accès à une source de données via un objet d' CRecordset est toujours partagé.Contrairement à la classe d' CDaoRecordset , vous ne pouvez pas utiliser un objet d' CRecordset pour ouvrir une source de données avec un accès exclusif.
Lorsque vous appelez Ouvrir, une requête, habituellement une instruction SQL SELECT , sélectionne des enregistrements en fonction de les critères présentés dans le tableau suivant.
Valeur du paramètre de lpszSQL |
Les enregistrements sélectionnés sont déterminés par |
Exemple |
---|---|---|
NULL |
La chaîne retournée par GetDefaultSQL. |
|
Nom de table SQL |
Toutes les colonnes de la table dans DoFieldExchange ou DoBulkFieldExchange. |
"Customer" |
Nom de requête prédéfinie (procédure stockée) |
Les colonnes la requête est définie à retourner. |
"{call OverDueAccts}" |
Tableau de FROM de liste de colonnes deSELECT |
Les colonnes spécifiées les tables spécifiées. |
"SELECT CustId, CustName FROM Customer" |
Attention |
---|
Prenez soin que vous n'insérez pas l'espace blanc supplémentaire de votre chaîne SQL.Par exemple, si vous insérez un espace blanc entre accolades et le mot clé de call , MFC mal interprétera la chaîne SQL comme nom de la table et l'incorporera à une instruction de SELECT , ce qui entraîne une exception est levée.De même, si votre requête prédéfinie utilise un paramètre de sortie, n'insérez pas l'espace blanc entre accolades et « ? » symbole.Enfin, vous ne devez pas insérer un espace blanc avant l'accolade dans une instruction de call ou avant le mot clé de SELECT dans une instruction de SELECT . |
La procédure habituelle consiste à passer NULL à Ouvrir; dans ce cas, appelle GetDefaultSQLde Ouvrir .Si vous utilisez une classe dérivée d' CRecordset , GetDefualtSQL affiche le nom de la table que vous avez spécifiés dans l'assistant classe.Vous pouvez à la place spécifier d'autres informations du paramètre d' lpszSQL .
Celui que vous passer, les éléments de Ouvrir une chaîne finale SQL pour la requête (la chaîne peut avoir SQL WHERE et les clauses de ORDER BY ajoutées à lpszSQL vous chaînes sont passées) et exécute la requête.Vous pouvez examiner la chaîne construite en appelant GetSQL après avoir appelé Ouvrir.Pour des informations supplémentaires sur la façon dont le recordset construit une instruction SQL et sélectionne des enregistrements, consultez l'article recordset : Comment les recordsets d'enregistrements (ODBC).
Les données membres de champ de la classe de recordset sont liées aux colonnes de données sélectionnées.Si les enregistrements retournés, le premier enregistrement redevient l'enregistrement courant.
Si vous souhaitez définir des options pour le recordset, tel qu'un filtre ou un tri, spécifiez ces derniers après avoir construit l'objet recordset mais avant d'appeler Ouvrir.Si vous souhaitez actualiser les enregistrements du recordset après que le recordset est déjà ouvert, appelez Actualiser.
Pour plus d'informations, y compris des exemples supplémentaires, consultez les articles recordset (ODBC), recordset : Comment les recordsets d'enregistrements (ODBC), et recordset : Création et la fermeture des recordsets (ODBC).
Exceptions
Cette méthode peut lever des exceptions de type CDBException* et CMemoryException*.
Exemple
Les différentes formes de suivantes montrent des exemples de code de l'appel de Ouvrir .
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
Configuration requise
Header: afxdb.h