Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet gäller för MFC ODBC-klasserna.
Ibland kanske du vill kunna välja poster vid körning genom att använda information som du har beräknat eller erhållit från slutanvändaren. Med parametrar för postdataset kan du uppnå det målet.
I det här avsnittet förklaras:
När och varför du kanske vill parametrisera en postuppsättning.
Hur man deklarerar parameterdatamedlemmar i din postuppsättningsklass.
Hur man överför parameterinformation till ett postuppsättningsobjekt vid exekvering.
Parameteriserade postuppsättningar
Med en parameteriserad postuppsättning kan du skicka parameterinformation vid exekvering. Detta har två värdefulla effekter:
Det kan leda till bättre körningshastighet.
Med den kan du skapa en fråga vid körning, baserat på information som inte är tillgänglig för dig vid designtillfället, till exempel information som hämtats från användaren eller beräknats vid körning.
När du anropar Open för att köra frågan använder postuppsättningen parameterinformationen för att slutföra SQL SELECT-instruktionen. Du kan parametrisera vilken postuppsättning som helst.
När parametrar ska användas
Vanliga användningsområden för parametrar är:
Överför körningsargument till en fördefinierad fråga.
Om du vill skicka parametrar till en lagrad procedur måste du ange en fullständig anpassad ODBC CALL-instruktion – med parameterplatshållare – när du anropar
Open, och därigenom åsidosätta postuppsättningens standard-SQL-instruktion. Mer information finns i CRecordset::Open i Class Library Reference och SQL: Anpassa din Recordsets SQL-sats (ODBC) och Recordset: Deklarera en klass för en fördefinierad fråga (ODBC).Utför effektivt många frågor med olika parameterinformation.
Varje gång slutanvändaren till exempel söker efter information för en viss elev i databasen för studentregistrering kan du ange elevens namn eller ID som en parameter som hämtats från användaren. När du sedan anropar postuppsättningens
Requerymedlemsfunktion väljer frågan endast den elevens post.Postuppsättningens filtersträng, som lagras i
m_strFilter, kan se ut så här:"StudentID = ?"Anta att du hämtar elev-ID:t i variabeln
strInputID. När du anger en parameter till (tillstrInputIDexempel elev-ID 100) är värdet för variabeln bundet till parameterplatshållaren som representeras av "?" i filtersträngen.Tilldela parametervärdet på följande sätt:
strInputID = "100"; ... m_strParam = strInputID;Du vill inte konfigurera en filtersträng på det här sättet:
m_strFilter = "StudentID = 100"; // 100 is incorrectly quoted // for some driversEn diskussion om hur du använder citattecken korrekt för filtersträngar finns i Recordset: Filtering Records (ODBC).
Parametervärdet skiljer sig varje gång du begär postuppsättningen igen för ett nytt elev-ID.
Tips/Råd
Att använda en parameter är effektivare än bara ett filter. För en parameteriserad postuppsättning måste databasen endast bearbeta en SQL SELECT-instruktion en gång. För en filtrerad postuppsättning utan parametrar måste SELECT-instruktionen bearbetas varje gång du
Requeryhar ett nytt filtervärde.
Mer information om filter finns i Recordset: Filtering Records (ODBC).
Parameterisera din postuppsättningsklass
Anmärkning
Det här avsnittet gäller för objekt som härletts från CRecordset där massradhämtning inte har implementerats. Om du använder massradhämtning är implementering av parametrar en liknande process. Mer information finns i Recordset: Fetching Records in Bulk (ODBC).
Innan du skapar recordset-klassen bör du bestämma vilka parametrar som behövs, vilka deras datatyper är, och hur recordset använder dem.
Parameterisera en postuppsättningsklass
Anmärkning
MFC ODBC-konsumentguiden är inte tillgänglig i Visual Studio 2019 och senare. Du kan fortfarande skapa den här funktionen manuellt.
Kör konsumentguiden för MFC ODBC från Lägg till klass för att skapa klassen.
Ange fältdatamedlemmar för databaspostens kolumner.
När guiden har skrivit klassen till en fil i projektet går du till .h-filen och lägger manuellt till en eller flera parameterdatamedlemmar i klassdeklarationen. Tillägget kan se ut ungefär som i följande exempel, en del av en ögonblicksbildsklass som är utformad för att besvara frågan "Vilka elever är i seniorklassen?"
class CStudentSet : public CRecordset { // Field/Param Data CString m_strFirstName; CString m_strLastName; CString m_strStudentID; CString m_strGradYear; CString m_strGradYrParam; };Lägg till dina parameterdatamedlemmar efter de av guiden genererade fältdatamedlemmarna. Konventionen är att lägga till ordet "Param" i varje användardefinierat parameternamn.
Ändra definitionen av funktionen DoFieldExchange-medlem i .cpp-filen. Lägg till ett RFX-funktionsanrop för varje parameterdatamedlem som du lade till i klassen. Information om hur du skriver dina RFX-funktioner finns i Record Field Exchange: How RFX Works. Föregå RFX-anropen för parametrarna med ett enda anrop till:
pFX->SetFieldType( CFieldExchange::param ); // RFX calls for parameter data membersI konstruktorn för din postuppsättningsklass ökar du antalet parametrar,
m_nParams.Mer information finns i Arkivfältsutbyte: Arbeta med guidekoden.
När du skriver koden som skapar ett postuppsättningsobjekt för den här klassen, placera ett "?" (frågetecken) på varje plats i SQL-instruktionsträngarna där en parameter ska ersättas.
Vid körning fylls platshållarna i "?" i ordning med parametrarna som du skickar. Efter anropet av SetFieldType ersätter den första parameterdatamedlemsuppsättningen det första "?" i SQL-strängen, följande parameterdatamedlem ersätter det nästa "?", och så vidare.
Anmärkning
Parameterordningen är viktig: ordningen på RFX-anrop för parametrar i funktionen DoFieldExchange måste matcha ordningen på parameterplatshållarna i SQL-strängen.
Tips/Råd
Den mest sannolika strängen att arbeta med är strängen som du anger (om någon) för klassens m_strFilter datamedlem, men vissa ODBC-drivrutiner kan tillåta parametrar i andra SQL-satser.
Överföra parametervärden under körning
Du måste ange parametervärden innan du anropar Open (för ett nytt postuppsättningsobjekt) eller Requery (för ett befintligt objekt).
Skicka parametervärden till ett postuppsättningsobjekt vid körning
Konstruera postuppsättningsobjektet.
Förbered en sträng eller strängar, till exempel strängen
m_strFilter, som innehåller SQL-instruktionen eller delar av den. Placera "?"-platshållare där parameterinformationen ska placeras.Tilldela ett körningsparametervärde till varje parameterdatamedlem i objektet.
Anropa medlemsfunktionen
Open(ellerRequeryför en befintlig postuppsättning).
Anta till exempel att du vill ange en filtersträng för postuppsättningen med hjälp av information som hämtas vid körning av programmet. Anta att du har konstruerat en postuppsättning av klassen CStudentSet tidigare – med namnet rsStudents – och vill nu fråga om den för specifik elevinformation.
// Set up a filter string with
// parameter placeholders
rsStudents.m_strFilter = "GradYear <= ?";
// Obtain or calculate parameter values
// to pass--simply assigned here
CString strGradYear = GetCurrentAcademicYear( );
// Assign the values to parameter data members
rsStudents.m_strGradYrParam = strGradYear;
// Run the query
if( !rsStudents.Requery( ) )
    return FALSE;
Postuppsättningen innehåller poster för de elever vars poster uppfyller de villkor som anges av filtret, som har konstruerats från körinställningar. I det här fallet innehåller postuppsättningen poster för alla seniora studenter.
Anmärkning
Om det behövs kan du ange värdet för en parameterdatamedlem till Null med hjälp av SetParamNull. Du kan också kontrollera om en parameterdatamedlem är Null med hjälp av IsFieldNull.
Se även
              Postuppsättning (ODBC)
              Rekordsats: Lägga till, uppdatera och ta bort poster (ODBC)
              Postuppsättning: Hur poster väljs i postuppsättningar (ODBC)