Megosztás:


Előkészített végrehajtás ODBC

Az előkészített végrehajtás egy utasítás többszöri végrehajtásának hatékony módja. Az utasítást először egy hozzáférési tervbe kell lefordítani vagy előkészíteni . A hozzáférési terv végrehajtása egy vagy több alkalommal később történik meg. A hozzáférési csomagokkal kapcsolatos további információkért tekintse meg az SQL-utasítás feldolgozását ismertető témakört.

Az előkészített végrehajtást általában függőleges és egyéni alkalmazások használják ugyanazon paraméteres SQL-utasítás ismételt végrehajtására. A következő kód például egy utasítást készít a különböző részek árainak frissítésére. Ezután többször is végrehajtja az utasítást különböző paraméterértékekkel.

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

Az előkészített végrehajtás gyorsabb, mint a többször végrehajtott utasítások közvetlen végrehajtása, elsősorban azért, mert az utasítás csak egyszer van lefordítva; a közvetlenül végrehajtott utasítások minden egyes végrehajtásakor le lesznek fordítva. Az előkészített végrehajtás a hálózati forgalom csökkenését is okozhatja, mivel az illesztőprogram a teljes SQL-utasítás helyett minden egyes utasítás végrehajtásakor küldhet hozzáférésiterv-azonosítót az adatforrásnak, ha az adatforrás támogatja a hozzáférési terv azonosítóit.

Az alkalmazás az utasítás előkészítése és végrehajtása előtt lekérheti az eredményhalmaz metaadatait. Egyes illesztőprogramok esetében azonban költséges a metaadatok visszaadása az előkészített, fel nem használt utasításokhoz, és lehetőség szerint az interoperábilis alkalmazásoknak el kell kerülnie. További információ: Eredményhalmaz metaadatai.

Az előkészített végrehajtás nem használható egyetlen alkalommal végrehajtott utasításokhoz. Az ilyen utasítások esetében valamivel lassabb, mint a közvetlen végrehajtás, mivel további ODBC-függvényhívást igényel.

Fontos

A tranzakciók véglegesítése vagy visszaállítása, akár az SQLEndTran kifejezett meghívásával, akár automatikus véglegesítési módban dolgozva, egyes adatforrások esetén az összes kapcsolatutasítás hozzáférési tervének törlését okozza. További információkért tekintse meg az SQLGetInfo függvény leírásának SQL_CURSOR_COMMIT_BEHAVIOR és SQL_CURSOR_ROLLBACK_BEHAVIOR beállításait.

Egy utasítás előkészítéséhez és végrehajtásához az alkalmazás:

  1. Meghívja az SQLPrepare-t , és átadja az SQL-utasítást tartalmazó sztringet.

  2. Beállítja a paraméterek értékeit. A paraméterek az utasítás előkészítése előtt vagy után is beállíthatók. További információ a Nyilatkozat paraméterei megtalálható a szakasz későbbi részében.

  3. Meghívja az SQLExecute-et , és elvégzi a szükséges további feldolgozást, például az adatok beolvasását.

  4. Szükség esetén megismétli a 2. és a 3. lépést.

  5. Az SQLPrepare meghívásakor az illesztőprogram:

    • Módosítja az SQL-utasítást úgy, hogy az adatforrás SQL-nyelvtanát használja az utasítás elemzése nélkül. Ez magában foglalja az ODBC Escape Sequencesben tárgyalt menekülési sorozatok cseréjét is. Az alkalmazás az SQLNativeSql meghívásával lekérheti egy SQL-utasítás módosított formáját. A feloldósorozatok nem cserélődnek le, ha a SQL_ATTR_NOSCAN utasítás attribútum be van állítva.

    • Elküldi az utasítást az adatforrásnak előkészítés céljából.

    • Tárolja a visszaadott hozzáférési terv azonosítóját a későbbi végrehajtáshoz (ha az előkészítés sikeres volt), vagy hibát ad vissza (ha az előkészítés sikertelen volt). A hibák közé tartoznak a szintaktikai hibák, például az SQLSTATE 42000 (Szintaktikai hiba vagy hozzáférés-megsértés) és szemantikai hibák, például az SQLSTATE 42S02 (Alaptábla vagy nézet nem található).

      Megjegyzés:

      Egyes illesztőprogramok jelenleg nem adnak vissza hibákat, hanem az utasítás végrehajtásakor vagy katalógusfüggvények meghívásakor adnak vissza. Így az SQLPrepare sikeresnek tűnhet, ha valójában nem sikerült.

  6. Az SQLExecute meghívásakor az illesztőprogram:

    • Lekéri az aktuális paraméterértékeket, és szükség szerint konvertálja őket. További információért lásd a későbbi részben található Utasításparaméterek részt.

    • Elküldi a hozzáférési terv azonosítót és a konvertált paraméterértékeket az adatforrásnak.

    • Minden hibát visszaad. Ezek általában futásidejű hibák, például SQLSTATE 24000 (Érvénytelen kurzorállapot). Egyes illesztőprogramok azonban ezen a ponton szintaktikai és szemantikai hibákat adnak vissza.

Ha az adatforrás nem támogatja az utasítás előkészítését, az illesztőprogramnak a lehető legnagyobb mértékben emulálnia kell. Előfordulhat például, hogy az illesztő nem tesz semmit az SQLPrepare meghívásakor , majd az SQLExecute meghívásakor végrehajtja az utasítás közvetlen végrehajtását.

Ha az adatforrás támogatja a szintaxis-ellenőrzést végrehajtás nélkül, az illesztőprogram elküldheti az utasítást az SQLPrepare meghívásának ellenőrzéséhez , és elküldheti a végrehajtási utasítást az SQLExecute meghívásakor.

Ha az illesztőprogram nem tudja emulálni az utasítás-előkészítést, akkor az SQLPrepare meghívásakor tárolja az utasítást, és végrehajtásra küldi az SQLExecute meghívásakor.

Mivel az emulált utasítás előkészítése nem tökéletes, az SQLExecute visszaadhatja az SQLPrepare által általában visszaadott hibákat.