Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
De wizard MFC ODBC Consumer is niet beschikbaar in Visual Studio 2019 en hoger. U kunt nog steeds handmatig een consument maken.
Dit onderwerp is van toepassing op de MFC ODBC-klassen.
In dit onderwerp wordt uitgelegd hoe u een recordsetklasse maakt voor een vooraf gedefinieerde query (ook wel een opgeslagen procedure genoemd, zoals in Microsoft SQL Server).
Opmerking
Dit onderwerp is van toepassing op objecten die zijn afgeleid van CRecordset waaruit bulksgewijs ophalen van rijen niet is geïmplementeerd. Als bulkgewijs rijen ophalen is geïmplementeerd, is het proces heel vergelijkbaar. Zie Recordset: Recordset ophalen in bulk (ODBC) voor meer informatie over de verschillen tussen recordsets die bulksgewijs ophalen van rijen implementeren en records die dat niet doen.
Met sommige databasebeheersystemen (DBMSs) kunt u een vooraf gedefinieerde query maken en deze aanroepen vanuit uw programma's, zoals een functie. De query heeft een naam, kan parameters aannemen en records retourneren. In de procedure in dit onderwerp wordt beschreven hoe u een vooraf gedefinieerde query aanroept die records retourneert (en mogelijk parameters gebruikt).
De databaseklassen bieden geen ondersteuning voor het bijwerken van vooraf gedefinieerde query's. Het verschil tussen een vooraf gedefinieerde momentopnamequery en een vooraf gedefinieerde dynasetquery is niet bijwerkbaar, maar of wijzigingen van andere gebruikers (of andere recordsets in uw programma) zichtbaar zijn in uw recordset.
Aanbeveling
U hebt geen recordset nodig om een vooraf gedefinieerde query aan te roepen die geen records retourneert. Bereid de SQL-instructie voor zoals hieronder wordt beschreven, maar voer deze uit door de CDatabase lidfunctie ExecuteSQL aan te roepen.
U kunt één recordsetklasse maken voor het beheren van het aanroepen van een vooraf gedefinieerde query, maar u moet een deel van het werk zelf doen. De wizards ondersteunen het niet om specifiek voor dit doel een klasse te maken.
Een klasse maken voor het aanroepen van een vooraf gedefinieerde query (opgeslagen procedure)
Gebruik de wizard MFC ODBC Consumer uit Klasse toevoegen om een recordsetklasse te maken voor de tabel die de meeste kolommen bijdraagt die door de query worden geretourneerd. Dit geeft je een voorsprong.
Voeg handmatig veldgegevensleden toe voor kolommen van tabellen die door de query worden geretourneerd, maar die de wizard niet voor u heeft gemaakt.
Als de query bijvoorbeeld drie kolommen retourneert uit twee extra tabellen, voegt u zes veldgegevensleden (van de juiste gegevenstypen) toe aan de klasse.
Voeg handmatig RFX-functieaanroepen toe in de doFieldExchange-lidfunctie van de klasse, een die overeenkomt met het gegevenstype van elk toegevoegde lid van de veldgegevens.
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 );Opmerking
U moet de gegevenstypen en de volgorde kennen van kolommen die in de resultatenset worden geretourneerd. De volgorde van RFX-functie-aanroepen moet
DoFieldExchangeovereenkomen met de volgorde van kolommen in de resultatenset.Voeg handmatig initialisaties toe voor de nieuwe veldgegevensleden in de constructor van de recordsetklasse.
U moet ook de initialisatiewaarde voor het m_nFields gegevenslid verhogen. De wizard schrijft de initialisatie, maar deze omvat alleen de velddataleiden die hij voor u toevoegt. Voorbeeld:
m_nFields += 6;Sommige gegevenstypen mogen hier niet worden geïnitialiseerd, bijvoorbeeld
CLongBinarybytematrices.Als de query parameters gebruikt, voegt u een lid van de parametergegevens toe voor elke parameter, een RFX-functieaanroep voor elke parameter en een initialisatie voor elke parameter.
U moet voor elke toegevoegde parameter verhogen
m_nParams, net alsm_nFieldsvoor toegevoegde velden in stap 4 van deze procedure. Zie Recordset: Een recordset parameteriseren (ODBC) voor meer informatie.Schrijf handmatig een SQL-instructietekenreeks met het volgende formulier:
{CALL proc-name [(? [, ?]...)]}waarbij CALL een ODBC-trefwoord is, proc-name de naam is van de query zoals deze bekend is in de gegevensbron en de items '?', zijn tijdelijke aanduidingen voor de parameterwaarden die u tijdens runtime aan de recordset opgeeft (indien van toepassing). In het volgende voorbeeld wordt een tijdelijke aanduiding voor één parameter voorbereid:
CString mySQL = "{CALL Delinquent_Accts (?)}";Stel in de code waarmee de recordset wordt geopend de waarden van de parametergegevensleden van de recordset in en roep vervolgens de
Openlidfunctie aan, waarbij u de SQL-tekenreeks doorgeeft voor de parameter lpszSQL . Of vervang in plaats daarvan de tekenreeks die wordt geretourneerd door deGetDefaultSQLlidfunctie in uw klasse.
In de volgende voorbeelden ziet u de procedure voor het aanroepen van een vooraf gedefinieerde query met de naam Delinquent_Accts, die één parameter voor een verkoopdistrictnummer gebruikt. Deze query retourneert drie kolommen: Acct_No, L_Name, Phone. Alle kolommen zijn afkomstig uit de tabel Klanten.
De volgende recordset bevat veldgegevensleden voor de kolommen die de query retourneert en een parameter voor het verkoopdistrictnummer dat tijdens runtime is aangevraagd.
class CDelinquents : public CRecordset
{
// Field/Param Data
LONG m_lAcct_No;
CString m_strL_Name;
CString m_strPhone;
LONG m_lDistParam;
// ...
};
Deze klassedeclaratie is zoals de wizard deze schrijft, met uitzondering van het m_lDistParam lid dat handmatig is toegevoegd. Andere leden worden hier niet weergegeven.
In het volgende voorbeeld ziet u de initialisaties voor de gegevensleden in de CDelinquents constructor.
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;
}
Noteer de initialisaties voor m_nFields en m_nParams. De wizard initialiseert m_nFields; u initialiseert m_nParams.
In het volgende voorbeeld ziet u de RFX-functies in 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);
}
Naast het maken van de RFX-aanroepen voor de drie geretourneerde kolommen, beheert deze code de binding van de parameter die u tijdens runtime doorgeeft. De parameter is gekoppeld aan de Dist_No kolom (districtnummer).
In het volgende voorbeeld ziet u hoe u de SQL-tekenreeks instelt en hoe u deze gebruikt om de recordset te openen.
// 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 ...
Met deze code wordt een momentopname gemaakt, wordt deze doorgegeven aan een parameter die eerder is verkregen van de gebruiker en wordt de vooraf gedefinieerde query aangeroepen. Wanneer de query wordt uitgevoerd, worden records geretourneerd voor het opgegeven verkoopdistrict. Elke record bevat kolommen voor het accountnummer, de achternaam van de klant en het telefoonnummer van de klant.
Aanbeveling
U kunt een retourwaarde (uitvoerparameter) afhandelen vanuit een opgeslagen procedure. Zie CFieldExchange::SetFieldType voor meer informatie en een voorbeeld.
Zie ook
Recordset (ODBC)
Recordset: een recordset opnieuw opvragen (ODBC)
Recordset: een klasse declareren voor een tabel (ODBC)
Recordset: Een join uitvoeren (ODBC)