Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zgodność
Wersja wprowadzona: Zgodność ze standardami ODBC 1.0: ISO 92
Podsumowanie
SQLCancel anuluje przetwarzanie wyciągu.
Aby anulować przetwarzanie połączenia lub instrukcji, użyj funkcji SQLCancelHandle.
Syntax
SQLRETURN SQLCancel(
SQLHSTMT StatementHandle);
Arguments
StatementHandle
[Dane wejściowe] Uchwyt instrukcji.
Zwroty
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR lub SQL_INVALID_HANDLE.
Diagnostyka
Gdy SQLCancel zwraca SQL_ERROR lub SQL_SUCCESS_WITH_INFO, można uzyskać powiązaną wartość SQLSTATE, wywołując SQLGetDiagRec z HandleType SQL_HANDLE_STMT oraz HandleStatementHandle. Poniższa tabela przedstawia wartości SQLSTATE najczęściej zwracane przez SQLCancel i wyjaśnia każdą z nich w kontekście tej funkcji; notacja "(DM)" poprzedza opisy stanów SQL zwracanych przez Menedżera Sterowników. Kod zwracany skojarzony z każdą wartością SQLSTATE jest SQL_ERROR, chyba że określono inaczej.
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | Ostrzeżenie ogólne | Komunikat informacyjny specyficzny dla sterownika. (Funkcja zwraca SQL_SUCCESS_WITH_INFO). |
| HY000 | Błąd ogólny | Wystąpił błąd, dla którego nie było określonego stanu SQLSTATE i dla którego nie zdefiniowano parametru SQLSTATE specyficznego dla implementacji. Komunikat o błędzie zwrócony przez SQLGetDiagRec w argumentze *MessageText buffer opisuje błąd i jego przyczynę. |
| HY001 | Błąd alokacji pamięci | Sterownik nie może przydzielić pamięci wymaganej do obsługi wykonywania lub ukończenia funkcji. |
| HY010 | Błąd sekwencji funkcji | (DM) Asynchronicznie wykonywana funkcja została wywołana dla dojścia połączenia skojarzonego z instrukcją StatementHandle. Ta asynchroniczna funkcja była nadal wykonywana, gdy wywoływano funkcję SQLCancel . (DM) Operacja anulowania zakończyła się niepowodzeniem, ponieważ na uchwytie połączenia powiązanym z CommandHandle trwa operacja asynchroniczna. |
| HY013 | Błąd zarządzania pamięcią | Nie można przetworzyć wywołania funkcji, ponieważ nie można uzyskać dostępu do bazowych obiektów pamięci, prawdopodobnie z powodu niskich warunków pamięci. |
| HY018 | Serwer odrzucił prośbę o anulowanie | Serwer odrzucił prośbę o anulowanie. |
| HY117 | Połączenie jest zawieszone z powodu nieznanego stanu transakcji. Dozwolone są tylko funkcje rozłączania i tylko do odczytu. | (DM) Aby uzyskać więcej informacji na temat stanu wstrzymania, zobacz SQLEndTran, funkcja. |
| HYT01 | Upłynął limit czasu połączenia | Okres przekroczenia limitu czasu połączenia wygasł, zanim źródło danych odpowiedziało na żądanie. Limit czasu połączenia jest ustawiany za pomocą parametru SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
| IM001 | Sterownik nie obsługuje tej funkcji | (DM) Sterownik skojarzony z instrukcją StatementHandle nie obsługuje funkcji. |
Comments
SQLCancel może anulować następujące typy przetwarzania na wyrażeniu:
Funkcja działająca asynchronicznie na tym zaleceniu.
Funkcja na kontucie, która potrzebuje danych.
Funkcja działająca na instrukcji w innym wątku.
W ODBC 2. x, jeśli aplikacja wywoła SQLCancel , gdy nie odbywa się żadnego przetwarzania na żądaniu, SQLCancel ma taki sam efekt jak SQLFreeStmt z opcją SQL_CLOSE; to zachowanie jest definiowane wyłącznie dla zupełności i aplikacje powinny wywoływać SQLFreeStmt lub SQLCloseCursor , aby zamknąć kursory.
Gdy SQLCancel zostaje wywołany w celu anulowania funkcji działającej asynchronicznie w instrukcji lub funkcji na instrukcji wymagającej danych, rekordy diagnostyczne zamieszczone przez anulowaną funkcję są czyszczone, a SQLCancel publikuje własne rekordy diagnostyczne; gdy SQLCancel zostaje wywołany w celu anulowania funkcji działającej na innej instrukcji w innym wątku, nie usuwa on rejestrów diagnostycznych funkcji anulowanej i nie publikuje własnych rekordów diagnostycznych.
Anulowanie przetwarzania asynchronicznego
Po asynchronicznym wywołaniu funkcji przez aplikację, wywołuje ją wielokrotnie, aby sprawdzić, czy zakończyła przetwarzanie. Jeśli funkcja nadal przetwarza, zwraca SQL_STILL_EXECUTING. Jeśli funkcja zakończyła przetwarzanie, zwraca inny kod.
Po każdym wywołaniu funkcji, które zwraca SQL_STILL_EXECUTING, aplikacja może wywołać SQLCancel , aby anulować tę funkcję. Jeśli żądanie anulowania zakończy się sukcesem, sterownik zwraca SQL_SUCCESS. Ten komunikat nie wskazuje, że funkcja została rzeczywiście anulowana; wskazuje, że żądanie anulowania zostało przetworzone. To, czy funkcja faktycznie zostanie anulowana, zależy od sterownika i źródła danych. Aplikacja musi kontynuować wywoływanie oryginalnej funkcji, dopóki kod zwrotny nie zostanie SQL_STILL_EXECUTING. Jeśli funkcja została pomyślnie anulowana, kod zwrotny to SQL_ERROR oraz SQLSTATE HY008 (Operacja anulowana). Jeśli funkcja zakończyła normalne przetwarzanie, kod zwrotny to SQL_SUCCESS lub SQL_SUCCESS_WITH_INFO jeśli funkcja zakończyła się sukcesem lub SQL_ERROR oraz stan SQL inny niż HY008 (Operacja anulowana), jeśli funkcja zawiodła.
Note
W ODBC 3.5 wywołanie do SQLCancel , gdy nie jest wykonywane żadne przetwarzanie wyroku, nie jest traktowane jako SQLFreeStmt z opcją SQL_CLOSE, ale nie ma żadnego efektu. Aby zamknąć kursor, aplikacja powinna wywołać metodę SQLCloseCursor, a nie SQLCancel.
Więcej informacji o przetwarzaniu asynchronicznym można znaleźć w artykule Asynchronous Execution.
Anulowanie funkcji wymagających danych
Po zwrotach SQLExecute lub SQLExecDirect SQL_NEED_DATA i przed wysłaniem danych dla wszystkich parametrów danych przy wykonaniu, aplikacja może wywołać SQLCancel , aby anulować wykonanie polecenia. Po anulowaniu instrukcji aplikacja może ponownie wywołać SQLExecute lub SQLExecDirect . Więcej informacji można znaleźć w SQLBindParametr.
Po zwróceniu SQL_NEED_DATA SQLBulkOperations lub SQLSetPos i przed wysłaniem danych dla wszystkich kolumn danych podczas wykonywania, aplikacja może wywołać SQLCancel , aby anulować operację. Po anulowaniu operacji aplikacja może ponownie wywołać SQLBulkOperations lub SQLSetPos ; Anulowanie nie wpływa na stan kursora ani na aktualną pozycję kursora. Więcej informacji można znaleźć w SQLBulkOperations lub SQLSetPos.
Funkcje anulujące wykonywane na innym wątku
W aplikacji wielowątkowej aplikacja może anulować funkcję działającą na innym wątku. Aby anulować funkcję, aplikacja wywołuje SQLCancel z tym samym uchwytem instrukcji, który używany jest przez funkcję docelową, ale w innym wątku. Sposób anulowania funkcji zależy od sterownika i systemu operacyjnego. Podobnie jak przy anulowaniu funkcji działającej asynchronicznie, kod powrotny SQLCancel wskazuje jedynie, czy sterownik pomyślnie przetworzył żądanie. Tylko SQL_SUCCESS lub SQL_ERROR można zwrócić; Nie otrzymujemy żadnych informacji diagnostycznych. Jeśli oryginalna funkcja zostanie anulowana, zwraca SQL_ERROR oraz SQLSTATE HY008 (Operacja anulowana).
Jeśli wykonywane jest polecenie SQL podczas wywoływania SQLCancel w innym wątku w celu anulowania wykonania instrukcji, możliwe jest, że wykonanie zakończy się sukcesem i zwróci SQL_SUCCESS podczas gdy anulowanie również jest skuteczne. W takim przypadku Driver Manager zakłada, że kursor otwarty przez wykonanie instrukcji jest zamknięty przez cancel, więc aplikacja nie będzie mogła użyć kursora.
Więcej informacji o wątkowaniu można znaleźć w artykule Multithreading.
Powiązane funkcje
| Aby uzyskać informacje o | Zobacz |
|---|---|
| Powiązanie bufora z parametrem | Funkcja SQLBindParameter |
| Wykonywanie operacji wstawiania lub aktualizacji masowej | Funkcja SQLBulkOperations |
| Anuluje funkcję działającą asynchronicznie na uchwytie połączenia, oprócz funkcjonalności SQLCancel. | Funkcja SQLCancelHandle |
| Wykonywanie instrukcji SQL | Funkcja SQLExecDirect |
| Wykonywanie przygotowanej instrukcji SQL | SQLExecute, funkcja |
| Uwalnianie uchwytu instrukcji | Sqlfreestmt |
| Uzyskanie pola w rekordzie diagnostycznym lub pola nagłówka diagnostycznego | Funkcja SQLGetDiagField |
| Uzyskiwanie wielu pól struktury danych diagnostycznych | funkcji SQLGetDiagRec |
| Zwracanie następnego parametru w celu wysłania danych dla | SQLParamData, funkcja |
| Wysyłanie danych parametrów w czasie wykonywania | SQLPutData, funkcja |
| Ustawianie kursora w wierszu, odświeżanie danych w wierszu lub aktualizacja lub usuwanie danych w zbiorze wyników | Funkcja SQLSetPos |