Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Förberedd exekvering är ett effektivt sätt att köra en instruktion mer än en gång. Instruktionen kompileras först, eller förbereds, i en åtkomstplan. Åtkomstplanen utförs sedan en eller flera gånger vid ett senare tillfälle. Mer information om åtkomstplaner finns i Bearbeta en SQL-instruktion.
Förberedd körning används ofta av vertikala och anpassade program för att upprepade gånger köra samma, parametriserade SQL-instruktion. Följande kod förbereder till exempel en instruktion för att uppdatera priserna för olika delar. Sedan körs instruktionen flera gånger med olika parametervärden varje gång.
SQLREAL Price;
SQLUINTEGER PartID;
SQLINTEGER PartIDInd = 0, PriceInd = 0;
// Prepare a statement to update salaries in the Employees table.
SQLPrepare(hstmt, "UPDATE Parts SET Price = ? WHERE PartID = ?", SQL_NTS);
// Bind Price to the parameter for the Price column and PartID to
// the parameter for the PartID column.
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,
&Price, 0, &PriceInd);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0,
&PartID, 0, &PartIDInd);
// Repeatedly execute the statement.
while (GetPrice(&PartID, &Price)) {
SQLExecute(hstmt);
}
Förberedd körning är snabbare än direkt körning för instruktioner som körs mer än en gång, främst eftersom -instruktionen bara kompileras en gång. -instruktioner som körs direkt kompileras varje gång de körs. Förberedd körning kan också ge en minskning av nätverkstrafiken eftersom drivrutinen kan skicka en identifierare för åtkomstplan till datakällan varje gång instruktionen körs, i stället för en hel SQL-instruktion, om datakällan stöder åtkomstplansidentifierare.
Programmet kan hämta metadata för resultatuppsättningen när instruktionen har förberetts och innan den körs. Att returnera metadata för förberedda, oexekverade instruktioner är dock dyrt för vissa drivrutiner och bör undvikas av interoperabla applikationer om möjligt. Mer information finns i Metadata för resultatuppsättning.
Förberedd exekvering ska inte användas för instruktioner som utförs endast en gång. För sådana uttalanden är det något långsammare än direkt körning eftersom det kräver ytterligare ett ODBC-funktionsanrop.
Viktigt!
Om du genomför eller rullar tillbaka en transaktion, antingen genom att anropa SQLEndTran eller genom att arbeta i autokommittläge, tar vissa datakällor bort åtkomstplanerna för alla instruktioner för en anslutning. Mer information finns i alternativen SQL_CURSOR_COMMIT_BEHAVIOR och SQL_CURSOR_ROLLBACK_BEHAVIOR i funktionsbeskrivningen för SQLGetInfo .
För att förbereda och köra en instruktion, applikationen:
Anropar SQLPrepare och skickar den en sträng som innehåller SQL-instruktionen.
Anger värdena för alla parametrar. Man kan faktiskt ange parametrar före eller efter att instruktionen har förberetts. Mer information finns i Instruktionsparametrar senare i det här avsnittet.
Anropar SQLExecute och utför all ytterligare bearbetning som krävs, till exempel att hämta data.
Upprepar steg 2 och 3 efter behov.
När SQLPrepare anropas, drivrutinen:
Ändrar SQL-instruktionen så att den använder datakällans SQL-grammatik utan att parsa -instruktionen. Detta inkluderar att ersätta escape-sekvenserna som beskrivs i Escape-sekvenser i ODBC. Programmet kan hämta den ändrade formen av en SQL-instruktion genom att anropa SQLNativeSql. Escape-sekvenser ersätts inte om SQL_ATTR_NOSCAN-instruktionsattributet har angetts.
Skickar uttrycket till datakällan för förberedelse.
Lagrar identifieraren för den returnerade åtkomstplanen för senare körning (om förberedelsen lyckades) eller returnerar eventuella fel (om förberedelsen misslyckades). Fel inkluderar syntaktiska fel som SQLSTATE 42000 (syntaxfel eller åtkomstöverträdelse) och semantiska fel som SQLSTATE 42S02 (bastabell eller vy hittades inte).
Anmärkning
Vissa drivrutiner returnerar inte fel just nu, utan returnerar dem i stället när instruktionen körs eller när katalogfunktioner anropas. SqlPrepare kan därför verka ha lyckats när det i själva verket har misslyckats.
När SQLExecute anropas, drivrutinen:
Hämtar de aktuella parametervärdena och konverterar dem efter behov. Mer information finns i Instruktionsparametrar senare i det här avsnittet.
Skickar identifieraren för åtkomstplanen och konverterade parametervärden till datakällan.
Returnerar eventuella fel. Det här är vanligtvis körningsfel som SQLSTATE 24000 (det ogiltiga markörtillståndet). Vissa drivrutiner returnerar dock syntaktiska och semantiska fel just nu.
Om datakällan inte stöder förberedelse av uttalanden måste drivrutinen emulera det i så stor utsträckning som möjligt. Drivrutinen kan till exempel inte göra någonting när SQLPrepare anropas och sedan utföra direkt körning av -instruktionen när SQLExecute anropas.
Om datakällan stöder syntaxkontroll utan körning kan drivrutinen skicka instruktionen för att kontrollera när SQLPrepare anropas och skicka instruktionen för körning när SQLExecute anropas.
Om drivrutinen inte kan emulera uttrycksförberedelser lagrar den -instruktionen när SQLPrepare anropas och skickar den för körning när SQLExecute anropas.
Eftersom emulerad uttrycksförberedelse inte är perfekt kan SQLExecute returnera eventuella fel som normalt returneras av SQLPrepare.