Sdílet prostřednictvím


Předpřipravené provedení ODBC

Připravené spuštění je efektivní způsob, jak provést příkaz více než jednou. Příkaz se nejprve zkompiluje nebo připraví do přístupového plánu. Plán přístupu se pak spustí jednou nebo vícekrát později. Další informace o plánech přístupu najdete v tématu Zpracování příkazu SQL.

Připravené spouštění se běžně používá ve svislých a vlastních aplikacích k opakovanému spuštění stejného parametrizovaného příkazu SQL. Následující kód například připraví výpis pro aktualizaci cen různých částí. Potom příkaz spustí několikrát s různými hodnotami parametrů pokaždé.

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);  
}  

Připravené spuštění je rychlejší než přímé spuštění příkazů spuštěných více než jednou, a to především proto, že příkaz je zkompilován pouze jednou; příkazy spouštěné přímo se kompilují při každém spuštění. Připravené spuštění může také snížit síťový provoz, protože ovladač může odeslat identifikátor plánu přístupu ke zdroji dat při každém spuštění příkazu, a ne celý příkaz SQL, pokud zdroj dat podporuje identifikátory plánu přístupu.

Aplikace může načíst metadata sady výsledků po přípravě příkazu a před jeho spuštěním. Vrácení metadat pro připravené, nevykonané příkazy je však v některých ovladačích nákladné a interoperabilní aplikace by se tomu měly, pokud možno, vyhnout. Další informace naleznete v tématu Metadata sady výsledků.

Připravené spuštění by se nemělo používat pro příkazy spouštěné jednou. U takových příkazů je o něco pomalejší než přímé spouštění, protože vyžaduje další volání funkce ODBC.

Důležité

Potvrzení nebo vrácení transakce zpět explicitním voláním SQLEndTran nebo v režimu automatického potvrzení způsobí, že některé zdroje dat odstraní plány přístupu pro všechny příkazy v připojení. Další informace naleznete v možnostech SQL_CURSOR_COMMIT_BEHAVIOR a SQL_CURSOR_ROLLBACK_BEHAVIOR v popisu funkce SQLGetInfo.

Pokud chcete připravit a spustit příkaz, aplikace:

  1. Volá SQLPrepare a předá mu řetězec obsahující dotaz SQL.

  2. Nastaví hodnoty všech parametrů. Parametry lze ve skutečnosti nastavit před nebo po přípravě příkazu. Další informace najdete v části Parametry příkazu dále v této části.

  3. Volá SQLExecute a provádí jakékoli další zpracování, které je nezbytné, například načítání dat.

  4. Podle potřeby zopakuje kroky 2 a 3.

  5. Když je volána funkce SQLPrepare , ovladač:

    • Upraví příkaz SQL tak, aby používal gramatiku SQL zdroje dat bez analýzy příkazu. To zahrnuje nahrazení escape sekvencí probíraných v Escape sekvencích v ODBC. Aplikace může načíst upravenou formu příkazu SQL voláním SQLNativeSql. Řídicí sekvence se nenahrazují, pokud je nastaven atribut příkazu SQL_ATTR_NOSCAN.

    • Odešle příkaz do zdroje dat pro přípravu.

    • Uloží vrácený identifikátor plánu přístupu pro pozdější spuštění (pokud byla příprava úspěšná) nebo vrátí případné chyby (pokud se příprava nezdařila). Mezi chyby patří syntaktické chyby, jako je SQLSTATE 42000 (chyba syntaxe nebo narušení přístupu) a sémantické chyby, jako je SQLSTATE 42S02 (základní tabulka nebo zobrazení nebyly nalezeny).

      Poznámka:

      Některé ovladače v tuto chvíli nevrací chyby, ale místo toho je vrátí při spuštění příkazu nebo při zavolání funkcí katalogu. Proto se může zdát, že sqlPrepare byl úspěšný, když ve skutečnosti selhal.

  6. Při volání SQLExecute ovladač:

    • Načte aktuální hodnoty parametrů a podle potřeby je převede. Další informace najdete v části Parametry příkazu dále v této části.

    • Odešle identifikátor plánu přístupu a převedené hodnoty parametrů do zdroje dat.

    • Vrátí všechny chyby. Jedná se o obecné chyby za běhu, například SQLSTATE 24000 (neplatný stav kurzoru). Některé ovladače však v tuto chvíli vrací syntaktické a sémantické chyby.

Pokud zdroj dat nepodporuje přípravu prohlášení, ovladač ho musí emulovat do rozsahu možného. Ovladač například nemusí dělat nic, když je volána funkce SQLPrepare , a pak provést přímé spuštění příkazu při volání SQLExecute .

Pokud zdroj dat podporuje kontrolu syntaxe bez spuštění, ovladač může odeslat příkaz pro kontrolu, kdy je volána funkce SQLPrepare , a odeslat příkaz pro spuštění při volání SQLExecute .

Pokud ovladač nemůže emulovat přípravu příkazů, uloží příkaz při volání SQLPrepare a odešle ho ke spuštění při volání SQLExecute .

Vzhledem k tomu, že příprava emulovaného příkazu není dokonalá, sqlExecute může vrátit jakékoli chyby obvykle vrácené nástrojem SQLPrepare.