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.
Voorbereide uitvoering is een efficiënte manier om een instructie meer dan één keer uit te voeren. De instructie wordt eerst gecompileerd of voorbereid in een toegangsplan. Het toegangsplan wordt vervolgens op een later tijdstip een of meer keer uitgevoerd. Zie Een SQL-instructie verwerken voor meer informatie over toegangsplannen.
De voorbereide uitvoering wordt vaak gebruikt door verticale en aangepaste toepassingen om herhaaldelijk dezelfde, geparameteriseerde SQL-instructie uit te voeren. Met de volgende code wordt bijvoorbeeld een instructie voorbereid om de prijzen van verschillende onderdelen bij te werken. Vervolgens wordt de instructie meerdere keren uitgevoerd met verschillende parameterwaarden telkens.
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);
}
Voorbereide uitvoering is sneller dan directe uitvoering voor instructies die meer dan één keer worden uitgevoerd, voornamelijk omdat de instructie slechts één keer wordt gecompileerd; instructies die rechtstreeks worden uitgevoerd, worden telkens wanneer ze worden uitgevoerd gecompileerd. Voorbereide uitvoering kan ook een vermindering van het netwerkverkeer bieden, omdat het stuurprogramma telkens wanneer de instructie wordt uitgevoerd, een toegangsplan-id naar de gegevensbron kan verzenden, in plaats van een volledige SQL-instructie, als de gegevensbron ondersteuning biedt voor de id's van het toegangsplan.
De toepassing kan de metagegevens voor de resultatenset ophalen nadat de instructie is voorbereid en voordat deze wordt uitgevoerd. Het retourneren van metagegevens voor voorbereide, niet-uitgevoerde instructies is echter duur voor sommige stuurprogramma's en moet indien mogelijk worden vermeden door interoperabele toepassingen. Zie Metagegevens van resultatenset voor meer informatie.
Voorbereide uitvoering mag niet worden gebruikt voor instructies die één keer worden uitgevoerd. Voor dergelijke instructies is het iets langzamer dan de directe uitvoering, omdat hiervoor een extra ODBC-functieaanroep is vereist.
Belangrijk
Het doorvoeren of terugdraaien van een transactie, hetzij door expliciet SQLEndTran aan te roepen of door in de modus voor automatisch doorvoeren te werken, zorgt ervoor dat sommige gegevensbronnen de toegangsplannen voor alle instructies voor een verbinding verwijderen. Zie de opties voor SQL_CURSOR_COMMIT_BEHAVIOR en SQL_CURSOR_ROLLBACK_BEHAVIOR in de beschrijving van de functie SQLGetInfo voor meer informatie.
De toepassing bereidt een verklaring voor en voert deze uit:
Roept SQLPrepare aan en geeft deze een tekenreeks door die de SQL-instructie bevat.
Hiermee stelt u de waarden van parameters in. Parameters kunnen worden ingesteld voor of na het voorbereiden van de verklaring. Voor meer informatie, zie Instructieparameters verderop in deze sectie.
Roept SQLExecute aan en voert eventuele aanvullende verwerkingen uit die nodig zijn, zoals het ophalen van gegevens.
Herhaalt stap 2 en 3 indien nodig.
Wanneer SQLPrepare wordt aangeroepen, wordt het stuurprogramma:
Hiermee wijzigt u de SQL-instructie om de SQL-grammatica van de gegevensbron te gebruiken zonder de instructie te parseren. Dit omvat het vervangen van de escapereeksen die worden besproken in Escape Sequences in ODBC. De toepassing kan de gewijzigde vorm van een SQL-instructie ophalen door SQLNativeSql aan te roepen. Escape-reeksen worden niet vervangen als het instructie-attribuut SQL_ATTR_NOSCAN is ingesteld.
Hiermee wordt de instructie naar de gegevensbron verzonden om deze voor te bereiden.
Slaat de geretourneerde toegangsplan-id op voor latere uitvoering (als de voorbereiding is geslaagd) of retourneert eventuele fouten (als de voorbereiding is mislukt). Fouten zijn syntactische fouten zoals SQLSTATE 42000 (syntaxisfout of toegangsfout) en semantische fouten zoals SQLSTATE 42S02 (basistabel of weergave niet gevonden).
Opmerking
Sommige stuurprogramma's retourneren op dit moment geen fouten, maar retourneren ze wanneer de instructie wordt uitgevoerd of wanneer catalogusfuncties worden aangeroepen. SQLPrepare lijkt dus te zijn geslaagd wanneer het in feite is mislukt.
Wanneer SQLExecute wordt aangeroepen, wordt het stuurprogramma:
Haalt de huidige parameterwaarden op en converteert deze indien nodig. Voor meer informatie, zie Instructieparameters verderop in deze paragraaf.
Hiermee worden de id van het toegangsplan en geconverteerde parameterwaarden naar de gegevensbron verzonden.
Retourneert eventuele fouten. Dit zijn over het algemeen runtimefouten zoals SQLSTATE 24000 (ongeldige cursorstatus). Sommige stuurprogramma's retourneren op dit moment echter syntactische en semantische fouten.
Als de gegevensbron geen ondersteuning biedt voor de voorbereiding van de verklaring, moet het stuurprogramma dit zo veel mogelijk emuleren. Het stuurprogramma kan bijvoorbeeld niets doen wanneer SQLPrepare wordt aangeroepen en vervolgens directe uitvoering van de instructie uitvoeren wanneer SQLExecute wordt aangeroepen.
Als de gegevensbron syntaxiscontrole zonder uitvoering ondersteunt, kan het stuurprogramma de instructie indienen om te controleren wanneer SQLPrepare wordt aangeroepen en de instructie verzenden voor uitvoering wanneer SQLExecute wordt aangeroepen.
Als het stuurprogramma de voorbereiding van de instructie niet kan emuleren, wordt de instructie opgeslagen wanneer SQLPrepare wordt aangeroepen en verzendt deze voor uitvoering wanneer SQLExecute wordt aangeroepen.
Omdat geëmuleerde instructievoorbereiding niet perfect is, kan SQLExecute fouten retourneren die normaal gesproken worden geretourneerd door SQLPrepare.