Udostępnij przez


Przygotowanie wykonania ODBC

Przygotowane wykonanie pozwala na wydajne wykonywanie instrukcji więcej niż raz. Instrukcja jest najpierw skompilowana lub przygotowana do planu dostępu. Plan dostępu jest następnie wykonywany co najmniej raz w późniejszym czasie. Aby uzyskać więcej informacji na temat planów dostępu, zobacz Przetwarzanie instrukcji SQL.

Przygotowane wykonanie jest często używane przez aplikacje pionowe i niestandardowe do wielokrotnego wykonywania tej samej, sparametryzowanej instrukcji SQL. Na przykład, poniższy kod przygotowuje instrukcję do aktualizacji cen różnych części. Następnie wykonuje instrukcję wiele razy z różnymi wartościami parametrów za każdym razem.

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

Przygotowanie wykonania jest szybsze niż bezpośrednie wykonywanie instrukcji wykonywanych więcej niż raz, przede wszystkim dlatego, że instrukcja jest kompilowana tylko raz; instrukcje wykonywane bezpośrednio są kompilowane za każdym razem, gdy są wykonywane. Przygotowane wykonanie może również zapewnić zmniejszenie ruchu sieciowego, ponieważ sterownik może wysłać identyfikator planu dostępu do źródła danych za każdym razem, gdy instrukcja jest wykonywana, zamiast całej instrukcji SQL, jeśli źródło danych obsługuje identyfikatory planu dostępu.

Aplikacja może pobrać metadane zestawu wyników po przygotowaniu instrukcji i przed jej wykonaniem. Jednak zwracanie metadanych dla przygotowanych, niewyskonanych instrukcji jest kosztowne dla niektórych sterowników i powinno być unikane przez aplikacje współdziałające, jeśli to możliwe. Aby uzyskać więcej informacji, zobacz Metadane zestawu wyników.

Przygotowane wykonanie nie powinno być używane w przypadku instrukcji wykonywanych pojedynczo. W przypadku takich instrukcji jest nieco wolniejsze niż bezpośrednie wykonywanie, ponieważ wymaga dodatkowego wywołania funkcji ODBC.

Ważne

Zatwierdzenie lub wycofanie transakcji przez jawne wywołanie SQLEndTran lub działanie w trybie automatycznego zatwierdzania powoduje, że niektóre źródła danych usuwają plany dostępu dla wszystkich instrukcji w połączeniu. Aby uzyskać więcej informacji, zobacz opcje SQL_CURSOR_COMMIT_BEHAVIOR i SQL_CURSOR_ROLLBACK_BEHAVIOR w opisie funkcji SQLGetInfo .

Aby przygotować i wykonać zapytanie, aplikacja:

  1. Wywołuje narzędzie SQLPrepare i przekazuje do niego ciąg zawierający instrukcję SQL.

  2. Ustawia wartości dowolnych parametrów. Parametry można ustawić przed lub po przygotowaniu zapytania. Aby uzyskać więcej informacji, zobacz Parametry instrukcji w dalszej części tej sekcji.

  3. Wywołuje metodę SQLExecute i wykonuje wszelkie dodatkowe operacje przetwarzania, takie jak pobieranie danych.

  4. W razie potrzeby powtarza kroki 2 i 3.

  5. Po wywołaniu narzędzia SQLPrepare sterownik:

    • Modyfikuje instrukcję SQL, aby używać gramatyki SQL źródła danych bez analizowania instrukcji. Obejmuje to zastąpienie sekwencji ucieczki omówionych w sekwencjach ucieczki w odBC. Aplikacja może pobrać zmodyfikowaną formę instrukcji SQL, wywołując polecenie SQLNativeSql. Sekwencje ucieczki nie są zastępowane, jeśli ustawiono atrybut instrukcji SQL_ATTR_NOSCAN.

    • Wysyła zapytanie do źródła danych do przygotowania.

    • Przechowuje zwrócony identyfikator planu dostępu do późniejszego wykonania (jeśli przygotowanie zakończyło się pomyślnie) lub zwraca błędy (jeśli przygotowanie nie powiodło się). Błędy obejmują błędy składniowe, takie jak SQLSTATE 42000 (błąd składniowy lub naruszenie dostępu) oraz błędy semantyczne, takie jak SQLSTATE 42S02 (nie znaleziono tabeli podstawowej lub widoku).

      Uwaga / Notatka

      Niektóre sterowniki nie zwracają błędów w tym momencie, ale zamiast tego zwracają je po wykonaniu instrukcji lub wywołaniu funkcji wykazu. W związku z tym narzędzie SQLPrepare może wydawać się, że zakończyło się pomyślnie, gdy w rzeczywistości zakończyło się niepowodzeniem.

  6. Po wywołaniu metody SQLExecute sterownik:

    • Pobiera bieżące wartości parametrów i konwertuje je w razie potrzeby. Aby uzyskać więcej informacji, zobacz Parametry instrukcji w dalszej części tej sekcji.

    • Wysyła identyfikator planu dostępu i przekonwertowane wartości parametrów do źródła danych.

    • Zwraca wszelkie błędy. Są to zazwyczaj błędy czasu wykonywania, takie jak SQLSTATE 24000 (nieprawidłowy stan kursora). Jednak w tym momencie niektóre sterowniki zwracają błędy składniowe i semantyczne.

Jeśli źródło danych nie obsługuje przygotowania instrukcji, sterownik musi emulować go w możliwym zakresie. Na przykład sterownik może nic nie robić, gdy wywoływana jest funkcja SQLPrepare , a następnie wykonać bezpośrednie wykonanie instrukcji, gdy jest wywoływana funkcja SQLExecute .

Jeśli źródło danych obsługuje sprawdzanie składni bez wykonywania, sterownik może przesłać instrukcję sprawdzania, kiedy program SQLPrepare jest wywoływany i przesyłać instrukcję do wykonania, gdy jest wywoływana funkcja SQLExecute .

Jeśli sterownik nie może emulować przygotowania instrukcji, przechowuje instrukcję, gdy program SQLPrepare jest wywoływany i przesyła go do wykonania, gdy jest wywoływana funkcja SQLExecute .

Ponieważ przygotowanie emulowanej instrukcji nie jest idealne, funkcja SQLExecute może zwracać wszelkie błędy, które są zwykle zwracane przez narzędzie SQLPrepare.