Dela via


ODBC för direktkörning

Direktkörning är det enklaste sättet att köra ett kommando. När instruktionen skickas för körning kompilerar datakällan den till en åtkomstplan och utför sedan denna plan.

Direktkörning används ofta av generiska applikationer som skapar och kör kommandon vid körning. Följande kod skapar till exempel en SQL-instruktion och kör den en gång:

SQLCHAR *SQLStatement;  
  
// Build a SQL statement.  
BuildStatement(SQLStatement);  
  
// Execute the statement.  
SQLExecDirect(hstmt, SQLStatement, SQL_NTS);  

Direktkörning fungerar bäst för satser som bara körs en gång. Den största nackdelen är att SQL-instruktionen parsas varje gång den körs. Dessutom kan programmet inte hämta information om resultatuppsättningen som skapats av -instruktionen (om någon) förrän efter att -instruktionen har körts. detta är möjligt om -instruktionen förbereds och körs i två separata steg.

Om du vill köra en instruktion direkt utför programmet följande åtgärder:

  1. Anger värdena för alla parametrar. Mer information finns i Instruktionsparametrar senare i det här avsnittet.

  2. Anropar SQLExecDirect och skickar den en sträng som innehåller SQL-instruktionen.

  3. När SQLExecDirect 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.

    • Hämtar de aktuella parametervärdena och konverterar dem efter behov. Mer information finns i Instruktionsparametrar senare i det här avsnittet.

    • Skickar uttrycket och de konverterade parametervärdena till datakällan för att köras.

    • Returnerar eventuella fel. Dessa inkluderar sekvensering eller tillståndsdiagnostik, till exempel SQLSTATE 24000 (ogiltigt markörtillstånd), syntaktiska fel som SQLSTATE 42000 (syntaxfel eller åtkomstöverträdelse) och semantiska fel som SQLSTATE 42S02 (Bastabell eller vy hittades inte).