Recordset : déclaration de la classe d'une requête prédéfinie (ODBC)
Cette rubrique s'applique aux classes ODBC MFC.
Cette rubrique explique comment créer une classe de recordset pour une requête prédéfinie (parfois appelée procédure stockée, comme dans Microsoft SQL Server).
[!REMARQUE]
Cette rubrique s'applique aux objets dérivés d' CRecordset dans lequel l'extraction de lignes en bloc n'a pas été implémentée.Si l'extraction de lignes en bloc est implémentée, le processus est très similaire.Pour plus d'informations sur les différences entre les recordsets implémentant l'extraction de lignes en bloc et ceux qui ne le font pas, consultez recordset : Extraction globale d'enregistrements (ODBC).
Certains systèmes de (DBMSs) gestion de base de données vous permettent de créer une requête prédéfinie et de l'appeler depuis un programme comme une fonction.La requête a un nom, peut prendre des paramètres, et peut retourner des enregistrements.La procédure dans cette rubrique décrit comment appeler une requête prédéfinie qui retourne des enregistrements (et accepte des paramètres).
Les classes de base de données ne prennent pas en charge la mise à jour des requêtes prédéfinies.La différence entre une requête prédéfinie instantané et une requête prédéfinie feuille de réponse dynamique n'est pas la possibilité d'être modifiée apportées par d'autres utilisateurs (les modifications effectuées par votre programme) dans le recordset.
Conseil |
---|
Vous n'avez pas besoin d'un recordset pour appeler une requête prédéfinie qui ne retourne pas d'enregistrements.Préparez l'instruction SQL comme décrit ci-dessous, mais exécutez -la en appelant la fonction membre ExecuteSQLd' CDatabase . |
Vous pouvez créer une classe de recordset pour gérer l'appel d'une requête prédéfinie, mais une partie du travail vous-même.Les assistants ne prennent pas en charge la création d'une classe spécifiquement à cet effet.
Pour créer une classe pour appeler une requête prédéfinie (ou la procédure stockée)
Utilisez L'Assistant Consommateur ODBC MFC de Ajouter une classe pour créer une classe de recordset pour la table contenant la plupart des colonnes retournées par la requête.Cela vous donne l'avance.
Ajoutez manuellement les membres de données de type champ pour toutes les colonnes de toutes les tables que la requête retourne mais qui l'Assistant n'a pas créé pour vous.
Par exemple, si la requête retourne trois colonnes chacune des deux tables supplémentaires, ajoutez six membres de données de type champ (les types de données appropriés) à la classe.
Ajoutez manuellement les appels de fonction de RFX dans la fonction membre de DoFieldExchange de la classe, l'un correspondant au type de données de chaque membre de données de type champ ajouté.
Immediately before these RFX calls, call <MSHelp:link keywords="_mfc_CFieldExchange.3a3a.SetFieldType" TABINDEX="0">SetFieldType</MSHelp:link>, as shown here: pFX->SetFieldType( CFieldExchange::outputColumn );
[!REMARQUE]
Vous devez connaître les types de données et l'ordre des colonnes retourné dans le jeu de résultats.L'ordre des appels de fonction RFX dans DoFieldExchange doit correspondre à l'ordre des colonnes du jeu de résultats.
Ajoutez manuellement les initialisations des nouveaux membres de données de type champ dans le constructeur de classe de recordset.
Vous devez aussi incrémenter la valeur d'initialisation du membre de données de m_nFields .L'Assistant écrit l'initialisation, mais il traite uniquement les données membres de champ qu'il ajoute automatiquement.Par exemple :
m_nFields += 6;
Certains types de données ne doivent pas être initialisés ici, par exemple, CLongBinary ou les tableaux d'octets.
Si la requête prend des paramètres, ajoutez un membre de données de type paramètre pour chaque paramètre, un appel de fonctions RFX pour chaque, et une initialisation.
Vous devez incrémenter m_nParams pour chaque paramètre ajouté, comme vous l'avez fait m_nFields pour les champs ajoutés à l'étape 4 de cette procédure.Pour plus d'informations, consultez recordset : Paramétrage d'un recordset (ODBC).
Écrivez manuellement une instruction SQL ayant la forme suivante :
{CALL proc-name [(? [, ?]...)]}
où CALL est un mot clé ODBC, proc-name est le nom de la requête car elle est connue dans la source de données, et « ? » des emplacements réservés pour les valeurs de paramètre que vous fournissez au recordset à l'exécution (le cas échéant).L'exemple suivant réserve un emplacement pour un paramètre :
CString mySQL = "{CALL Delinquent_Accts (?)}";
Dans le code qui ouvre le recordset, définissez les valeurs des membres de données de type paramètre du recordset puis appelez la fonction membre de Ouvrir , en passant votre chaîne SQL au paramètre de lpszSQL .Ou à la place, remplacez la chaîne retournée par la fonction membre d' GetDefaultSQL dans votre classe.
Les exemples suivants illustrent la procédure d'appeler une requête prédéfinie, Delinquent_Acctsnommé, qui prend un paramètre pour un numéro de secteur des ventes.Cette requête retourne trois colonnes : Acct_No, L_Name, Phone.Toutes les colonnes sont de la table Customers.
Le recordset suivant définit les membres de données de type champ des colonnes le retour de la requête et le paramètre correspondant au numéro de secteur des ventes demandé lors de l'exécution.
class CDelinquents : public CRecordset
{
// Field/Param Data
LONG m_lAcct_No;
CString m_strL_Name;
CString m_strPhone;
LONG m_lDistParam;
// ...
};
La déclaration de classe est telle que l'Assistant écrit l', à l'exception de le membre d' m_lDistParam ajouté manuellement.D'autres membres ne sont pas indiqués ici.
L'exemple suivant illustre les initialisations des membres de données du constructeur d' CDelinquents .
CDelinquents::CDelinquents(CDatabase* pdb)
: CRecordset(pdb)
{
// Wizard-generated params:
m_lAcct_No = 0;
m_strL_Name = "";
m_strPhone = "";
m_nFields = 3;
// User-defined params:
m_nParams = 1;
m_lDistParam = 0;
}
Notez les initialisations de m_nFields et m_nParams.l'Assistant initialise m_nFields; vous initialisez m_nParams.
L'exemple suivant illustre les fonctions RFX dans CDelinquents::DoFieldExchange:
void CDelinquents::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Long(pFX, "Acct_No", m_lAcct_No);
RFX_Text(pFX, "L_Name", m_strL_Name);
RFX_Text(pFX, "Phone", m_strPhone);
pFX->SetFieldType(CFieldExchange::param);
RFX_Long(pFX, "Dist_No", m_lDistParam);
}
Outre l'appel des fonctions RFX pour les trois colonnes retournées, ce code gère la liaison du paramètre passé au moment de l'exécution.Le paramètre est indexé à la colonne d' Dist_No (numéro de secteur).
L'exemple suivant montre comment définir la chaîne SQL et l'utiliser pour ouvrir le recordset.
// Construct a CDelinquents recordset object
CDelinquents rsDel( NULL );
CString strSQL = "{CALL Delinquent_Accts (?)}"
// Specify a parameter value (obtained earlier from the user)
rsDel.m_lDistParam = lDistrict;
// Open the recordset and run the query
if( rsDel.Open( CRecordset::snapshot, strSQL ) )
// Use the recordset ...
Le code construit un instantané, lui passe le paramètre fourni préalablement par l'utilisateur, et appelle la requête prédéfinie.Lorsque la requête s'exécute, elle retourne les enregistrements correspondant au numéro de secteur des ventes spécifié.Chaque enregistrement contient des colonnes pour le numéro de compte, le nom du client, et le numéro de téléphone.
Conseil |
---|
Vous pouvez gérer une valeur de retour (paramètre de sortie) d'une procédure stockée.Pour plus d'informations et un exemple, consultez CFieldExchange::SetFieldType. |
Voir aussi
Concepts
Recordset : lancement d'une nouvelle requête sur un recordset (ODBC)