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.
I det här avsnittet förklaras:
Så här konstruerar ramverket en SQL-instruktion
Så här åsidosätter du SQL-instruktionen
Anmärkning
Den här informationen gäller för MFC ODBC-klasserna. Om du arbetar med MFC DAO-klasserna läser du avsnittet "Jämförelse av Microsoft Jet Database Engine SQL och ANSI SQL" i DAO-hjälpen.
SQL-instruktionskonstruktion
Postuppsättningen baserar postens val främst på en SQL SELECT-instruktion . När du deklarerar din klass med en guide skriver den en åsidosättande version av GetDefaultSQL-medlemsfunktionen som ser ut ungefär så här (för en postuppsättningsklass kallad CAuthors).
CString CAuthors::GetDefaultSQL()
{
return "AUTHORS";
}
Som standardinställning returnerar den här åsidosättningen det tabellnamn som du specificerade i guiden. I exemplet är tabellnamnet "FÖRFATTARE". När du senare anropar postuppsättningens Open medlemsfunktion Open skapar du en slutgiltig SELECT-instruktion av formen:
SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
[ORDER BY m_strSort]
där table-name erhålls genom att anropa GetDefaultSQL och rfx-field-list hämtas från RFX-funktionsanropen i DoFieldExchange. Det här är vad du får för en SELECT-instruktion om du inte ersätter den med en övergripande version vid körning, även om du också kan ändra standardsatsen med parametrar eller ett filter.
Anmärkning
Om du anger ett kolumnnamn som innehåller (eller kan innehålla) blanksteg måste du omsluta namnet med hakparenteser. Namnet "Förnamn" ska till exempel vara "[Förnamn]".
Om du vill åsidosätta STANDARD-SELECT-instruktionen skickar du en sträng som innehåller en fullständig SELECT-instruktion när du anropar Open. I stället för att skapa en egen standardsträng använder postuppsättningen den sträng du tillhandahåller. Om ersättningsinstruktionen innehåller en WHERE-sats anger du inte ett filter i m_strFilter eftersom du då skulle ha två filterinstruktioner. Om ersättningsinstruktionen på samma sätt innehåller en ORDER BY-sats ska du inte ange någon sortering i m_strSort så att du inte har två sorteringsinstruktioner.
Anmärkning
Om du använder literalsträngar i dina filter (eller andra delar av SQL-instruktionen) kan du behöva "citera" sådana strängar, vilket innebär att omsluta dem med angivna avgränsare samt ett DBMS-specifikt literalprefix och literalsuffixtecken (eller tecken).
Du kan också stöta på särskilda syntaktiska krav för åtgärder som yttre kopplingar, beroende på din DBMS. Använd ODBC-funktioner för att hämta den här informationen från drivrutinen för DBMS. Anropa ::SQLGetTypeInfo för en specifik datatyp, som SQL_VARCHAR, för att begära LITERAL_PREFIX och LITERAL_SUFFIX-tecken. Om du skriver databasoberoende kod läser du Bilaga C: SQL-grammatik i ODBC-programmerarens referens för detaljerad syntaxinformation.
Ett recordset-objekt konstruerar SQL-instruktionen som används för att välja poster, såvida du inte skickar en anpassad SQL-instruktion. Hur detta görs beror främst på det värde som du skickar i parametern lpszSQL för Open medlemsfunktionen.
Den allmänna formen av en SQL SELECT-instruktion är:
SELECT [ALL | DISTINCT] column-list FROM table-list
[WHERE search-condition][ORDER BY column-list [ASC | DESC]]
Ett sätt att lägga till nyckelordet DISTINCT i postuppsättningens SQL-instruktion är att bädda in nyckelordet i det första RFX-funktionsanropet i DoFieldExchange. Till exempel:
...
RFX_Text(pFX, "DISTINCT CourseID", m_strCourseID);
...
Anmärkning
Använd endast den här tekniken med en datamängd som öppnas som endast läsbar.
Åsidosätta SQL-instruktionen
I följande tabell visas möjligheterna för parametern lpszSQL till Open. Fallen i tabellen förklaras nedan.
LpszSQL-parametern och den resulterande SQL-strängen
| Ärende | Vad du skickar i lpszSQL | Den resulterande SELECT-instruktionen |
|---|---|---|
| 1 | NOLL |
SELECTrfx-field-listFROMtable-nameCRecordset::Open anropar GetDefaultSQL för att hämta tabellnamnet. Den resulterande strängen är ett av fallen 2 till 5, beroende på vad som GetDefaultSQL returneras. |
| 2 | Ett tabellnamn |
SELECTrfx-field-listFROMtable-name Fältlistan hämtas från RFX-uttrycken i DoFieldExchange. Om m_strFilter och m_strSort inte är tomma lägger du till WHERE - och/eller ORDER BY-satserna . |
| 3 * | En fullständig SELECT-instruktion men utan en WHERE- eller ORDER BY-sats | Som passerat. Om m_strFilter och m_strSort inte är tomma lägger du till WHERE - och/eller ORDER BY-satserna . |
| 4 * | En fullständig SELECT-instruktion med en WHERE- och/eller ORDER BY-sats | Som passerat.
m_strFilter och/eller m_strSort måste förbli tomma, eller två filter- och/eller sorteringsuttryck skapas. |
| 5 * | Ett anrop till en lagrad procedur | Som passerat. |
*
m_nFields måste vara mindre än eller lika med det antal kolumner som anges i SELECT-instruktionen . Datatypen för varje kolumn som anges i SELECT-instruktionen måste vara samma som datatypen för motsvarande RFX-utdatakolumn.
Fall 1 lpszSQL = NULL
Valet av postuppsättning beror på vad GetDefaultSQL returnerar när CRecordset::Open anropas. Fall 2 till 5 beskriver möjliga strängar.
Ärende 2 lpszSQL = ett tabellnamn
Postuppsättningen använder RFX (Record Field Exchange) för att bygga kolumnlistan från de kolumnnamn som anges i RFX-funktionsanropen i postuppsättningsklassens överlagring av DoFieldExchange. Om du använde en guide för att deklarera din postuppsättningsklass, kommer resultatet i detta fall att bli detsamma som i fall 1 (förutsatt att du anger samma tabellnamn som du specificerade i guiden). Om du inte använder en guide för att skriva klassen är fall 2 det enklaste sättet att konstruera SQL-instruktionen.
I följande exempel skapas en SQL-instruktion som väljer poster från ett MFC-databasprogram. När ramverket anropar GetDefaultSQL medlemsfunktionen returnerar funktionen namnet på tabellen, SECTION.
CString CEnrollSet::GetDefaultSQL()
{
return "SECTION";
}
För att hämta namnen på kolumnerna för SQL SELECT-instruktionen anropar DoFieldExchange ramverket medlemsfunktionen.
void CEnrollSet::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "CourseID", m_strCourseID);
RFX_Text(pFX, "InstructorID", m_strInstructorID);
RFX_Text(pFX, "RoomNo", m_strRoomNo);
RFX_Text(pFX, "Schedule", m_strSchedule);
RFX_Text(pFX, "SectionNo", m_strSectionNo);
}
När sql-instruktionen är klar ser den ut så här:
SELECT CourseID, InstructorID, RoomNo, Schedule, SectionNo
FROM SECTION
Ärende 3 lpszSQL = en SELECT/FROM-instruktion
Du anger kolumnlistan för hand i stället för att förlita dig på RFX för att konstruera den automatiskt. Du kanske vill göra detta när:
Du vill ange nyckelordet DISTINCT efter SELECT.
Din kolumnlista ska matcha kolumnnamnen och typerna i samma ordning som de visas i
DoFieldExchange.Du har anledning att manuellt hämta kolumnvärden med hjälp av ODBC-funktionen
::SQLGetDatai stället för att förlita dig på RFX för att binda och hämta kolumner åt dig.Du kanske till exempel vill hantera nya kolumner som en kund i ditt program har lagt till i databastabellerna efter att programmet har distribuerats. Du måste lägga till dessa extra fältdatamedlemmar, som inte var kända när du deklarerade klassen med en guide.
Din kolumnlista ska matcha kolumnnamnen och typerna i samma ordning som de visas i
DoFieldExchange, följt av namnen på de manuellt bundna kolumnerna. Mer information finns i Recordset: Dynamically Binding Data Columns (ODBC).Du vill koppla tabeller genom att ange flera tabeller i FROM-satsen .
Mer information och ett exempel finns i Recordset: Performing a Join (ODBC).
Fall 4 lpszSQL = SELECT/FROM Plus WHERE och/eller ORDER BY
Du anger allt: kolumnlistan (baserat på RFX-anropen i DoFieldExchange), tabelllistan och innehållet i en WHERE och/eller ORDER BY-sats. Om du anger dina WHERE- och/eller ORDER BY-satser på det här sättet ska du inte använda m_strFilter och/eller m_strSort.
Ärende 5 lpszSQL = ett anrop för lagrad procedur
Om du behöver anropa en fördefinierad fråga (till exempel en lagrad procedur i en Microsoft SQL Server-databas) måste du skriva en CALL-instruktion i strängen som du skickar till lpszSQL. Guiderna stöder inte att deklarera en recordset-klass för att anropa en fördefinierad fråga. Alla fördefinierade frågor returnerar inte poster.
Om en fördefinierad fråga inte returnerar poster kan du använda CDatabase medlemsfunktionen ExecuteSQL direkt. För en fördefinierad fråga som returnerar poster måste du också skriva RFX-anropen DoFieldExchange manuellt för alla kolumner som proceduren returnerar. RFX-anropen måste vara i samma ordning och returnera samma typer som den fördefinierade frågan. Mer information finns i Recordset: Declaring a Class for a Predefined Query (ODBC).
Se även
SQL: SQL- och C++-datatyper (ODBC)
SQL: Att göra direkta SQL-anrop (ODBC)