Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Classe
Représente un ensemble d'enregistrements sélectionnés à partir d'une source de données.
Syntaxe
class CRecordset : public CObject
Membres
Constructeurs publics
| Nom | Descriptif |
|---|---|
CRecordset::CRecordset |
Construit un objet CRecordset. Votre classe dérivée doit fournir un constructeur qui appelle celui-ci. |
Méthodes publiques
| Nom | Descriptif |
|---|---|
CRecordset::AddNew |
Prépare l’ajout d’un nouvel enregistrement. Appelez Update pour terminer l’ajout. |
CRecordset::CanAppend |
Retourne une valeur différente de zéro si de nouveaux enregistrements peuvent être ajoutés au jeu d’enregistrements via la AddNew fonction membre. |
CRecordset::CanBookmark |
Retourne une valeur différente de zéro si le jeu d’enregistrements prend en charge les signets. |
CRecordset::Cancel |
Annule une opération asynchrone ou un processus à partir d’un deuxième thread. |
CRecordset::CancelUpdate |
Annule les mises à jour en attente en raison d’une ou AddNew d’une Edit opération. |
CRecordset::CanRestart |
Retourne une valeur différente de zéro si Requery vous pouvez appeler pour réexécuter la requête du jeu d’enregistrements. |
CRecordset::CanScroll |
Retourne une valeur différente de zéro si vous pouvez faire défiler les enregistrements. |
CRecordset::CanTransact |
Retourne une valeur différente de zéro si la source de données prend en charge les transactions. |
CRecordset::CanUpdate |
Retourne une valeur différente de zéro si le jeu d’enregistrements peut être mis à jour (vous pouvez ajouter, mettre à jour ou supprimer des enregistrements). |
CRecordset::CheckRowsetError |
Appelé pour gérer les erreurs générées lors de l’extraction d’enregistrements. |
CRecordset::Close |
Ferme le jeu d’enregistrements et ODBC HSTMT associé à celui-ci. |
CRecordset::Delete |
Supprime l’enregistrement actif du jeu d’enregistrements. Vous devez faire défiler explicitement vers un autre enregistrement après la suppression. |
CRecordset::DoBulkFieldExchange |
Appelé pour échanger des lignes de données en bloc de la source de données vers le jeu d’enregistrements. Implémente l’échange de champs d’enregistrement en bloc (RFX en bloc). |
CRecordset::DoFieldExchange |
Appelé pour échanger des données (dans les deux sens) entre les membres de données de champ du jeu d’enregistrements et l’enregistrement correspondant sur la source de données. Implémente l’échange de champs d’enregistrement (RFX). |
CRecordset::Edit |
Prépare les modifications apportées à l’enregistrement actif. Appel Update pour terminer la modification. |
CRecordset::FlushResultSet |
Retourne une valeur différente de zéro si un autre jeu de résultats doit être récupéré lors de l’utilisation d’une requête prédéfinie. |
CRecordset::GetBookmark |
Affecte la valeur de signet d’un enregistrement à l’objet de paramètre. |
CRecordset::GetDefaultConnect |
Appelé pour obtenir la chaîne de connexion par défaut. |
CRecordset::GetDefaultSQL |
Appelé pour obtenir la chaîne SQL par défaut à exécuter. |
CRecordset::GetFieldValue |
Retourne la valeur d’un champ dans un jeu d’enregistrements. |
CRecordset::GetODBCFieldCount |
Retourne le nombre de champs dans le jeu d’enregistrements. |
CRecordset::GetODBCFieldInfo |
Retourne des types d’informations spécifiques sur les champs d’un jeu d’enregistrements. |
CRecordset::GetRecordCount |
Retourne le nombre d’enregistrements dans le jeu d’enregistrements. |
CRecordset::GetRowsetSize |
Retourne le nombre d’enregistrements que vous souhaitez récupérer lors d’une extraction unique. |
CRecordset::GetRowsFetched |
Retourne le nombre réel de lignes récupérées lors d’une extraction. |
CRecordset::GetRowStatus |
Retourne l’état de la ligne après une extraction. |
CRecordset::GetSQL |
Obtient la chaîne SQL utilisée pour sélectionner des enregistrements pour le jeu d’enregistrements. |
CRecordset::GetStatus |
Obtient l’état du jeu d’enregistrements : index de l’enregistrement actif et indique si un nombre final des enregistrements a été obtenu. |
CRecordset::GetTableName |
Obtient le nom de la table sur laquelle le jeu d’enregistrements est basé. |
CRecordset::IsBOF |
Retourne une valeur différente de zéro si le jeu d’enregistrements a été positionné avant le premier enregistrement. Il n’y a pas d’enregistrement actif. |
CRecordset::IsDeleted |
Retourne une valeur différente de zéro si le jeu d’enregistrements est positionné sur un enregistrement supprimé. |
CRecordset::IsEOF |
Retourne une valeur différente de zéro si le jeu d’enregistrements a été positionné après le dernier enregistrement. Il n’y a pas d’enregistrement actif. |
CRecordset::IsFieldDirty |
Retourne une valeur différente de zéro si le champ spécifié dans l’enregistrement actif a été modifié. |
CRecordset::IsFieldNull |
Retourne une valeur différente de zéro si le champ spécifié dans l’enregistrement actif est null (n’a aucune valeur). |
CRecordset::IsFieldNullable |
Retourne une valeur différente de zéro si le champ spécifié dans l’enregistrement actif peut être défini sur Null (sans valeur). |
CRecordset::IsOpen |
Retourne une valeur différente de zéro si Open elle a été appelée précédemment. |
CRecordset::Move |
Positionne le jeu d’enregistrements sur un nombre spécifié d’enregistrements de l’enregistrement actif dans les deux sens. |
CRecordset::MoveFirst |
Positionne l’enregistrement actif sur le premier enregistrement dans le jeu d’enregistrements. Testez d’abord IsBOF . |
CRecordset::MoveLast |
Positionne l’enregistrement actif sur le dernier enregistrement ou sur le dernier ensemble de lignes. Testez d’abord IsEOF . |
CRecordset::MoveNext |
Positionne l’enregistrement actif sur l’enregistrement suivant ou sur l’ensemble de lignes suivant. Testez d’abord IsEOF . |
CRecordset::MovePrev |
Positionne l’enregistrement actif sur l’enregistrement précédent ou sur l’ensemble de lignes précédent. Testez d’abord IsBOF . |
CRecordset::OnSetOptions |
Appelé pour définir des options (utilisées sur la sélection) pour l’instruction ODBC spécifiée. |
CRecordset::OnSetUpdateOptions |
Appelé pour définir les options (utilisées lors de la mise à jour) pour l’instruction ODBC spécifiée. |
CRecordset::Open |
Ouvre le jeu d’enregistrements en récupérant la table ou en effectuant la requête que représente le jeu d’enregistrements. |
CRecordset::RefreshRowset |
Actualise les données et l’état des lignes spécifiées. |
CRecordset::Requery |
Exécute à nouveau la requête du jeu d’enregistrements pour actualiser les enregistrements sélectionnés. |
CRecordset::SetAbsolutePosition |
Positionne le jeu d’enregistrements sur l’enregistrement correspondant au numéro d’enregistrement spécifié. |
CRecordset::SetBookmark |
Positionne le jeu d’enregistrements sur l’enregistrement spécifié par le signet. |
CRecordset::SetFieldDirty |
Marque le champ spécifié dans l’enregistrement actif comme modifié. |
CRecordset::SetFieldNull |
Définit la valeur du champ spécifié dans l’enregistrement actif sur Null (sans valeur). |
CRecordset::SetLockingMode |
Définit le mode de verrouillage sur le verrouillage « optimiste » (la valeur par défaut) ou le verrouillage « pessimiste ». Détermine comment les enregistrements sont verrouillés pour les mises à jour. |
CRecordset::SetParamNull |
Définit le paramètre spécifié sur Null (sans valeur). |
CRecordset::SetRowsetCursorPosition |
Positionne le curseur sur la ligne spécifiée dans l’ensemble de lignes. |
CRecordset::SetRowsetSize |
Spécifie le nombre d’enregistrements que vous souhaitez récupérer lors d’une extraction. |
CRecordset::Update |
Termine une AddNew opération en Edit enregistrant les données nouvelles ou modifiées sur la source de données. |
Membres de données publiques
| Nom | Descriptif |
|---|---|
CRecordset::m_hstmt |
Contient le handle d’instruction ODBC pour le jeu d’enregistrements. Tapez HSTMT. |
CRecordset::m_nFields |
Contient le nombre de membres de données de champ dans le jeu d’enregistrements. Tapez UINT. |
CRecordset::m_nParams |
Contient le nombre de membres de données de paramètre dans le jeu d’enregistrements. Tapez UINT. |
CRecordset::m_pDatabase |
Contient un pointeur vers l’objet CDatabase via lequel le jeu d’enregistrements est connecté à une source de données. |
CRecordset::m_strFilter |
Contient une CString clause langage SQL (SQL). WHERE Utilisé comme filtre pour sélectionner uniquement les enregistrements qui répondent à certains critères. |
CRecordset::m_strSort |
Contient une CString clause SQL qui spécifie une clause SQL ORDER BY . Permet de contrôler la façon dont les enregistrements sont triés. |
Notes
Les objets appelés « recordsets », CRecordset sont généralement utilisés sous deux formes : des feuilles de réponse dynamiques et des instantanés. Une feuille de réponse dynamique reste synchronisée avec les mises à jour des données effectuées par d’autres utilisateurs. Un instantané est une vue statique des données. Chaque formulaire représente un ensemble d’enregistrements fixes au moment de l’ouverture du jeu d’enregistrements. Lorsque vous faites défiler vers un enregistrement dans une feuille de réponse dynamique, il reflète les modifications apportées à l’enregistrement, soit par d’autres utilisateurs, soit par d’autres jeux d’enregistrements dans votre application.
Remarque
Si vous utilisez les classes DAO (Data Access Objects) plutôt que les classes ODBC (Open Database Connectivity), utilisez plutôt la classe CDaoRecordset . Pour plus d’informations, consultez Vue d’ensemble : Programmation de base de données.
Pour utiliser l’un ou l’autre type d’recordset, vous dérivez généralement une classe recordset spécifique à l’application à partir de CRecordset. Les recordsets sélectionnent des enregistrements à partir d’une source de données, puis vous pouvez :
Faites défiler les enregistrements.
Mettez à jour les enregistrements et spécifiez un mode de verrouillage.
Filtrez le jeu d’enregistrements pour limiter les enregistrements qu’il sélectionne parmi ceux disponibles sur la source de données.
Triez le jeu d’enregistrements.
Paramétrez le jeu d’enregistrements pour personnaliser sa sélection avec des informations non connues jusqu’au moment de l’exécution.
Pour utiliser votre classe, ouvrez une base de données et construisez un objet recordset, en transmettant au constructeur un pointeur vers votre CDatabase objet. Appelez ensuite la fonction membre du Open jeu d’enregistrements, où vous pouvez spécifier si l’objet est une feuille de réponse dynamique ou un instantané. L’appel Open sélectionne des données à partir de la source de données. Une fois l’objet recordset ouvert, utilisez ses fonctions membres et ses membres de données pour parcourir les enregistrements et les exploiter. Les opérations disponibles varient selon que l’objet est une feuille de réponse dynamique ou un instantané, qu’il soit mis à jour ou en lecture seule (cela dépend de la capacité de la source de données ODBC (Open Database Connectivity) et que vous ayez implémenté la récupération de lignes en bloc. Pour actualiser les enregistrements qui ont peut-être été modifiés ou ajoutés depuis l’appel Open , appelez la fonction membre de l’objet Requery . Appelez la fonction membre de Close l’objet et détruisez l’objet lorsque vous avez terminé avec celui-ci.
Dans une classe dérivée CRecordset , l’échange de champs d’enregistrement (RFX) ou l’échange de champs d’enregistrement en bloc (RFX en bloc) est utilisé pour prendre en charge la lecture et la mise à jour des champs d’enregistrement.
Pour plus d’informations sur les recordsets et l’échange de champs d’enregistrement, consultez les articles Vue d’ensemble : Programmation de base de données, Recordset (ODBC), Recordset : Extraction d’enregistrements en bloc (ODBC) et Échange de champs d’enregistrement (RFX). Pour un focus sur les feuilles de réponse dynamiques et les instantanés, consultez les articles Dynaset et Snapshot.
Hiérarchie d’héritage
CRecordset
Spécifications
En-tête :afxdb.h
CRecordset::AddNew
Prépare l’ajout d’un nouvel enregistrement à la table.
virtual void AddNew();
Notes
Vous devez appeler la Requery fonction membre pour voir l’enregistrement nouvellement ajouté. Les champs de l’enregistrement sont initialement Null. (Dans la terminologie de la base de données, Null signifie « sans valeur » et n’est pas identique à NULL en C++.) Pour terminer l’opération, vous devez appeler la Update fonction membre.
Update enregistre vos modifications dans la source de données.
Remarque
Si vous avez implémenté la récupération de lignes en bloc, vous ne pouvez pas appeler AddNew. Cela entraîne une assertion ayant échoué. Bien que la classe CRecordset ne fournisse pas de mécanisme pour mettre à jour des lignes de données en bloc, vous pouvez écrire vos propres fonctions à l’aide de la fonction SQLSetPosAPI ODBC. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
AddNew prépare un nouvel enregistrement vide à l’aide des membres de données de champ du jeu d’enregistrements. Après avoir appelé AddNew, définissez les valeurs souhaitées dans les membres de données de champ du jeu d’enregistrements. (Vous n’avez pas besoin d’appeler le Modifiez la fonction membre à cet effet ; utilisez Edit uniquement pour les enregistrements existants.) Lorsque vous appelez Update, les valeurs modifiées dans les membres de données de champ sont enregistrées sur la source de données.
Attention
Si vous faites défiler vers un nouvel enregistrement avant d’appeler Update, le nouvel enregistrement est perdu et aucun avertissement n’est donné.
Si la source de données prend en charge les transactions, vous pouvez faire partie de votre AddNew appel d’une transaction. Pour plus d’informations sur les transactions, consultez la classe CDatabase. Appel avant d’appeler CDatabase::BeginTransAddNew.
Remarque
Pour les feuilles de réponse dynamiques, de nouveaux enregistrements sont ajoutés au jeu d’enregistrements comme dernier enregistrement. Les enregistrements ajoutés ne sont pas ajoutés aux instantanés ; vous devez appeler Requery pour actualiser le jeu d’enregistrements.
Il est illégal d’appeler AddNew un jeu d’enregistrements dont Open la fonction membre n’a pas été appelée. A CDBException est levée si vous appelez AddNew un jeu d’enregistrements qui ne peut pas être ajouté. Vous pouvez déterminer si le jeu d’enregistrements est pouvant être mis à jour en appelant CanAppend.
Pour plus d’informations, consultez les articles suivants : Recordset : How Recordsets Update Records (ODBC), Recordset : Adding, Update and Deleting Records (ODBC) and Transaction (ODBC).
Exemple
voir Transaction : exécution d’une transaction dans un recordset (ODBC)
CRecordset::CanAppend
Détermine si le jeu d’enregistrements précédemment ouvert vous permet d’ajouter de nouveaux enregistrements.
BOOL CanAppend() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements autorise l’ajout de nouveaux enregistrements ; sinon 0.
CanAppend retourne 0 si vous avez ouvert le jeu d’enregistrements en lecture seule.
CRecordset::CanBookmark
Détermine si le jeu d’enregistrements vous permet de marquer des enregistrements à l’aide de signets.
BOOL CanBookmark() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements prend en charge les signets ; sinon 0.
Notes
Cette fonction est indépendante de l’option CRecordset::useBookmarks dans le dwOptions paramètre de la Open fonction membre.
CanBookmark indique si le pilote ODBC et le type de curseur donnés prennent en charge les signets.
CRecordset::useBookmarks indique si les signets seront disponibles, à condition qu’ils soient pris en charge.
Remarque
Les signets ne sont pas pris en charge sur les jeux d’enregistrements en avant uniquement.
Pour plus d’informations sur les signets et la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Signets et positions absolues (ODBC) et Recordset : Défilement (ODBC).
CRecordset::Cancel
Demande que la source de données annule une opération asynchrone en cours ou un processus à partir d’un deuxième thread.
void Cancel();
Notes
Les classes ODBC MFC n’utilisent plus le traitement asynchrone ; pour effectuer une opération asynchrone, vous devez appeler directement la fonction SQLSetConnectOptionAPI ODBC. Pour plus d’informations, consultez « Exécution asynchrone de fonctions » dans le Guide du programmeur du SDK ODBC.
CRecordset::CancelUpdate
Annule les mises à jour en attente, provoquées par une Edit ou AddNew une opération, avant Update d’être appelées.
void CancelUpdate();
Notes
Remarque
Cette fonction membre n’est pas applicable sur les jeux d’enregistrements qui utilisent l’extraction de lignes en bloc, car ces jeux d’enregistrements ne peuvent pas appeler Edit, AddNewou Update. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Si la vérification automatique des champs incorrects est activée, CancelUpdate restaure les variables membres sur les valeurs qu’elles avaient avant Edit ou AddNew a été appelées ; sinon, toutes les modifications de valeur restent. Par défaut, la vérification automatique des champs est activée lorsque le jeu d’enregistrements est ouvert. Pour le désactiver, vous devez spécifier le CRecordset::noDirtyFieldCheck paramètre de la dwOptionsfonction Membre Open .
Pour plus d’informations sur la mise à jour des données, consultez Recordset : Ajout, mise à jour et suppression d’enregistrements (ODBC).
CRecordset::CanRestart
Détermine si le jeu d’enregistrements autorise le redémarrage de sa requête (pour actualiser ses enregistrements) en appelant la Requery fonction membre.
BOOL CanRestart() const;
Valeur retournée
Différent de zéro si la requête est autorisée ; sinon 0.
CRecordset::CanScroll
Détermine si le jeu d’enregistrements autorise le défilement.
BOOL CanScroll() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements autorise le défilement ; sinon 0.
Notes
Pour plus d’informations sur le défilement, consultez Recordset : Défilement (ODBC).
CRecordset::CanTransact
Détermine si le jeu d’enregistrements autorise les transactions.
BOOL CanTransact() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements autorise les transactions ; sinon 0.
Notes
Pour plus d’informations, consultez Transaction (ODBC).
CRecordset::CanUpdate
Détermine si le jeu d’enregistrements peut être mis à jour.
BOOL CanUpdate() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements peut être mis à jour ; sinon 0.
Notes
Un recordset peut être en lecture seule si la source de données sous-jacente est en lecture seule ou si vous avez spécifié CRecordset::readOnly dans le dwOptions paramètre lorsque vous avez ouvert le jeu d’enregistrements.
CRecordset::CheckRowsetError
Appelé pour gérer les erreurs générées lors de l’extraction d’enregistrements.
virtual void CheckRowsetError(RETCODE nRetCode);
Paramètres
nRetCode
Code de retour d’une fonction API ODBC. Pour plus d'informations, consultez Notes.
Notes
Cette fonction membre virtuelle gère les erreurs qui se produisent lorsque les enregistrements sont récupérés et sont utiles lors de la récupération de lignes en bloc. Vous pouvez envisager de CheckRowsetError remplacer pour implémenter votre propre gestion des erreurs.
CheckRowsetError est appelé automatiquement dans une opération de navigation de curseur, telle que Open, Requeryou toute Move opération. Elle a passé la valeur de retour de la fonction SQLExtendedFetchAPI ODBC. Le tableau suivant répertorie les valeurs possibles pour le nRetCode paramètre.
| nRetCode | Descriptif |
|---|---|
SQL_SUCCESS |
La fonction s’est terminée correctement ; aucune information supplémentaire n’est disponible. |
SQL_SUCCESS_WITH_INFO |
La fonction s’est terminée avec succès, éventuellement avec une erreur non irrécupérable. Des informations supplémentaires peuvent être obtenues en appelant SQLError. |
SQL_NO_DATA_FOUND |
Toutes les lignes du jeu de résultats ont été extraites. |
SQL_ERROR |
Échec de la fonction. Des informations supplémentaires peuvent être obtenues en appelant SQLError. |
SQL_INVALID_HANDLE |
La fonction a échoué en raison d’un handle d’environnement non valide, d’un handle de connexion ou d’un handle d’instruction. Cela indique une erreur de programmation. Aucune information supplémentaire n’est disponible à partir de SQLError. |
SQL_STILL_EXECUTING |
Une fonction démarrée de façon asynchrone est toujours en cours d’exécution. Par défaut, MFC ne transmet jamais cette valeur à CheckRowsetError; MFC continuera à appeler SQLExtendedFetch jusqu’à ce qu’il ne retourne SQL_STILL_EXECUTINGplus . |
Pour plus d’informations sur SQLError, consultez le Kit de développement logiciel (SDK) Windows. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::Close
Ferme le jeu d’enregistrements.
virtual void Close();
Notes
Odbc HSTMT et toutes les mémoires allouées pour le jeu d’enregistrements sont libérées. En règle générale, après l’appel Close, vous supprimez l’objet recordset C++ s’il a été alloué avec new.
Vous pouvez appeler Open à nouveau après l’appel Close. Cela vous permet de réutiliser l’objet recordset. L’alternative consiste à appeler Requery.
Exemple
// Construct a snapshot object
CCustomer rsCustSet(NULL);
if (!rsCustSet.Open())
return;
// Use the snapshot ...
// Close the snapshot
rsCustSet.Close();
// Destructor is called when the function exits
CRecordset::CRecordset
Construit un objet CRecordset.
CRecordset(CDatabase* pDatabase = NULL);
Paramètres
pDatabase
Contient un pointeur vers un CDatabase objet ou la valeur NULL. Si ce n’est pas NULL le cas et que la fonction membre de CDatabase l’objet Open n’a pas été appelée pour la connecter à la source de données, le jeu d’enregistrements tente de l’ouvrir pour vous pendant son propre Open appel. Si vous passez, un NULL objet est construit et connecté pour vous à l’aide des informations de source de données que vous avez spécifiées CDatabaselorsque vous avez dérivé votre classe recordset avec ClassWizard.
Notes
Vous pouvez utiliser CRecordset directement ou dériver une classe spécifique à l’application à partir de CRecordset. Vous pouvez utiliser ClassWizard pour dériver vos classes recordset.
Remarque
Une classe dérivée doit fournir son propre constructeur. Dans le constructeur de votre classe dérivée, appelez le constructeur CRecordset::CRecordset, en lui transmettant les paramètres appropriés.
NULL Passez à votre constructeur recordset pour avoir un CDatabase objet construit et connecté automatiquement pour vous. Il s’agit d’un raccourci utile qui ne vous oblige pas à construire et à connecter un CDatabase objet avant de construire votre jeu d’enregistrements.
Exemple
Pour plus d’informations, consultez Recordset : Déclaration d’une classe pour une table (ODBC).
CRecordset::Delete
Supprime l’enregistrement actif.
virtual void Delete();
Notes
Une fois la suppression réussie, les membres de données de champ du jeu d’enregistrements sont définis sur une valeur Null et vous devez appeler explicitement l’une des Move fonctions pour déplacer l’enregistrement supprimé. Une fois que vous déplacez l’enregistrement supprimé, il n’est pas possible de le retourner. Si la source de données prend en charge les transactions, vous pouvez effectuer la Delete partie d’appel d’une transaction. Pour plus d’informations, consultez Transaction (ODBC).
Remarque
Si vous avez implémenté la récupération de lignes en bloc, vous ne pouvez pas appeler Delete. Cela entraîne une assertion ayant échoué. Bien que la classe CRecordset ne fournisse pas de mécanisme pour mettre à jour des lignes de données en bloc, vous pouvez écrire vos propres fonctions à l’aide de la fonction SQLSetPosAPI ODBC. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Attention
Le jeu d’enregistrements doit être mis à jour et il doit y avoir un enregistrement valide actif dans le jeu d’enregistrements lorsque vous appelez Delete; sinon, une erreur se produit. Par exemple, si vous supprimez un enregistrement mais que vous ne faites pas défiler vers un nouvel enregistrement avant d’appeler Delete à nouveau, Delete lève une exception CDBException.
Contrairement AddNew à et Edit, un appel à Delete n’est pas suivi d’un appel à Update. Si un Delete appel échoue, les membres de données de champ restent inchangés.
Exemple
Cet exemple montre un jeu d’enregistrements créé sur le cadre d’une fonction. L’exemple suppose l’existence d’une m_dbCustvariable membre de type CDatabase déjà connectée à la source de données.
// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
!rsCustSet.CanTransact())
{
return;
}
m_dbCust.BeginTrans();
// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();
// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();
CRecordset::DoBulkFieldExchange
Appelé pour échanger des lignes de données en bloc de la source de données vers le jeu d’enregistrements. Implémente l’échange de champs d’enregistrement en bloc (RFX en bloc).
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
Paramètres
pFX
Pointeur vers un objet CFieldExchange. L’infrastructure a déjà configuré cet objet pour spécifier un contexte pour l’opération d’échange de champs.
Notes
Lorsque l’extraction de lignes en bloc est implémentée, l’infrastructure appelle cette fonction membre pour transférer automatiquement des données de la source de données vers votre objet recordset.
DoBulkFieldExchange lie également vos membres de données de paramètre, le cas échéant, aux espaces réservés de paramètres dans la chaîne d’instruction SQL pour la sélection du jeu d’enregistrements.
Si la récupération de lignes en bloc n’est pas implémentée, l’infrastructure appelle DoFieldExchange. Pour implémenter l’extraction de lignes en bloc, vous devez spécifier l’option CRecordset::useMultiRowFetch du paramètre dwOptions dans la Open fonction membre.
Remarque
DoBulkFieldExchange est disponible uniquement si vous utilisez une classe dérivée de CRecordset. Si vous avez créé un objet recordset directement à partir duquel CRecordsetvous devez appeler la GetFieldValue fonction membre pour récupérer des données.
L’échange de champs d’enregistrement en bloc (RFX en bloc) est similaire à l’échange de champs d’enregistrement (RFX). Les données sont automatiquement transférées de la source de données à l’objet recordset. Toutefois, vous ne pouvez pas appeler AddNew, Editou DeleteUpdate transférer les modifications vers la source de données. La classe CRecordset ne fournit actuellement pas de mécanisme permettant de mettre à jour des lignes de données en bloc . Toutefois, vous pouvez écrire vos propres fonctions à l’aide de la fonction SQLSetPosAPI ODBC.
ClassWizard ne prend pas en charge l’échange de champs d’enregistrement en bloc ; par conséquent, vous devez remplacer DoBulkFieldExchange manuellement en écrivant des appels aux fonctions RFX en bloc. Pour plus d’informations sur ces fonctions, consultez Record Field Exchange Functions.
Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC). Pour plus d’informations, consultez Record Field Exchange (RFX).
CRecordset::DoFieldExchange
Appelé pour échanger des données (dans les deux sens) entre les membres de données de champ du jeu d’enregistrements et l’enregistrement correspondant sur la source de données. Implémente l’échange de champs d’enregistrement (RFX).
virtual void DoFieldExchange(CFieldExchange* pFX);
Paramètres
pFX
Pointeur vers un objet CFieldExchange. L’infrastructure a déjà configuré cet objet pour spécifier un contexte pour l’opération d’échange de champs.
Notes
Lorsque l’extraction de lignes en bloc n’est pas implémentée, l’infrastructure appelle cette fonction membre pour échanger automatiquement des données entre les membres de données de champ de votre objet recordset et les colonnes correspondantes de l’enregistrement actif sur la source de données.
DoFieldExchange lie également vos membres de données de paramètre, le cas échéant, aux espaces réservés de paramètres dans la chaîne d’instruction SQL pour la sélection du jeu d’enregistrements.
Si l’extraction de lignes en bloc est implémentée, l’infrastructure appelle DoBulkFieldExchange. Pour implémenter l’extraction de lignes en bloc, vous devez spécifier l’option CRecordset::useMultiRowFetch du dwOptions paramètre dans la Open fonction membre.
Remarque
DoFieldExchange est disponible uniquement si vous utilisez une classe dérivée de CRecordset. Si vous avez créé un objet recordset directement à partir duquel CRecordsetvous devez appeler la fonction membre GetFieldValue pour récupérer des données.
L’échange de données de champ, appelée échange de champs d’enregistrement (RFX), fonctionne dans les deux sens : des membres de données de champ de l’objet recordset aux champs de l’enregistrement sur la source de données, et de l’enregistrement de la source de données à l’objet recordset.
La seule action que vous devez normalement entreprendre pour implémenter DoFieldExchange pour votre classe recordset dérivée consiste à créer la classe avec ClassWizard et à spécifier les noms et les types de données des membres de données de champ. Vous pouvez également ajouter du code à ce que ClassWizard écrit pour spécifier des membres de données de paramètre ou pour traiter les colonnes que vous liez dynamiquement. Pour plus d’informations, consultez Recordset : liaison dynamique de colonnes de données (ODBC).
Lorsque vous déclarez votre classe recordset dérivée avec ClassWizard, l’Assistant écrit un remplacement pour DoFieldExchange vous, qui ressemble à l’exemple suivant :
void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
RFX_Long(pFX, _T("[BillingID]"), m_BillingID);
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param"), m_strParam);
}
Pour plus d’informations sur les fonctions RFX, consultez Fonctions Exchange de champ d’enregistrement.
Pour obtenir d’autres exemples et détails sur DoFieldExchange, consultez Record Field Exchange : How RFX Works. Pour obtenir des informations générales sur RFX, consultez Record Field Exchange.
CRecordset::Edit
Autorise les modifications apportées à l’enregistrement actif.
virtual void Edit();
Notes
Après avoir appelé Edit, vous pouvez modifier les membres de données de champ en réinitialisant directement leurs valeurs. L’opération est terminée lorsque vous appelez la Update fonction membre pour enregistrer vos modifications sur la source de données.
Remarque
Si vous avez implémenté la récupération de lignes en bloc, vous ne pouvez pas appeler Edit. Cela entraîne une assertion ayant échoué. Bien que la classe CRecordset ne fournisse pas de mécanisme pour mettre à jour des lignes de données en bloc, vous pouvez écrire vos propres fonctions à l’aide de la fonction SQLSetPosAPI ODBC. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Edit enregistre les valeurs des membres de données du jeu d’enregistrements. Si vous appelez Edit, apportez des modifications, puis appelez Edit à nouveau, les valeurs de l’enregistrement sont restaurées sur ce qu’elles étaient avant le premier Edit appel.
Dans certains cas, vous pouvez mettre à jour une colonne en la rendant Null (contenant aucune donnée). Pour ce faire, appelez SetFieldNull avec un paramètre true pour marquer le champ Null ; cela entraîne également la mise à jour de la colonne. Si vous souhaitez qu’un champ soit écrit dans la source de données même si sa valeur n’a pas changé, appelez SetFieldDirty avec un paramètre TRUE. Cela fonctionne même si le champ a la valeur Null.
Si la source de données prend en charge les transactions, vous pouvez effectuer la Edit partie d’appel d’une transaction. Appel CDatabase::BeginTrans avant d’appeler Edit et après l’ouverture du jeu d’enregistrements. En outre, l’appel CDatabase::CommitTrans n’est pas un substitut à l’appel Update pour terminer l’opération Edit . Pour plus d’informations sur les transactions, consultez la classe CDatabase.
Selon le mode de verrouillage actuel, l’enregistrement mis à jour peut être verrouillé Edit jusqu’à ce que vous appeliez Update ou faites défiler vers un autre enregistrement, ou qu’il soit verrouillé uniquement pendant l’appel Edit . Vous pouvez modifier le mode de verrouillage avec SetLockingMode.
La valeur précédente de l’enregistrement actif est restaurée si vous faites défiler vers un nouvel enregistrement avant d’appeler Update. A CDBException est levée si vous appelez Edit un jeu d’enregistrements qui ne peut pas être mis à jour ou s’il n’y a pas d’enregistrement actif.
Pour plus d’informations, consultez les articles Transaction (ODBC) et Recordset : Locking Records (ODBC).
Exemple
// To edit a record, first set up the edit buffer
rsCustSet.Edit();
// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");
// Finally, complete the operation
if (!rsCustSet.Update())
{
// Handle the failure to update
AfxMessageBox(_T("Couldn't update record!"));
}
CRecordset::FlushResultSet
Récupère le jeu de résultats suivant d’une requête prédéfinie (procédure stockée), s’il existe plusieurs jeux de résultats.
BOOL FlushResultSet();
Valeur retournée
Différent de zéro s’il existe d’autres jeux de résultats à récupérer ; sinon 0.
Notes
Vous devez appeler FlushResultSet uniquement une fois le curseur terminé sur le jeu de résultats actuel. Lorsque vous récupérez le jeu de résultats suivant en appelant FlushResultSet, votre curseur n’est pas valide sur ce jeu de résultats ; vous devez appeler la MoveNext fonction membre après l’appel FlushResultSet.
Si une requête prédéfinie utilise un paramètre de sortie ou des paramètres d’entrée/sortie, vous devez appeler FlushResultSet jusqu’à ce qu’elle retourne FALSE(la valeur 0), afin d’obtenir ces valeurs de paramètre.
FlushResultSet appelle la fonction SQLMoreResultsAPI ODBC . Si SQLMoreResults cette propriété est retournée SQL_ERROR ou SQL_INVALID_HANDLE, lève FlushResultSet une exception. Pour plus d’informations sur SQLMoreResults, consultez le Kit de développement logiciel (SDK) Windows.
Votre procédure stockée doit avoir des champs liés si vous souhaitez appeler FlushResultSet.
Exemple
Le code suivant suppose qu’il COutParamRecordset s’agit d’un CRecordsetobjet dérivé basé sur une requête prédéfinie avec un paramètre d’entrée et un paramètre de sortie, et d’avoir plusieurs jeux de résultats. Notez la structure du DoFieldExchange remplacement.
// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputParam);
RFX_Long(pFX, _T("Param1"), m_nCountParam);
// The "Param1" name here is a dummy name
// that is never used
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param2"), m_strNameParam);
// The "Param2" name here is a dummy name
// that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");
// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor
// type for multiple rowset returning stored
// procedures
rs.Open(CRecordset::forwardOnly,
_T("{? = CALL GetCourses( ? )}"),
CRecordset::readOnly);
// Loop through all the data in the first result set
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
// Retrieve other result sets...
while (rs.FlushResultSet())
{
// must call MoveNext because cursor is invalid
rs.MoveNext();
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
}
// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.
// TO DO: Use m_nCountParam
// Cleanup
rs.Close();
CRecordset::GetBookmark
Obtient la valeur de signet pour l’enregistrement actif.
void GetBookmark(CDBVariant& varBookmark);
Paramètres
varBookmark
Référence à un CDBVariant objet représentant le signet sur l’enregistrement actif.
Notes
Pour déterminer si les signets sont pris en charge sur le jeu d’enregistrements, appelez CanBookmark. Pour rendre les signets disponibles s’ils sont pris en charge, vous devez définir l’option CRecordset::useBookmarks dans le paramètre de la dwOptionsOpen fonction membre.
Remarque
Si les signets ne sont pas pris en charge ou indisponibles, l’appel GetBookmark entraîne la levée d’une exception. Les signets ne sont pas pris en charge sur les jeux d’enregistrements en avant uniquement.
GetBookmark affecte la valeur du signet pour l’enregistrement actif à un CDBVariant objet. Pour revenir à cet enregistrement à tout moment après le passage à un autre enregistrement, appelez SetBookmark avec l’objet correspondant CDBVariant .
Remarque
Après certaines opérations de jeu d’enregistrements, les signets peuvent ne plus être valides. Par exemple, si vous appelez GetBookmark suivi, Requeryvous ne pourrez peut-être pas revenir à l’enregistrement avec SetBookmark. Appel CDatabase::GetBookmarkPersistence pour vérifier si vous pouvez appeler SetBookmarken toute sécurité .
Pour plus d’informations sur les signets et la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Signets et positions absolues (ODBC) et Recordset : Défilement (ODBC).
CRecordset::GetDefaultConnect
Appelé pour obtenir la chaîne de connexion par défaut.
virtual CString GetDefaultConnect();
Valeur retournée
Qui CString contient la chaîne de connexion par défaut.
Notes
L’infrastructure appelle cette fonction membre pour obtenir la chaîne de connexion par défaut de la source de données sur laquelle le jeu d’enregistrements est basé.
ClassWizard implémente cette fonction pour vous en identifiant la même source de données que celle utilisée pour ClassWizard obtenir des informations sur les tables et les colonnes. Vous trouverez probablement pratique de vous appuyer sur cette connexion par défaut lors du développement de votre application. Toutefois, la connexion par défaut peut ne pas convenir aux utilisateurs de votre application. Si c’est le cas, vous devez réexémettre cette fonction, en ignorant ClassWizardla version de 's. Pour plus d’informations sur les chaîne de connexion, consultez La source de données (ODBC)
CRecordset::GetDefaultSQL
Appelé pour obtenir la chaîne SQL par défaut à exécuter.
virtual CString GetDefaultSQL();
Valeur retournée
Qui CString contient l’instruction SQL par défaut.
Notes
L’infrastructure appelle cette fonction membre pour obtenir l’instruction SQL par défaut sur laquelle le jeu d’enregistrements est basé. Il peut s’agir d’un nom de table ou d’une instruction SQL SELECT .
Vous définissez indirectement l’instruction SQL par défaut en déclarant votre classe recordset avec ClassWizard, et ClassWizard effectue cette tâche pour vous.
Si vous avez besoin de la chaîne d’instruction SQL pour votre propre utilisation, appelez GetSQL, qui retourne l’instruction SQL utilisée pour sélectionner les enregistrements du jeu d’enregistrements lors de son ouverture. Vous pouvez modifier la chaîne SQL par défaut dans le remplacement de GetDefaultSQLvotre classe . Par exemple, vous pouvez spécifier un appel à une requête prédéfinie à l’aide d’une CALL instruction. (Notez toutefois que si vous modifiez GetDefaultSQL, vous devez également modifier m_nFields pour correspondre au nombre de colonnes dans la source de données.)
Pour plus d’informations, consultez Recordset : Déclaration d’une classe pour une table (ODBC).
Attention
Le nom de la table est vide si l’infrastructure n’a pas pu identifier un nom de table, si plusieurs noms de table ont été fournis ou si une CALL instruction n’a pas pu être interprétée. Lorsque vous utilisez une instruction, n’insérez pas d’espace CALL blanc entre l’accolades et le CALL mot clé, ni avant l’accolades ou avant le SELECT mot clé dans une SELECT instruction.
CRecordset::GetFieldValue
Récupère les données de champ dans l’enregistrement actif.
void GetFieldValue(
LPCTSTR lpszName,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
LPCTSTR lpszName,
CStringA& strValue
);
void GetFieldValue(
LPCTSTR lpszName,
CStringW& strValue
);
void GetFieldValue(
short nIndex,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
short nIndex,
CStringA& strValue);
void GetFieldValue(
short nIndex,
CStringW& strValue);
Paramètres
lpszName
Nom d’un champ.
varValue Référence à un CDBVariant objet qui stocke la valeur du champ.
nFieldType
Type de données ODBC C du champ. À l’aide de la valeur par défaut, DEFAULT_FIELD_TYPEforce GetFieldValue à déterminer le type de données C à partir du type de données SQL, en fonction du tableau suivant. Sinon, vous pouvez spécifier le type de données directement ou choisir un type de données compatible ; par exemple, vous pouvez stocker n’importe quel type de données dans SQL_C_CHAR.
| Type de données C | Type de données SQL |
|---|---|
SQL_C_BIT |
SQL_BIT |
SQL_C_UTINYINT |
SQL_TINYINT |
SQL_C_SSHORT |
SQL_SMALLINT |
SQL_C_SLONG |
SQL_INTEGER |
SQL_C_FLOAT |
SQL_REAL |
SQL_C_DOUBLE |
SQL_FLOATSQL_DOUBLE |
SQL_C_TIMESTAMP |
SQL_DATESQL_TIMESQL_TIMESTAMP |
SQL_C_CHAR |
SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR |
SQL_C_BINARY |
SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY |
Pour plus d’informations sur les types de données ODBC, consultez les rubriques « Types de données SQL » et « Types de données C » dans l’annexe D du Kit de développement logiciel (SDK) Windows.
nIndex
Index de base zéro du champ.
strValue
Référence à un CString objet qui stocke la valeur du champ convertie en texte, quel que soit le type de données du champ.
Notes
Vous pouvez rechercher un champ par nom ou par index. Vous pouvez stocker la valeur de champ dans un CDBVariant objet ou un CString objet.
Si vous avez implémenté la récupération de lignes en bloc, l’enregistrement actif est toujours positionné sur le premier enregistrement d’un ensemble de lignes. Pour utiliser GetFieldValue un enregistrement dans un ensemble de lignes donné, vous devez d’abord appeler la SetRowsetCursorPosition fonction membre pour déplacer le curseur vers la ligne souhaitée dans cet ensemble de lignes. Appelez GetFieldValue ensuite cette ligne. Pour implémenter l’extraction de lignes en bloc, vous devez spécifier l’option CRecordset::useMultiRowFetch du dwOptions paramètre dans la Open fonction membre.
Vous pouvez utiliser GetFieldValue pour extraire dynamiquement des champs au moment de l’exécution plutôt que de les lier statiquement au moment du design. Par exemple, si vous avez déclaré un objet recordset directement à partir duquel CRecordsetvous devez l’utiliser GetFieldValue pour récupérer les données de champ ; l’échange de champs d’enregistrement (RFX) ou l’échange de champs d’enregistrement en bloc (RFX en bloc) n’est pas implémenté.
Remarque
Si vous déclarez un objet recordset sans dériver CRecordset, n’avez pas chargé la bibliothèque de curseurs ODBC. La bibliothèque de curseurs exige que le jeu d’enregistrements ait au moins une colonne liée ; toutefois, lorsque vous utilisez CRecordset directement, aucune des colonnes n’est liée. Les fonctions CDatabase::OpenEx membres et CDatabase::Open contrôlent si la bibliothèque de curseurs sera chargée.
GetFieldValue appelle la fonction SQLGetDataAPI ODBC . Si votre pilote génère la valeur SQL_NO_TOTAL pour la longueur réelle de la valeur de champ, GetFieldValue lève une exception. Pour plus d’informations sur SQLGetData, consultez le Kit de développement logiciel (SDK) Windows.
Exemple
L’exemple de code suivant illustre les appels à GetFieldValue un objet recordset déclaré directement à partir de CRecordset.
// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
rs.GetFieldValue(index, varValue);
// do something with varValue
}
rs.MoveNext();
}
rs.Close();
db.Close();
Remarque
Contrairement à la classe CDaoRecordsetDAO, CRecordset n’a pas de SetFieldValue fonction membre. Si vous créez un objet directement à partir de CRecordset, il est en lecture seule.
Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::GetODBCFieldCount
Récupère le nombre total de champs dans votre objet recordset.
short GetODBCFieldCount() const;
Valeur retournée
Nombre de champs dans le jeu d’enregistrements.
Notes
Pour plus d’informations sur la création d’recordsets, consultez Recordset : Création et fermeture de recordsets (ODBC).
CRecordset::GetODBCFieldInfo
Obtient des informations sur les champs du jeu d’enregistrements.
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
Paramètres
lpszName
Nom d’un champ.
fieldinfo
Référence à une CODBCFieldInfo structure.
nIndex
Index de base zéro du champ.
Notes
Une version de la fonction vous permet de rechercher un champ par nom. L’autre version vous permet de rechercher un champ par index.
Pour obtenir une description des informations retournées, consultez la CODBCFieldInfo structure.
Pour plus d’informations sur la création d’recordsets, consultez Recordset : Création et fermeture de recordsets (ODBC).
CRecordset::GetRecordCount
Détermine la taille du jeu d’enregistrements.
long GetRecordCount() const;
Valeur retournée
Nombre d’enregistrements dans le jeu d’enregistrements ; 0 si le jeu d’enregistrements ne contient aucun enregistrement ; ou -1 si le nombre d’enregistrements ne peut pas être déterminé.
Notes
Attention
Le nombre d’enregistrements est conservé sous la forme d’une « marque d’eau élevée », l’enregistrement numéroté le plus élevé, mais vu que l’utilisateur passe par les enregistrements. Le nombre total d’enregistrements est connu uniquement une fois que l’utilisateur a été déplacé au-delà du dernier enregistrement. Pour des raisons de performances, le nombre n’est pas mis à jour lorsque vous appelez MoveLast. Pour compter les enregistrements vous-même, appelez MoveNext à plusieurs reprises jusqu’à ce que IsEOF le retour ne soit pas différent de zéro. L’ajout d’un enregistrement et CRecordset::AddNewUpdate l’augmentation du nombre ; la suppression d’un enregistrement CRecordset::Delete diminue le nombre.
CRecordset::GetRowsetSize
Obtient le paramètre actuel pour le nombre de lignes que vous souhaitez récupérer lors d’une extraction donnée.
DWORD GetRowsetSize() const;
Valeur retournée
Nombre de lignes à récupérer lors d’une extraction donnée.
Notes
Si vous utilisez l’extraction de lignes en bloc, la taille d’ensemble de lignes par défaut lorsque le jeu d’enregistrements est ouvert est 25 ; sinon, c’est 1.
Pour implémenter l’extraction de lignes en bloc, vous devez spécifier l’option CRecordset::useMultiRowFetch dans le paramètre de la dwOptionsOpen fonction membre. Pour modifier le paramètre de la taille de l’ensemble de lignes, appelez SetRowsetSize.
Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::GetRowsFetched
Détermine le nombre d’enregistrements récupérés après une extraction.
DWORD GetRowsFetched() const;
Valeur retournée
Nombre de lignes récupérées à partir de la source de données après une extraction donnée.
Notes
Cela est utile lorsque vous avez implémenté la récupération de lignes en bloc. La taille de l’ensemble de lignes indique normalement le nombre de lignes récupérées à partir d’une extraction. Toutefois, le nombre total de lignes dans le jeu d’enregistrements affecte également le nombre de lignes récupérées dans un ensemble de lignes. Par exemple, si votre jeu d’enregistrements a 10 enregistrements avec un paramètre de taille d’ensemble de lignes de quatre, la boucle dans le jeu d’enregistrements en appelant entraîne l’appel MoveNext de l’ensemble de lignes final ayant seulement deux enregistrements.
Pour implémenter la récupération de lignes en bloc, vous devez spécifier l’option CRecordset::useMultiRowFetch dans le paramètre dwOptions de la Open fonction membre. Pour spécifier la taille de l’ensemble de lignes, appelez SetRowsetSize.
Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Exemple
CMultiCustomer rs(&m_dbCust);
// Set the rowset size
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// loop through the recordset by rowsets
while (!rs.IsEOF())
{
for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
{
// do something
}
rs.MoveNext();
}
rs.Close();
CRecordset::GetRowStatus
Obtient l’état d’une ligne dans l’ensemble de lignes actuel.
WORD GetRowStatus(WORD wRow) const;
Paramètres
wRow
Position unique d’une ligne dans l’ensemble de lignes actuel. Cette valeur peut aller de 1 à la taille de l’ensemble de lignes.
Valeur retournée
Valeur d’état de la ligne. Pour plus d'informations, consultez Notes.
Notes
GetRowStatus retourne une valeur qui indique une modification de l’état de la ligne depuis sa dernière récupération à partir de la source de données, ou qu’aucune ligne correspondant à wRow elle n’a été extraite. Le tableau ci-dessous répertorie les valeurs de retour possibles.
| Valeur d’état | Descriptif |
|---|---|
SQL_ROW_SUCCESS |
La ligne n’est pas modifiée. |
SQL_ROW_UPDATED |
La ligne a été mise à jour. |
SQL_ROW_DELETED |
La ligne a été supprimée. |
SQL_ROW_ADDED |
La ligne a été ajoutée. |
SQL_ROW_ERROR |
La ligne n’est pas récursable en raison d’une erreur. |
SQL_ROW_NOROW |
Aucune ligne ne correspond à wRow. |
Pour plus d’informations, consultez la fonction SQLExtendedFetch API ODBC dans le Kit de développement logiciel (SDK) Windows.
CRecordset::GetStatus
Détermine l’index de l’enregistrement actif dans le jeu d’enregistrements et indique si le dernier enregistrement a été vu.
void GetStatus(CRecordsetStatus& rStatus) const;
Paramètres
rStatus
Référence à un objet CRecordsetStatus. Pour plus d’informations, consultez Notes.
Notes
CRecordset tente de suivre l’index, mais dans certaines circonstances cela peut ne pas être possible. Consultez GetRecordCount une explication.
La CRecordsetStatus structure a la forme suivante :
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};
Les deux membres ont CRecordsetStatus les significations suivantes :
m_lCurrentRecordContient l’index de base zéro de l’enregistrement actif dans le jeu d’enregistrements, s’il est connu. Si l’index ne peut pas être déterminé, ce membre contientAFX_CURRENT_RECORD_UNDEFINED(-2). SiIsBOFla valeur est TRUE (jeu d’enregistrements vide ou tentative de défilement avant le premier enregistrement),m_lCurrentRecordelle est définie surAFX_CURRENT_RECORD_BOF(-1). Si sur le premier enregistrement, il est défini sur 0, le deuxième enregistrement 1, et ainsi de suite.m_bRecordCountFinalDifférent de zéro si le nombre total d’enregistrements dans le jeu d’enregistrements a été déterminé. En règle générale, cela doit être effectué en commençant au début du jeu d’enregistrements et en appelantMoveNextjusqu’à ce queIsEOFle retour ne soit pas différent de zéro. Si ce membre est égal à zéro, le nombre d’enregistrements retourné parGetRecordCount, si ce n’est pas -1, n’est qu’un nombre de « marques d’eau élevées » des enregistrements.
CRecordset::GetSQL
Appelez cette fonction membre pour obtenir l’instruction SQL utilisée pour sélectionner les enregistrements du jeu d’enregistrements lorsqu’il a été ouvert.
const CString& GetSQL() const;
Valeur retournée
Référence const à une CString instruction SQL qui contient l’instruction SQL.
Notes
Il s’agit généralement d’une instruction SQL SELECT . La chaîne retournée par GetSQL est en lecture seule.
La chaîne retournée par GetSQL est généralement différente de n’importe quelle chaîne que vous avez peut-être passée au jeu d’enregistrements dans le lpszSQL paramètre à la Open fonction membre. Cela est dû au fait que le jeu d’enregistrements construit une instruction SQL complète en fonction de ce que vous avez passé à Open, de ce que vous avez spécifié avec ClassWizard, de ce que vous avez peut-être spécifié dans les m_strFilter membres et m_strSort de données, ainsi que tous les paramètres que vous avez spécifiés. Pour plus d’informations sur la façon dont le jeu d’enregistrements construit cette instruction SQL, consultez Recordset : How Recordsets Select Records (ODBC).
Remarque
Appelez cette fonction membre uniquement après l’appel Open.
CRecordset::GetTableName
Obtient le nom de la table SQL sur laquelle la requête du jeu d’enregistrements est basée.
const CString& GetTableName() const;
Valeur retournée
Référence const à un CString qui contient le nom de la table, si le jeu d’enregistrements est basé sur une table ; sinon, une chaîne vide.
Notes
GetTableName est valide uniquement si le jeu d’enregistrements est basé sur une table, et non sur une jointure de plusieurs tables ou une requête prédéfinie (procédure stockée). Le nom est en lecture seule.
Remarque
Appelez cette fonction membre uniquement après l’appel Open.
CRecordset::IsBOF
Retourne une valeur différente de zéro si le jeu d’enregistrements a été positionné avant le premier enregistrement. Il n’y a pas d’enregistrement actif.
BOOL IsBOF() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements ne contient aucun enregistrement ou si vous avez fait défiler vers l’arrière avant le premier enregistrement ; sinon 0.
Notes
Appelez cette fonction membre avant de faire défiler l’enregistrement vers l’enregistrement pour savoir si vous avez disparu avant le premier enregistrement du jeu d’enregistrements. Vous pouvez également utiliser IsBOF avec IsEOF pour déterminer si le jeu d’enregistrements contient des enregistrements ou est vide. Immédiatement après l’appel Open, si le jeu d’enregistrements ne contient aucun enregistrement, IsBOF retourne un nombre différent de zéro. Lorsque vous ouvrez un jeu d’enregistrements qui a au moins un enregistrement, le premier enregistrement est l’enregistrement actif et IsBOF retourne 0.
Si le premier enregistrement est l’enregistrement actif et que vous appelez MovePrev, IsBOF retourne un résultat différent de zéro. Si IsBOF elle retourne un nombre différent de zéro et que vous appelez MovePrev, une erreur se produit. Si IsBOF cette propriété renvoie une valeur différente de zéro, l’enregistrement actif n’est pas défini et toute action nécessitant un enregistrement actif entraîne une erreur.
Exemple
Cet exemple utilise IsBOF et IsEOF détecte les limites d’un jeu d’enregistrements lorsque le code fait défiler le jeu d’enregistrements dans les deux sens.
// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if(rsCustSet.IsBOF())
return;
// The recordset is empty
// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
rsCustSet.MoveNext();
// Move to the last record
rsCustSet.MoveLast();
// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
rsCustSet.MovePrev();
// First record is current again
rsCustSet.MoveFirst();
CRecordset::IsDeleted
Détermine si l’enregistrement actif a été supprimé.
BOOL IsDeleted() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements est positionné sur un enregistrement supprimé ; sinon 0.
Notes
Si vous faites défiler jusqu’à un enregistrement et IsDeleted retourne TRUE (différent de zéro), vous devez faire défiler vers un autre enregistrement avant de pouvoir effectuer d’autres opérations d’ensemble d’enregistrements.
Le résultat dépend de IsDeleted nombreux facteurs, tels que le type de jeu d’enregistrements, si votre jeu d’enregistrements est mis à jour, si vous avez spécifié l’option CRecordset::skipDeletedRecords lorsque vous avez ouvert le jeu d’enregistrements, si vos packs de pilotes ont supprimé des enregistrements et s’il existe plusieurs utilisateurs.
Pour plus d’informations sur l’empaquetage CRecordset::skipDeletedRecords des pilotes, consultez la fonction De membre Open .
Remarque
Si vous avez implémenté la récupération de lignes en bloc, vous ne devez pas appeler IsDeleted. Au lieu de cela, appelez la fonction membre GetRowStatus . Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::IsEOF
Retourne une valeur différente de zéro si le jeu d’enregistrements a été positionné après le dernier enregistrement. Il n’y a pas d’enregistrement actif.
BOOL IsEOF() const;
Valeur retournée
Différent de zéro si le jeu d’enregistrements ne contient aucun enregistrement ou si vous avez fait défiler au-delà du dernier enregistrement ; sinon 0.
Notes
Appelez cette fonction membre lorsque vous faites défiler l’enregistrement vers l’enregistrement pour savoir si vous avez dépassé le dernier enregistrement du jeu d’enregistrements. Vous pouvez également utiliser IsEOF pour déterminer si le jeu d’enregistrements contient des enregistrements ou est vide. Immédiatement après l’appel Open, si le jeu d’enregistrements ne contient aucun enregistrement, IsEOF retourne un nombre différent de zéro. Lorsque vous ouvrez un jeu d’enregistrements qui a au moins un enregistrement, le premier enregistrement est l’enregistrement actif et IsEOF retourne 0.
Si le dernier enregistrement est l’enregistrement actif lorsque vous appelez MoveNext, IsEOF retourne un résultat différent de zéro. Si IsEOF elle retourne un nombre différent de zéro et que vous appelez MoveNext, une erreur se produit. Si IsEOF cette propriété renvoie une valeur différente de zéro, l’enregistrement actif n’est pas défini et toute action nécessitant un enregistrement actif entraîne une erreur.
Exemple
Consultez l’exemple pour IsBOF.
CRecordset::IsFieldDirty
Détermine si le membre de données de champ spécifié a été modifié depuis Edit ou AddNew a été appelé.
BOOL IsFieldDirty(void* pv);
Paramètres
pv
Pointeur vers le membre de données de champ dont vous souhaitez vérifier l’état, ou NULL pour déterminer si l’un des champs est incorrect.
Valeur retournée
Différent de zéro si le membre de données de champ spécifié a changé depuis l’appel AddNew ou Edit; sinon 0.
Notes
Les données de tous les membres de données de champ sale sont transférées vers l’enregistrement sur la source de données lorsque l’enregistrement actif est mis à jour par un appel à la Update fonction membre de CRecordset (après un appel à ou Edit).AddNew
Remarque
Cette fonction membre n’est pas applicable sur les jeux d’enregistrements qui utilisent l’extraction de lignes en bloc. Si vous avez implémenté la récupération de lignes en bloc, retourne IsFieldDirty toujours FALSE et entraîne une assertion ayant échoué. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
L’appel IsFieldDirty réinitialise les effets des appels précédents à SetFieldDirty , car l’état incorrect du champ est réévalué. Dans le AddNew cas, si la valeur de champ actuelle diffère de la valeur pseudo null, l’état du champ est incorrect. Dans le Edit cas, si la valeur du champ diffère de la valeur mise en cache, l’état du champ est incorrect.
IsFieldDirty est implémenté par le biais DoFieldExchangede .
Pour plus d’informations sur l’indicateur sale, consultez Recordset : How Recordsets Select Recordsets Select Records (ODBC).
CRecordset::IsFieldNull
Retourne une valeur différente de zéro si le champ spécifié dans l’enregistrement actif est Null (n’a aucune valeur).
BOOL IsFieldNull(void* pv);
Paramètres
pv
Pointeur vers le membre de données de champ dont vous souhaitez vérifier l’état, ou NULL pour déterminer si l’un des champs est Null.
Valeur retournée
Différent de zéro si le membre de données de champ spécifié est marqué comme Null ; sinon 0.
Notes
Appelez cette fonction membre pour déterminer si le membre de données de champ spécifié d’un recordset a été marqué comme Null. (Dans la terminologie de la base de données, Null signifie « sans valeur » et n’est pas identique NULL à C++.) Si un membre de données de champ est marqué comme Null, il est interprété comme une colonne de l’enregistrement actif pour laquelle il n’existe aucune valeur.
Remarque
Cette fonction membre n’est pas applicable sur les jeux d’enregistrements qui utilisent l’extraction de lignes en bloc. Si vous avez implémenté l’extraction de lignes en bloc, elle IsFieldNull retourne FALSE toujours et entraîne une assertion ayant échoué. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
IsFieldNull est implémenté par le biais DoFieldExchangede .
CRecordset::IsFieldNullable
Retourne une valeur différente de zéro si le champ spécifié dans l’enregistrement actif peut être défini sur Null (sans valeur).
BOOL IsFieldNullable(void* pv);
Paramètres
pv
Pointeur vers le membre de données de champ dont vous souhaitez vérifier l’état, ou NULL pour déterminer si l’un des champs peut être défini sur une valeur Null.
Notes
Appelez cette fonction membre pour déterminer si le membre de données de champ spécifié est « nullable » (peut être défini sur une valeur Null ; C++ NULL n’est pas identique à Null, ce qui, dans la terminologie de la base de données, signifie « sans valeur »).
Remarque
Si vous avez implémenté la récupération de lignes en bloc, vous ne pouvez pas appeler IsFieldNullable. Au lieu de cela, appelez la GetODBCFieldInfo fonction membre pour déterminer si un champ peut être défini sur une valeur Null. Vous pouvez toujours appeler GetODBCFieldInfo, que vous ayez implémenté la récupération de lignes en bloc. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Un champ qui ne peut pas être Null doit avoir une valeur. Si vous tentez de définir un tel champ sur Null lors de l’ajout ou de la mise à jour d’un enregistrement, la source de données rejette l’ajout ou la mise à jour et Update lève une exception. L’exception se produit lorsque vous appelez Update, et non lorsque vous appelez SetFieldNull.
L’utilisation NULL pour le premier argument de la fonction applique la fonction uniquement aux champs, et non outputColumn aux param champs. Par exemple, l’appel
SetFieldNull(NULL);
définit uniquement outputColumn les champs NULLsur ; param les champs ne sont pas affectés.
Pour travailler sur param des champs, vous devez fournir l’adresse réelle de la personne param sur laquelle vous souhaitez travailler, par exemple :
SetFieldNull(&m_strParam);
Cela signifie que vous ne pouvez pas définir tous les param champs NULLsur , comme vous le pouvez avec outputColumn les champs.
IsFieldNullable est implémenté via DoFieldExchange.
CRecordset::IsOpen
Détermine si le jeu d’enregistrements est déjà ouvert.
BOOL IsOpen() const;
Valeur retournée
Différent de zéro si la fonction membre ou Open l’objet Requery recordset a été appelée précédemment et que le jeu d’enregistrements n’a pas été fermé ; sinon, 0.
CRecordset::m_hstmt
Contient un handle pour la structure de données d’instruction ODBC, de type HSTMT, associée au jeu d’enregistrements.
Notes
Chaque requête vers une source de données ODBC est associée à un HSTMT.
Attention
N’utilisez m_hstmt pas avant Open d’être appelée.
Normalement, vous n’avez pas besoin d’accéder directement HSTMT , mais vous en aurez peut-être besoin pour l’exécution directe d’instructions SQL. La ExecuteSQL fonction membre de classe CDatabase fournit un exemple d’utilisation m_hstmt.
CRecordset::m_nFields
Contient le nombre de membres de données de champ dans la classe recordset ; autrement dit, le nombre de colonnes sélectionnées par le jeu d’enregistrements de la source de données.
Notes
Le constructeur de la classe recordset doit initialiser m_nFields avec le nombre correct. Si vous n’avez pas implémenté la récupération de lignes en bloc, ClassWizard écrit cette initialisation lorsque vous l’utilisez pour déclarer votre classe recordset. Vous pouvez également l’écrire manuellement.
L’infrastructure utilise ce nombre pour gérer l’interaction entre les membres de données de champ et les colonnes correspondantes de l’enregistrement actif sur la source de données.
Attention
Ce nombre doit correspondre au nombre de « colonnes de sortie » inscrites ou DoFieldExchangeDoBulkFieldExchange après un appel au SetFieldType paramètre CFieldExchange::outputColumn.
Vous pouvez lier dynamiquement des colonnes, comme expliqué dans l’article « Recordset : Liaison dynamique des colonnes de données ». Si vous le faites, vous devez augmenter le nombre m_nFields pour refléter le nombre d’appels de fonction RFX ou RFX en bloc dans votre DoFieldExchangeDoBulkFieldExchange ou fonction membre pour les colonnes liées dynamiquement.
Pour plus d’informations, consultez les articles Recordset : Liaison dynamique de colonnes de données (ODBC) et recordset : extraction d’enregistrements en bloc (ODBC).
Exemple
voir Record Field Exchange : Utilisation de RFX.
CRecordset::m_nParams
Contient le nombre de membres de données de paramètre dans la classe recordset ; autrement dit, le nombre de paramètres passés avec la requête du jeu d’enregistrements.
Notes
Si votre classe recordset a des membres de données de paramètre, le constructeur de la classe doit initialiser m_nParams avec le nombre correct.
m_nParams Valeur par défaut 0. Si vous ajoutez des membres de données de paramètre (que vous devez faire manuellement), vous devez également ajouter manuellement une initialisation dans le constructeur de classe pour refléter le nombre de paramètres (qui doivent être au moins aussi volumineux que le nombre d’espaces réservés « » dans votre m_strFilter ou m_strSort chaîne).
L’infrastructure utilise ce nombre lorsqu’il paramétre la requête du jeu d’enregistrements.
Attention
Ce nombre doit correspondre au nombre de « params » inscrits dans DoFieldExchange ou DoBulkFieldExchange après un appel à avec SetFieldType une valeur de paramètre de CFieldExchange::inputParam, CFieldExchange::param, CFieldExchange::outputParamou CFieldExchange::inoutParam.
Exemple
Consultez les articles Recordset : Parameterizing a Recordset (ODBC) and Record Field Exchange : Using RFX.
CRecordset::m_pDatabase
Contient un pointeur vers l’objet CDatabase via lequel le jeu d’enregistrements est connecté à une source de données.
Notes
Cette variable est définie de deux façons. En règle générale, vous passez un pointeur vers un objet déjà connecté CDatabase lorsque vous construisez l’objet recordset. Si vous passez NULL à la place, CRecordset crée un CDatabase objet pour vous et le connecte. Dans les deux cas, CRecordset stocke le pointeur dans cette variable.
Normalement, vous n’aurez pas besoin directement d’utiliser le pointeur stocké dans m_pDatabase. Toutefois, si vous écrivez vos propres extensions CRecordset, vous devrez peut-être utiliser le pointeur. Par exemple, vous aurez peut-être besoin du pointeur si vous lèvez vos propres CDBExceptions. Vous devrez peut-être le faire si vous avez besoin d’effectuer quelque chose à l’aide du même CDatabase objet, comme l’exécution de transactions, la définition de délais d’expiration ou l’appel de la ExecuteSQL fonction membre de classe CDatabase pour exécuter des instructions SQL directement.
CRecordset::m_strFilter
Après avoir construit l’objet recordset, mais avant d’appeler sa Open fonction membre, utilisez ce membre de données pour stocker une CString clause SQL WHERE contenant.
Notes
Le jeu d’enregistrements utilise cette chaîne pour limiter (ou filtrer) les enregistrements qu’il sélectionne pendant l’appel ou Open l’appelRequery. Cela est utile pour sélectionner un sous-ensemble d’enregistrements, tel que « tous les vendeurs basés en Californie » (« state = CA »). La syntaxe ODBC SQL pour une WHERE clause est
WHERE search-condition
N’incluez pas le WHERE mot clé dans votre chaîne. Le framework le fournit.
Vous pouvez également paramétrer votre chaîne de filtre en plaçant des espaces réservés « » dans celui-ci, en déclarant un membre de données de paramètre dans votre classe pour chaque espace réservé et en passant des paramètres au jeu d’enregistrements au moment de l’exécution. Cela vous permet de construire le filtre au moment de l’exécution. Pour plus d’informations, consultez Recordset : Paramétrage d’un recordset (ODBC).
Pour plus d’informations sur les clauses SQL WHERE , consultez SQL. Pour plus d’informations sur la sélection et le filtrage des enregistrements, consultez Recordset : Filtrage des enregistrements (ODBC)
Exemple
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::m_strSort
Après avoir construit l’objet recordset, mais avant d’appeler sa Open fonction membre, utilisez ce membre de données pour stocker une CString clause SQL ORDER BY contenant.
Notes
Le jeu d’enregistrements utilise cette chaîne pour trier les enregistrements qu’il sélectionne pendant l’appel ou Open l’appelRequery. Vous pouvez utiliser cette fonctionnalité pour trier un jeu d’enregistrements sur une ou plusieurs colonnes. La syntaxe ODBC SQL pour une ORDER BY clause est
ORDER BY sort-specification [, sort-specification]...
où une spécification de tri est un entier ou un nom de colonne. Vous pouvez également spécifier l’ordre croissant ou décroissant (l’ordre est croissant par défaut) en ajoutant « ASC » ou « DESC » à la liste de colonnes dans la chaîne de tri. Les enregistrements sélectionnés sont triés en premier par la première colonne répertoriée, puis par la seconde, et ainsi de suite. Par exemple, vous pouvez commander un recordset « Customers » par nom, puis prénom. Le nombre de colonnes que vous pouvez répertorier dépend de la source de données. Pour plus d’informations, consultez le Kit de développement logiciel (SDK) Windows.
N’incluez pas le ORDER BY mot clé dans votre chaîne. Le framework le fournit.
Pour plus d’informations sur les clauses SQL, consultez SQL. Pour plus d’informations sur le tri des enregistrements, consultez Recordset : Tri d’enregistrements (ODBC).
Exemple
CCustomer rsCustSet(&m_dbCust);
// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::Move
Déplace le pointeur d’enregistrement actif dans le jeu d’enregistrements, vers l’avant ou vers l’arrière.
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
Paramètres
nRows
Nombre de lignes à déplacer vers l’avant ou vers l’arrière. Les valeurs positives avancent vers la fin du jeu d’enregistrements. Les valeurs négatives se déplacent vers l’arrière, vers le début.
wFetchType
Détermine l’ensemble de lignes à Move extraire. Pour plus d'informations, consultez Notes.
Notes
Si vous passez une valeur de 0 pour nRows, Move actualise l’enregistrement actif ; Move met fin à tout mode ou AddNew actuel Edit et restaure la valeur de l’enregistrement actif avant AddNew ou Edit a été appelée.
Remarque
Lorsque vous parcourez un jeu d’enregistrements, vous ne pouvez pas ignorer les enregistrements supprimés. Consultez la rubrique CRecordset::IsDeleted (éventuellement en anglais) pour plus d’informations. Lorsque vous ouvrez un jeu d’options CRecordset avec l’option skipDeletedRecords définie, Move affirme si le nRows paramètre est 0. Ce comportement empêche l’actualisation des lignes supprimées par d’autres applications clientes à l’aide des mêmes données. Consultez le dwOption paramètre dans Open pour obtenir une description de skipDeletedRecords.
Move repositionne le jeu d’enregistrements par ensembles de lignes. En fonction des valeurs pour nRows et wFetchType, Move extrait l’ensemble de lignes approprié, puis effectue le premier enregistrement dans cet ensemble de lignes l’enregistrement actif. Si vous n’avez pas implémenté la récupération de lignes en bloc, la taille de l’ensemble de lignes est toujours 1. Lors de l’extraction d’un ensemble de lignes, Move appelle directement la CheckRowsetError fonction membre pour gérer les erreurs résultant de la récupération.
Selon les valeurs que vous transmettez, Move équivaut à d’autres CRecordset fonctions membres. En particulier, la valeur de wFetchType peut indiquer une fonction membre plus intuitive et souvent la méthode préférée pour déplacer l’enregistrement actif.
Le tableau suivant répertorie les valeurs possibles pour wFetchType, l’ensemble de lignes qui Move va extraire en wFetchType fonction et nRows, et toute fonction membre équivalente correspondant à wFetchType.
| wFetchType | Ensemble de lignes extrait | Fonction membre équivalente |
|---|---|---|
SQL_FETCH_RELATIVE (valeur par défaut) |
Ensemble de lignes commençant nRows la ou les lignes de la première ligne de l’ensemble de lignes actuel. |
|
SQL_FETCH_NEXT |
Ensemble de lignes suivant ; nRows est ignoré. |
MoveNext |
SQL_FETCH_PRIOR |
Ensemble de lignes précédent ; nRows est ignoré. |
MovePrev |
SQL_FETCH_FIRST |
Premier ensemble de lignes dans le jeu d’enregistrements ; nRows est ignoré. |
MoveFirst |
SQL_FETCH_LAST |
Dernier ensemble de lignes complet dans le jeu d’enregistrements ; nRows est ignoré. |
MoveLast |
SQL_FETCH_ABSOLUTE |
Si nRows> 0, le ou les lignes de départ nRows de l’ensemble de lignes à partir du début du jeu d’enregistrements. Si nRows< 0, le ou les lignes de départ nRows de l’ensemble de lignes à partir de la fin du jeu d’enregistrements. Si nRows = 0, une condition de début de fichier (BOF) est retournée. |
SetAbsolutePosition |
SQL_FETCH_BOOKMARK |
Ensemble de lignes commençant à la ligne dont la valeur de signet correspond à nRows. |
SetBookmark |
Remarque
Pour les jeux d’enregistrements en avant uniquement, Move n’est valide qu’avec une valeur de SQL_FETCH_NEXTwFetchType.
Attention
L’appel Move lève une exception si le jeu d’enregistrements n’a pas d’enregistrements. Pour déterminer si le jeu d’enregistrements a des enregistrements, appelez IsBOF et IsEOF.
Remarque
Si vous avez fait défiler le jeu d’enregistrements au-delà du début ou de la fin du jeu d’enregistrements (IsBOF ou IsEOF retourne un nombre différent de zéro), l’appel d’une Move fonction lève peut-être un CDBException. Par exemple, si IsEOF elle retourne un non-zéro et IsBOF ne lève pas d’exception, MoveNext mais MovePrev ne lève pas.
Remarque
Si vous appelez Move pendant la mise à jour ou l’ajout de l’enregistrement actif, les mises à jour sont perdues sans avertissement.
Pour plus d’informations sur la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Scrolling (ODBC) et Recordset : Bookmarks and Absolute Positions (ODBC). Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC). Pour plus d’informations, consultez la fonction SQLExtendedFetch API ODBC dans le Kit de développement logiciel (SDK) Windows.
Exemple
// rs is a CRecordset or a CRecordset-derived object
// Change the rowset size to 5
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// Move to the first record in the recordset
rs.MoveFirst();
// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);
rs.MoveFirst();
rs.MoveNext();
CRecordset::MoveFirst
Fait du premier enregistrement du premier ensemble de lignes l’enregistrement actif.
void MoveFirst();
Notes
Que l’extraction de lignes en bloc ait été implémentée, il s’agit toujours du premier enregistrement dans le jeu d’enregistrements.
Vous n’avez pas besoin d’appeler MoveFirst immédiatement après avoir ouvert le jeu d’enregistrements. À ce stade, le premier enregistrement (le cas échéant) est automatiquement l’enregistrement actif.
Remarque
Cette fonction membre n’est pas valide pour les jeux d’enregistrements en avant uniquement.
Remarque
Lorsque vous parcourez un jeu d’enregistrements, vous ne pouvez pas ignorer les enregistrements supprimés. Pour plus d’informations, consultez la IsDeleted fonction membre.
Attention
L’appel d’une des Move fonctions lève une exception si le jeu d’enregistrements n’a pas d’enregistrements. Pour déterminer si le jeu d’enregistrements a des enregistrements, appelez IsBOF et IsEOF.
Remarque
Si vous appelez l’une des Move fonctions pendant que l’enregistrement actif est mis à jour ou ajouté, les mises à jour sont perdues sans avertissement.
Pour plus d’informations sur la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Scrolling (ODBC) et Recordset : Bookmarks and Absolute Positions (ODBC). Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Exemple
Consultez l’exemple pour IsBOF.
CRecordset::MoveLast
Fait du premier enregistrement du dernier ensemble de lignes complet l’enregistrement actif.
void MoveLast();
Notes
Si vous n’avez pas implémenté la récupération de lignes en bloc, votre jeu d’enregistrements a une taille d’ensemble de lignes de 1, donc MoveLast passe au dernier enregistrement dans le jeu d’enregistrements.
Remarque
Cette fonction membre n’est pas valide pour les jeux d’enregistrements en avant uniquement.
Remarque
Lorsque vous parcourez un jeu d’enregistrements, vous ne pouvez pas ignorer les enregistrements supprimés. Pour plus d’informations, consultez la IsDeleted fonction membre.
Attention
L’appel d’une des Move fonctions lève une exception si le jeu d’enregistrements n’a pas d’enregistrements. Pour déterminer si le jeu d’enregistrements a des enregistrements, appelez IsBOF et IsEOF.
Remarque
Si vous appelez l’une des Move fonctions pendant que l’enregistrement actif est mis à jour ou ajouté, les mises à jour sont perdues sans avertissement.
Pour plus d’informations sur la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Scrolling (ODBC) et Recordset : Bookmarks and Absolute Positions (ODBC). Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Exemple
Consultez l’exemple pour IsBOF.
CRecordset::MoveNext
Rend le premier enregistrement dans l’ensemble de lignes suivant l’enregistrement actif.
void MoveNext();
Notes
Si vous n’avez pas implémenté la récupération de lignes en bloc, votre jeu d’enregistrements a une taille d’ensemble de lignes de 1, donc MoveNext passe à l’enregistrement suivant.
Remarque
Lorsque vous parcourez un jeu d’enregistrements, vous ne pouvez pas ignorer les enregistrements supprimés. Pour plus d’informations, consultez la IsDeleted fonction membre.
Attention
L’appel d’une des Move fonctions lève une exception si le jeu d’enregistrements n’a pas d’enregistrements. Pour déterminer si le jeu d’enregistrements a des enregistrements, appelez IsBOF et IsEOF.
Remarque
Il est également recommandé d’appeler avant d’appeler IsEOFMoveNext. Par exemple, si vous avez fait défiler l’objet d’un défilement au-delà de la fin du jeu d’enregistrements, IsEOF retourne un non-zéro ; un appel suivant lève MoveNext une exception.
Remarque
Si vous appelez l’une des Move fonctions pendant que l’enregistrement actif est mis à jour ou ajouté, les mises à jour sont perdues sans avertissement.
Pour plus d’informations sur la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Scrolling (ODBC) et Recordset : Bookmarks and Absolute Positions (ODBC). Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Exemple
Consultez l’exemple pour IsBOF.
CRecordset::MovePrev
Fait du premier enregistrement de l’ensemble de lignes précédent l’enregistrement actif.
void MovePrev();
Notes
Si vous n’avez pas implémenté la récupération de lignes en bloc, votre jeu d’enregistrements a une taille d’ensemble de lignes de 1, donc MovePrev passe à l’enregistrement précédent.
Remarque
Cette fonction membre n’est pas valide pour les jeux d’enregistrements en avant uniquement.
Remarque
Lorsque vous parcourez un jeu d’enregistrements, vous ne pouvez pas ignorer les enregistrements supprimés. Pour plus d’informations, consultez la IsDeleted fonction membre.
Attention
L’appel d’une des Move fonctions lève une exception si le jeu d’enregistrements n’a pas d’enregistrements. Pour déterminer si le jeu d’enregistrements a des enregistrements, appelez IsBOF et IsEOF.
Remarque
Il est également recommandé d’appeler avant d’appeler IsBOFMovePrev. Par exemple, si vous avez fait défiler le jeu d’enregistrements avant le début du jeu d’enregistrements, IsBOF retourne un non-zéro ; un appel ultérieur pour MovePrev lever une exception.
Remarque
Si vous appelez l’une des Move fonctions pendant que l’enregistrement actif est mis à jour ou ajouté, les mises à jour sont perdues sans avertissement.
Pour plus d’informations sur la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Scrolling (ODBC) et Recordset : Bookmarks and Absolute Positions (ODBC). Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Exemple
Consultez l’exemple pour IsBOF.
CRecordset::OnSetOptions
Appelé pour définir des options (utilisées sur la sélection) pour l’instruction ODBC spécifiée.
virtual void OnSetOptions(HSTMT hstmt);
Paramètres
hstmt
Instruction HSTMT ODBC dont les options doivent être définies.
Notes
Appelez OnSetOptions les options de définition (utilisées lors de la sélection) pour l’instruction ODBC spécifiée. L’infrastructure appelle cette fonction membre pour définir les options initiales du jeu d’enregistrements.
OnSetOptions détermine la prise en charge de la source de données pour les curseurs défilants et pour la concurrence des curseurs et définit les options du jeu d’enregistrements en conséquence. (Alors qu’elle OnSetOptions est utilisée pour les opérations de sélection, OnSetUpdateOptions est utilisée pour les opérations de mise à jour.)
Remplacez le paramètre OnSetOptions pour définir des options spécifiques au pilote ou à la source de données. Par exemple, si votre source de données prend en charge l’ouverture d’un accès exclusif, vous pouvez remplacer OnSetOptions pour tirer parti de cette capacité.
Pour plus d’informations sur les curseurs, consultez ODBC.
CRecordset::OnSetUpdateOptions
Appelé pour définir les options (utilisées lors de la mise à jour) pour l’instruction ODBC spécifiée.
virtual void OnSetUpdateOptions(HSTMT hstmt);
Paramètres
hstmt
Instruction HSTMT ODBC dont les options doivent être définies.
Notes
Appelez OnSetUpdateOptions les options de définition (utilisées lors de la mise à jour) pour l’instruction ODBC spécifiée. L’infrastructure appelle cette fonction membre après avoir créé un HSTMT enregistrement pour mettre à jour les enregistrements dans un jeu d’enregistrements. (Alors qu’elle OnSetOptions est utilisée pour les opérations de sélection, OnSetUpdateOptions est utilisée pour les opérations de mise à jour.) OnSetUpdateOptions détermine la prise en charge de la source de données pour les curseurs défilants et pour la concurrence des curseurs et définit les options du jeu d’enregistrements en conséquence.
Remplacez OnSetUpdateOptions les options d’une instruction ODBC avant que cette instruction ne soit utilisée pour accéder à une base de données.
Pour plus d’informations sur les curseurs, consultez ODBC.
CRecordset::Open
Ouvre le jeu d’enregistrements en récupérant la table ou en effectuant la requête que représente le jeu d’enregistrements.
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_TYPEou utilisez l’une des valeurs suivantes à partir de :enum OpenType
CRecordset::dynasetJeu d’enregistrements avec défilement bidirectionnel. L’ouverture du jeu d’enregistrements détermine l’appartenance et l’ordre des enregistrements, mais les modifications apportées par d’autres utilisateurs aux valeurs de données sont visibles en suivant une opération d’extraction. Les jeux de feuilles de réponse dynamique sont également appelés jeux d’enregistrements pilotés par des jeux de clés.CRecordset::snapshotJeu d’enregistrements statique avec défilement bidirectionnel. L’ouverture du jeu d’enregistrements détermine l’appartenance et l’ordre des enregistrements. L’extraction d’un enregistrement détermine les valeurs de données. Les modifications apportées par d’autres utilisateurs ne sont pas visibles tant que le jeu d’enregistrements n’est pas fermé, puis rouvert.CRecordset::dynamicJeu d’enregistrements avec défilement bidirectionnel. Les modifications apportées par d’autres utilisateurs aux valeurs d’appartenance, de classement et de données sont visibles après une opération d’extraction. De nombreux pilotes ODBC ne prennent pas en charge ce type d’ensemble d’enregistrements.CRecordset::forwardOnlyJeu d’enregistrements en lecture seule avec défilement vers l’avant uniquement.Pour
CRecordset, la valeur par défaut estCRecordset::snapshot. Le mécanisme par défaut permet aux Assistants Visual C++ d’interagir avec ODBCCRecordsetet DAOCDaoRecordset, qui ont des valeurs par défaut différentes.
Pour plus d’informations sur ces types d’recordsets, consultez Recordset (ODBC). Pour plus d’informations, consultez « Utilisation des curseurs bloc et défilement » dans le Kit de développement logiciel (SDK) Windows.
Attention
Si le type demandé n’est pas pris en charge, l’infrastructure lève une exception.
lpszSQL
Pointeur de chaîne contenant l’un des éléments suivants :
Pointeur
NULL.Nom d'une table.
Instruction SQL
SELECT(éventuellement avec un sqlWHEREouORDER BYune clause).Instruction
CALLspécifiant le nom d’une requête prédéfinie (procédure stockée). Veillez à ne pas insérer d’espace blanc entre l’accolades et leCALLmot clé.
Pour plus d’informations sur cette chaîne, consultez le tableau et la discussion du rôle de ClassWizard dans la section Remarques .
Remarque
L’ordre des colonnes de votre jeu de résultats doit correspondre à l’ordre des appels de fonction RFX ou RFX en bloc dans votre DoFieldExchange remplacement de fonction.DoBulkFieldExchange
dwOptions
Masque de bits, qui peut spécifier une combinaison des valeurs répertoriées ci-dessous. Certains d’entre eux s’excluent mutuellement. La valeur par défaut est none.
CRecordset::noneAucune option définie. Cette valeur de paramètre s’exclue mutuellement avec toutes les autres valeurs. Par défaut, le jeu d’enregistrements peut être mis à jour avecEditouDeleteautorise l’ajout de nouveaux enregistrements avecAddNew. La mise à jour dépend de la source de données et de l’optionnOpenTypeque vous spécifiez. L’optimisation des 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 jeu d’enregistrements. Les signets ne sont pas disponibles. La vérification automatique des champs sales est implémentée.CRecordset::appendOnlyNe pas autoriserEditouDeletesur le jeu d’enregistrements. AutorisezAddNewuniquement. Cette option s’exclue mutuellement avecCRecordset::readOnly.CRecordset::readOnlyOuvrez le jeu d’enregistrements en lecture seule. Cette option s’exclue mutuellement avecCRecordset::appendOnly.CRecordset::optimizeBulkAddUtilisez une instruction SQL préparée pour optimiser l’ajout de nombreux enregistrements à la fois. S’applique uniquement si vous n’utilisez pas la fonctionSQLSetPosAPI ODBC pour mettre à jour le jeu d’enregistrements. La première mise à jour détermine les champs marqués comme incorrects. Cette option s’exclue mutuellement avecCRecordset::useMultiRowFetch.CRecordset::useMultiRowFetchImplémentez l’extraction de lignes en bloc pour permettre à plusieurs lignes d’être récupérées dans une seule opération d’extraction. Il s’agit d’une fonctionnalité avancée conçue pour améliorer les performances ; toutefois, l’échange de champs d’enregistrement en bloc n’est pas pris en charge parClassWizard. Cette option s’exclue mutuellement avecCRecordset::optimizeBulkAdd. Si vous spécifiezCRecordset::useMultiRowFetch, l’option est activée automatiquement (la double mise en mémoire tampon n’est pas disponible) ; sur les jeux d’enregistrements en avant uniquement, l’optionCRecordset::noDirtyFieldCheckCRecordset::useExtendedFetchest activée automatiquement. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).CRecordset::skipDeletedRecordsIgnorez tous les enregistrements supprimés lors de la navigation dans le jeu d’enregistrements. Cela ralentit les performances dans certaines extractions relatives. Cette option n’est pas valide sur les jeux d’enregistrements en avant uniquement. Si vous appelezMoveavec le paramètre nRows défini sur 0 et que l’optionCRecordset::skipDeletedRecordsdéfinie,Moves’affirme.CRecordset::skipDeletedRecordsest similaire à la compression du pilote, ce qui signifie que les lignes supprimées sont supprimées du jeu d’enregistrements. Toutefois, si vos enregistrements packs de pilotes, il ignore uniquement les enregistrements que vous supprimez ; il n’ignore pas les enregistrements supprimés par d’autres utilisateurs pendant que le jeu d’enregistrements est ouvert.CRecordset::skipDeletedRecordsignore les lignes supprimées par d’autres utilisateurs.CRecordset::useBookmarksPeut utiliser des signets sur le jeu d’enregistrements, si pris en charge. Les signets ralentissent la récupération des données, mais améliorent les performances pour la navigation des données. Non valide sur les jeux d’enregistrements en transfert uniquement. Pour plus d’informations, consultez Recordset : Signets et positions absolues (ODBC).CRecordset::noDirtyFieldCheckDésactivez la vérification automatique des champs sales (double mise en mémoire tampon). Cela permettra d’améliorer les performances ; Toutefois, vous devez marquer manuellement les champs comme étant incorrects en appelant les fonctions membres etSetFieldDirtylesSetFieldNullfonctions membres. La double mise en mémoire tampon dans la classeCRecordsetest similaire à la double mise en mémoire tampon dans la classeCDaoRecordset. Toutefois, dansCRecordset, vous ne pouvez pas activer la mise en mémoire tampon double sur des champs individuels ; vous l’activez pour tous les champs ou désactivez-le pour tous les champs. Si vous spécifiez l’optionCRecordset::useMultiRowFetch, elleCRecordset::noDirtyFieldCheckest activée automatiquement . Toutefois,SetFieldDirtyelleSetFieldNullne peut pas être utilisée sur les jeux d’enregistrements qui implémentent l’extraction de lignes en bloc.CRecordset::executeDirectN’utilisez pas d’instruction SQL préparée. Pour améliorer les performances, spécifiez cette option si laRequeryfonction membre ne sera jamais appelée.CRecordset::useExtendedFetchImplémenterSQLExtendedFetchau lieu deSQLFetch. Cela est conçu pour implémenter l’extraction de lignes en bloc sur les jeux d’enregistrements en avant uniquement. Si vous spécifiez l’optionCRecordset::useMultiRowFetchsur un jeu d’enregistrements en avant uniquement, elleCRecordset::useExtendedFetchest activée automatiquement.CRecordset::userAllocMultiRowBuffersL’utilisateur alloue des mémoires tampons de stockage pour les données. Utilisez cette optionCRecordset::useMultiRowFetchsi vous souhaitez allouer votre propre stockage. Sinon, l’infrastructure alloue automatiquement le stockage nécessaire. Pour plus d’informations, consultez Recordset : Extraction d’enregistrements en bloc (ODBC). La spécificationCRecordset::userAllocMultiRowBufferssans spécification deCRecordset::useMultiRowFetchrésultats dans une assertion ayant échoué.
Valeur retournée
Différent de zéro si l’objet CRecordset a été correctement ouvert ; sinon, 0 si (si CDatabase::Open appelé) retourne 0.
Notes
Vous devez appeler cette fonction membre pour exécuter la requête définie par le jeu d’enregistrements. Avant d’appeler Open, vous devez construire l’objet recordset.
La connexion de ce jeu d’enregistrements à la source de données dépend de la façon dont vous construisez le jeu d’enregistrements avant d’appeler Open. Si vous transmettez un CDatabase objet au constructeur recordset qui n’a pas été connecté à la source de données, cette fonction membre utilise GetDefaultConnect pour tenter d’ouvrir l’objet de base de données. Si vous passez NULL au constructeur recordset, le constructeur construit un CDatabase objet pour vous et Open tente de connecter l’objet de base de données. Pour plus d’informations sur la fermeture du jeu d’enregistrements et de la connexion dans ces circonstances variables, consultez Close.
Remarque
L’accès à une source de données via un CRecordset objet est toujours partagé. Contrairement à la CDaoRecordset classe, vous ne pouvez pas utiliser d’objet CRecordset pour ouvrir une source de données avec un accès exclusif.
Lorsque vous appelez Open, une requête, généralement une instruction SQL SELECT , sélectionne les enregistrements en fonction des critères indiqués dans le tableau suivant.
Valeur du paramètre lpszSQL. |
Les enregistrements sélectionnés sont déterminés par | Exemple |
|---|---|---|
NULL |
Chaîne retournée par GetDefaultSQL. |
|
| Nom de la 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 que la requête est définie pour retourner. | "{call OverDueAccts}" |
SELECTliste-colonnes-liste-table-liste FROM |
Colonnes spécifiées à partir de la ou des tables spécifiées. | "SELECT CustId, CustName FROMCustomer" |
Attention
N’insérez pas d’espace blanc supplémentaire dans votre chaîne SQL. Par exemple, si vous insérez des espaces blancs entre l’accolades et le CALL mot clé, MFC interprète mal la chaîne SQL en tant que nom de table et l’incorpore dans une SELECT instruction, ce qui entraîne la levée d’une exception. De même, si votre requête prédéfinie utilise un paramètre de sortie, n’insérez pas d’espace blanc entre l’accolades et le symbole « ». Enfin, vous ne devez pas insérer d’espace blanc avant l’accolades dans une CALL instruction ou avant le SELECT mot clé d’une SELECT instruction.
La procédure habituelle consiste à passer NULL à Open; dans ce cas, Open appelle GetDefaultSQL. Si vous utilisez une classe dérivée CRecordset , GetDefaultSQL donne le ou les noms de table que vous avez spécifiés dans ClassWizard. Vous pouvez à la place spécifier d’autres informations dans le lpszSQL paramètre.
Tout ce que vous passez, Open construit une chaîne SQL finale pour la requête (la chaîne peut avoir SQL WHERE et ORDER BY les clauses ajoutées à la lpszSQL chaîne que vous avez passée), puis exécute la requête. Vous pouvez examiner la chaîne construite en appelant après l’appel GetSQLOpen. Pour plus d’informations sur la façon dont le jeu d’enregistrements construit une instruction SQL et sélectionne des enregistrements, consultez Recordset : How Recordsets Select Records (ODBC).
Les membres de données de champ de votre classe recordset sont liés aux colonnes des données sélectionnées. Si des enregistrements sont retournés, le premier enregistrement devient l’enregistrement actif.
Si vous souhaitez définir des options pour le jeu d’enregistrements, telles qu’un filtre ou un tri, spécifiez-les après avoir construit l’objet recordset, mais avant d’appeler Open. Si vous souhaitez actualiser les enregistrements dans le jeu d’enregistrements une fois que le jeu d’enregistrements est déjà ouvert, appelez Requery.
Pour plus d’informations, notamment d’autres exemples, consultez Recordset (ODBC),Recordset : How Recordsets Select Recordsets (ODBC), and Recordset : Creating and Closing Recordsets (ODBC).
Exemple
Les exemples de code suivants montrent différentes formes d’appel Open .
// 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();
CRecordset::RefreshRowset
Met à jour les données et l’état d’une ligne dans l’ensemble de lignes actuel.
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
Paramètres
wRow
Position unique d’une ligne dans l’ensemble de lignes actuel. Cette valeur peut aller de zéro à la taille de l’ensemble de lignes.
wLockType
Valeur indiquant comment verrouiller la ligne après son actualisation. Pour plus d'informations, consultez Notes.
Notes
Si vous passez une valeur égale à zéro, wRowchaque ligne de l’ensemble de lignes sera actualisée.
Pour utiliser RefreshRowset, vous devez avoir implémenté l’extraction de lignes en bloc en spécifiant l’option CRecordset::useMulitRowFetch dans la Open fonction membre.
RefreshRowset appelle la fonction SQLSetPosAPI ODBC . Le wLockType paramètre spécifie l’état de verrouillage de la ligne après SQLSetPos l’exécution. Le tableau suivant décrit les valeurs possibles pour wLockType.
| wLockType | Descriptif |
|---|---|
SQL_LOCK_NO_CHANGE (valeur par défaut) |
Le pilote ou la source de données garantit que la ligne est dans le même état verrouillé ou déverrouillé qu’avant RefreshRowset d’être appelée. |
SQL_LOCK_EXCLUSIVE |
Le pilote ou la source de données verrouille la ligne exclusivement. Toutes les sources de données ne prennent pas en charge ce type de verrou. |
SQL_LOCK_UNLOCK |
Le pilote ou la source de données déverrouille la ligne. Toutes les sources de données ne prennent pas en charge ce type de verrou. |
Pour plus d’informations sur SQLSetPos, consultez le Kit de développement logiciel (SDK) Windows. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::Requery
Reconstruit (actualise) un jeu d’enregistrements.
virtual BOOL Requery();
Valeur retournée
Différent de zéro si le jeu d’enregistrements a été reconstruit avec succès ; sinon 0.
Notes
Si des enregistrements sont retournés, le premier enregistrement devient l’enregistrement actif.
Pour que le jeu d’enregistrements reflète les ajouts et suppressions que vous ou d’autres utilisateurs effectuez à la source de données, vous devez reconstruire le jeu d’enregistrements en appelant Requery. Si le jeu d’enregistrements est un jeu de données dynamique, il reflète automatiquement les mises à jour que vous ou d’autres utilisateurs apportez à ses enregistrements existants (mais pas aux ajouts). Si le jeu d’enregistrements est un instantané, vous devez appeler Requery pour refléter les modifications par d’autres utilisateurs et ajouts et suppressions.
Pour une feuille de réponse dynamique ou un instantané, appelez Requery chaque fois que vous souhaitez reconstruire le jeu d’enregistrements à l’aide d’un nouveau filtre ou d’un tri, ou de nouvelles valeurs de paramètre. Définissez la nouvelle propriété de filtre ou de tri en affectant de nouvelles valeurs à m_strFilter et m_strSort avant d’appeler Requery. Définissez de nouveaux paramètres en affectant de nouvelles valeurs aux membres de données de paramètres avant d’appeler Requery. Si les chaînes de filtre et de tri sont inchangées, vous pouvez réutiliser la requête, ce qui améliore les performances.
Si la tentative de reconstruction du jeu d’enregistrements échoue, le jeu d’enregistrements est fermé. Avant d’appeler Requery, vous pouvez déterminer si le jeu d’enregistrements peut être réappliqué en appelant la CanRestart fonction membre.
CanRestart ne garantit pas que cela Requery réussira.
Attention
Appelez Requery uniquement une fois que vous avez appelé Open.
Exemple
Cet exemple reconstruit un jeu d’enregistrements pour appliquer un ordre de tri différent.
CCustomer rsCustSet(&m_dbCust);
// Open the recordset
rsCustSet.Open();
// Use the recordset ...
// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return; // Unable to requery
if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));
CRecordset::SetAbsolutePosition
Positionne le jeu d’enregistrements sur l’enregistrement correspondant au numéro d’enregistrement spécifié.
void SetAbsolutePosition(long nRows);
Paramètres
nRows
Position ordinale unique pour l’enregistrement actif dans le jeu d’enregistrements.
Notes
SetAbsolutePosition déplace le pointeur d’enregistrement actif en fonction de cette position ordinale.
Remarque
Cette fonction membre n’est pas valide sur les jeux d’enregistrements en transfert uniquement.
Pour les jeux d’enregistrements ODBC, un paramètre de position absolu de 1 fait référence au premier enregistrement du jeu d’enregistrements ; un paramètre de 0 fait référence à la position de début de fichier (BOF).
Vous pouvez également transmettre des valeurs négatives à SetAbsolutePosition. Dans ce cas, la position du jeu d’enregistrements est évaluée à partir de la fin du jeu d’enregistrements. Par exemple, SetAbsolutePosition( -1 ) déplace le pointeur d’enregistrement actif vers le dernier enregistrement du jeu d’enregistrements.
Remarque
La position absolue n’est pas destinée à être utilisée comme numéro d’enregistrement de substitution. Les signets sont toujours le moyen recommandé de conserver et de revenir à une position donnée, car la position d’un enregistrement change lorsque les enregistrements précédents sont supprimés. En outre, vous ne pouvez pas être assuré qu’un enregistrement donné aura la même position absolue si le jeu d’enregistrements est recréé, car l’ordre des enregistrements individuels au sein d’un jeu d’enregistrements n’est pas garanti, sauf s’il est créé avec une instruction SQL à l’aide d’une ORDER BY clause.
Pour plus d’informations sur la navigation et les signets de jeu d’enregistrements, consultez les articles Recordset : Scrolling (ODBC) et Recordset : Bookmarks and Absolute Positions (ODBC).
CRecordset::SetBookmark
Positionne le jeu d’enregistrements sur l’enregistrement contenant le signet spécifié.
void SetBookmark(const CDBVariant& varBookmark);
Paramètres
varBookmark
Référence à un CDBVariant objet contenant la valeur de signet d’un enregistrement spécifique.
Notes
Pour déterminer si les signets sont pris en charge sur le jeu d’enregistrements, appelez CanBookmark. Pour rendre les signets disponibles s’ils sont pris en charge, vous devez définir l’option CRecordset::useBookmarks dans le paramètre de la dwOptionsOpen fonction membre.
Remarque
Si les signets ne sont pas pris en charge ou indisponibles, l’appel SetBookmark entraîne la levée d’une exception. Les signets ne sont pas pris en charge sur les jeux d’enregistrements en avant uniquement.
Pour récupérer d’abord le signet de l’enregistrement actif, appelez GetBookmark, qui enregistre la valeur du signet dans un CDBVariant objet. Plus tard, vous pouvez revenir à cet enregistrement en appelant SetBookmark à l’aide de la valeur de signet enregistrée.
Remarque
Après certaines opérations de jeu d’enregistrements, vous devez vérifier la persistance des signets avant d’appeler SetBookmark. Par exemple, si vous récupérez un signet avec GetBookmark , puis appelez Requery, le signet peut ne plus être valide. Appel CDatabase::GetBookmarkPersistence pour vérifier si vous pouvez appeler SetBookmarken toute sécurité .
Pour plus d’informations sur les signets et la navigation dans le jeu d’enregistrements, consultez les articles Recordset : Signets et positions absolues (ODBC) et Recordset : Défilement (ODBC).
CRecordset::SetFieldDirty
Signale un membre de données de champ du jeu d’enregistrements tel qu’il a été modifié ou inchangé.
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
Paramètres
pv
Contient l’adresse d’un membre de données de champ dans le jeu d’enregistrements ou NULL. Si NULL, tous les membres de données de champ dans le jeu d’enregistrements sont marqués. (C++ NULL n’est pas identique à La valeur Null dans la terminologie de la base de données, ce qui signifie « n’ayant aucune valeur. »)
bDirty
TRUE si le membre de données de champ doit être marqué comme étant « sale » (modifié). Sinon FALSE , si le membre de données de champ doit être marqué comme « propre » (inchangé).
Notes
Le marquage des champs comme inchangés garantit que le champ n’est pas mis à jour et génère moins de trafic SQL.
Remarque
Cette fonction membre n’est pas applicable sur les jeux d’enregistrements qui utilisent l’extraction de lignes en bloc. Si vous avez implémenté la récupération de lignes en bloc, SetFieldDirty une assertion échoue. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Le framework marque les membres de données de champ modifiés pour s’assurer qu’ils seront écrits dans l’enregistrement sur la source de données par le mécanisme d’échange de champs d’enregistrement (RFX). La modification de la valeur d’un champ définit généralement le champ sale automatiquement. Vous devrez donc rarement vous appeler SetFieldDirty , mais vous pouvez parfois vous assurer que les colonnes seront explicitement mises à jour ou insérées indépendamment de la valeur du membre de données de champ.
L’utilisation NULL pour le premier argument de la fonction applique la fonction uniquement aux champs, et non outputColumn aux param champs. Par exemple, l’appel
SetFieldNull(NULL);
définit uniquement outputColumn les champs NULLsur ; param les champs ne sont pas affectés.
Pour travailler sur param des champs, vous devez fournir l’adresse réelle de la personne param sur laquelle vous souhaitez travailler, par exemple :
SetFieldNull(&m_strParam);
Cela signifie que vous ne pouvez pas définir tous les param champs NULLsur , comme vous le pouvez avec outputColumn les champs.
CRecordset::SetFieldNull
Signale un membre de données de champ du jeu d’enregistrements comme Null (en particulier sans valeur) ou comme non Null.
void SetFieldNull(void* pv, BOOL bNull = TRUE);
Paramètres
pv
Contient l’adresse d’un membre de données de champ dans le jeu d’enregistrements ou NULL. Si NULL, tous les membres de données de champ dans le jeu d’enregistrements sont marqués. (C++ NULL n’est pas identique à La valeur Null dans la terminologie de la base de données, ce qui signifie « n’ayant aucune valeur. »)
bNull
Différent de zéro si le membre de données de champ doit être marqué comme n’ayant aucune valeur (Null). Sinon, 0 si le membre de données de champ doit être marqué comme non Null.
Notes
Lorsque vous ajoutez un nouvel enregistrement à un jeu d’enregistrements, tous les membres de données de champ sont initialement définis sur une valeur Null et marqués comme « dirty » (modifié). Lorsque vous récupérez un enregistrement à partir d’une source de données, ses colonnes ont déjà des valeurs ou sont Null.
Remarque
N’appelez pas cette fonction membre sur les jeux d’enregistrements qui utilisent l’extraction de lignes en bloc. Si vous avez implémenté la récupération de lignes en bloc, l’appel SetFieldNull entraîne une assertion ayant échoué. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Si vous souhaitez spécifiquement désigner un champ de l’enregistrement actif comme n’ayant pas de valeur, appelez SetFieldNull avec bNull la valeur définie pour TRUE l’marquer comme Null. Si un champ a été précédemment marqué Null et que vous souhaitez maintenant lui donner une valeur, définissez sa nouvelle valeur. Vous n’avez pas besoin de supprimer l’indicateur Null avec SetFieldNull. Pour déterminer si le champ est autorisé à être Null, appelez IsFieldNullable.
L’utilisation NULL pour le premier argument de la fonction applique la fonction uniquement aux champs, et non outputColumn aux param champs. Par exemple, l’appel
SetFieldNull(NULL);
définit uniquement outputColumn les champs NULLsur ; param les champs ne sont pas affectés.
Pour travailler sur param des champs, vous devez fournir l’adresse réelle de la personne param sur laquelle vous souhaitez travailler, par exemple :
SetFieldNull(&m_strParam);
Cela signifie que vous ne pouvez pas définir tous les param champs NULLsur , comme vous le pouvez avec outputColumn les champs.
Remarque
Lorsque vous définissez des paramètres sur Null, un appel avant SetFieldNull l’ouverture du jeu d’enregistrements entraîne une assertion. Dans ce cas, appelez SetParamNull.
SetFieldNull est implémenté par le biais DoFieldExchangede .
CRecordset::SetLockingMode
Définit le mode de verrouillage sur le verrouillage « optimiste » (la valeur par défaut) ou le verrouillage « pessimiste ». Détermine comment les enregistrements sont verrouillés pour les mises à jour.
void SetLockingMode(UINT nMode);
Paramètres
nMode
Contient l’une des valeurs suivantes à partir des enum LockModeéléments suivants :
optimisticLe verrouillage optimiste verrouille l’enregistrement mis à jour uniquement pendant l’appel àUpdate.pessimisticLe verrouillage pessimiste verrouille l’enregistrement dès qu’ilEditest appelé et le conserve jusqu’à ce que l’appelUpdatese termine ou que vous passez à un nouvel enregistrement.
Notes
Appelez cette fonction membre si vous devez spécifier les deux stratégies de verrouillage d’enregistrement que le jeu d’enregistrements utilise pour les mises à jour. Par défaut, le mode de verrouillage d’un jeu d’enregistrements est optimistic. Vous pouvez le modifier en une stratégie de verrouillage plus prudente pessimistic . Appel SetLockingMode après avoir construit et ouvert l’objet recordset, mais avant d’appeler Edit.
CRecordset::SetParamNull
Signale un paramètre comme Null (en particulier sans valeur) ou comme non Null.
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
Paramètres
nIndex
Index de base zéro du paramètre.
bNull
Si TRUE (valeur par défaut), le paramètre est marqué comme Null. Sinon, le paramètre est marqué comme non Null.
Notes
Contrairement SetFieldNullà , vous pouvez appeler SetParamNull avant d’ouvrir le jeu d’enregistrements.
SetParamNull est généralement utilisé avec des requêtes prédéfinies (procédures stockées).
CRecordset::SetRowsetCursorPosition
Déplace le curseur vers une ligne dans l’ensemble de lignes actuel.
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
Paramètres
wRow
Position unique d’une ligne dans l’ensemble de lignes actuel. Cette valeur peut aller de 1 à la taille de l’ensemble de lignes.
wLockType
Valeur indiquant comment verrouiller la ligne après son actualisation. Pour plus d'informations, consultez Notes.
Notes
Lors de l’implémentation de la récupération de lignes en bloc, les enregistrements sont récupérés par des ensembles de lignes, où le premier enregistrement de l’ensemble de lignes extrait est l’enregistrement actif. Pour créer un autre enregistrement dans l’ensemble de lignes, appelez SetRowsetCursorPosition. Par exemple, vous pouvez combiner SetRowsetCursorPosition avec la GetFieldValue fonction membre pour récupérer dynamiquement les données à partir de n’importe quel enregistrement de votre jeu d’enregistrements.
Pour utiliser SetRowsetCursorPosition, vous devez avoir implémenté l’extraction de lignes en bloc en spécifiant l’option CRecordset::useMultiRowFetch du dwOptions paramètre dans la Open fonction membre.
SetRowsetCursorPosition appelle la fonction SQLSetPosAPI ODBC . Le wLockType paramètre spécifie l’état de verrouillage de la ligne après SQLSetPos l’exécution. Le tableau suivant décrit les valeurs possibles pour wLockType.
wLockType |
Descriptif |
|---|---|
SQL_LOCK_NO_CHANGE (valeur par défaut) |
Le pilote ou la source de données garantit que la ligne est dans le même état verrouillé ou déverrouillé qu’avant SetRowsetCursorPosition d’être appelée. |
SQL_LOCK_EXCLUSIVE |
Le pilote ou la source de données verrouille la ligne exclusivement. Toutes les sources de données ne prennent pas en charge ce type de verrou. |
SQL_LOCK_UNLOCK |
Le pilote ou la source de données déverrouille la ligne. Toutes les sources de données ne prennent pas en charge ce type de verrou. |
Pour plus d’informations sur SQLSetPos, consultez le Kit de développement logiciel (SDK) Windows. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::SetRowsetSize
Spécifie le nombre d’enregistrements que vous souhaitez récupérer lors d’une extraction.
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
Paramètres
dwNewRowsetSize
Nombre de lignes à récupérer lors d’une extraction donnée.
Notes
Cette fonction membre virtuelle spécifie le nombre de lignes que vous souhaitez récupérer lors d’une extraction unique lors de l’utilisation de la récupération de lignes en bloc. Pour implémenter l’extraction de lignes en bloc, vous devez définir l’option CRecordset::useMultiRowFetch dans le paramètre de la dwOptionsOpen fonction membre.
Remarque
L’appel SetRowsetSize sans implémentation de la récupération de lignes en bloc entraîne une assertion ayant échoué.
Appelez avant d’appeler SetRowsetSizeOpen pour définir initialement la taille de l’ensemble de lignes pour le jeu d’enregistrements. La taille d’ensemble de lignes par défaut lors de l’implémentation de la récupération de lignes en bloc est 25.
Remarque
Utilisez la prudence lors de l’appel SetRowsetSize. Si vous allouez manuellement le stockage pour les données (comme spécifié par l’option CRecordset::userAllocMultiRowBuffers du paramètre dwOptions dans Open), vous devez vérifier si vous devez réallouer ces mémoires tampons de stockage après l’appel SetRowsetSize, mais avant d’effectuer une opération de navigation de curseur.
Pour obtenir le paramètre actuel de la taille de l’ensemble de lignes, appelez GetRowsetSize.
Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
CRecordset::Update
Termine une AddNew opération en Edit enregistrant les données nouvelles ou modifiées sur la source de données.
virtual BOOL Update();
Valeur retournée
Différent de zéro si un enregistrement a été correctement mis à jour ; sinon, 0 si aucune colonne n’a changé. Si aucun enregistrement n’a été mis à jour ou si plusieurs enregistrements ont été mis à jour, une exception est levée. Une exception est également levée pour toute autre défaillance sur la source de données.
Notes
Appelez cette fonction membre après un appel à la fonction ou AddNew à la Edit fonction membre. Cet appel est nécessaire pour terminer l’opération ou AddNew l’opérationEdit.
Remarque
Si vous avez implémenté la récupération de lignes en bloc, vous ne pouvez pas appeler Update. Cela entraîne une assertion ayant échoué. Bien que la classe CRecordset ne fournisse pas de mécanisme pour mettre à jour des lignes de données en bloc, vous pouvez écrire vos propres fonctions à l’aide de la fonction SQLSetPosAPI ODBC. Pour plus d’informations sur l’extraction de lignes en bloc, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
Préparez à la fois AddNew une Edit mémoire tampon de modification dans laquelle les données ajoutées ou modifiées sont placées pour l’enregistrement dans la source de données.
Update enregistre les données. Seuls ces champs marqués ou détectés comme modifiés sont mis à jour.
Si la source de données prend en charge les transactions, vous pouvez effectuer l’appel Update (et sa partie correspondante AddNew ou Edit appel) d’une transaction. Pour plus d’informations sur les transactions, consultez Transaction (ODBC).
Attention
Si vous appelez Update sans appeler l’un ou l’autreAddNew, EditUpdate lève un CDBException. Si vous appelez ou AddNew, vous devez appeler EditUpdate avant d’appeler une Move opération ou avant de fermer le jeu d’enregistrements ou la connexion de source de données. Sinon, vos modifications sont perdues sans notification.
Pour plus d’informations sur la gestion des Update échecs, consultez Recordset : How Recordsets Update Records (ODBC).
Exemple
voir Transaction : exécution d’une transaction dans un recordset (ODBC)
Voir aussi
CObject, classe
Graphique hiérarchique
CDatabase, classe
CRecordView, classe