Teilen über


SQLCancel-Funktion

Konformität
Version eingeführt: ODBC 1.0 Standards Compliance: ISO 92

Zusammenfassung
SQLCancel bricht die Verarbeitung für eine Anweisung ab.

Verwenden Sie die SQLCancelHandle-Funktion, um die Verarbeitung für eine Verbindung oder Anweisung abzubrechen.

Syntax

  
SQLRETURN SQLCancel(  
     SQLHSTMT     StatementHandle);  

Argumente

StatementHandle
[Eingabe] Anweisungshandle.

Gibt zurück

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR oder SQL_INVALID_HANDLE.

Diagnostik

Wenn SQLCancel SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugeordneter SQLSTATE-Wert durch Aufrufen von SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle of StatementHandle abgerufen werden. In der folgenden Tabelle sind die sqlSTATE-Werte aufgeführt, die häufig von SQLCancel zurückgegeben werden, und jede wird im Kontext dieser Funktion erläutert. Die Notation "(DM)" steht vor den Beschreibungen von SQLSTATEs, die vom Treiber-Manager zurückgegeben werden. Der rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben.

SQLSTATE Error Beschreibung
01000 Allgemeiner Warnhinweis Treiberspezifische Informationsmeldung. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
HY000 Allgemeiner Fehler Es ist ein Fehler aufgetreten, für den kein spezifischer SQLSTATE-Wert vorhanden war und für den keine implementierungsspezifische SQLSTATE definiert wurde. Die von SQLGetDiagRec im Argument *MessageText-Puffer zurückgegebene Fehlermeldung beschreibt den Fehler und seine Ursache.
HY001 Speicherzuweisungsfehler Der Treiber konnte speicher nicht zuordnen, der erforderlich ist, um die Ausführung oder den Abschluss der Funktion zu unterstützen.
HY010 Funktionssequenzfehler (DM) Eine asynchron ausgeführte Funktion wurde für den Verbindungshandle aufgerufen, der dem StatementHandle zugeordnet ist. Diese asynchrone Funktion wurde noch ausgeführt, als die SQLCancel-Funktion aufgerufen wurde.

(DM) Fehler beim Abbrechen des Vorgangs, da ein asynchroner Vorgang in einem Verbindungshandle ausgeführt wird, das mit "StatementHandle" verknüpft ist.
HY013 Speicherverwaltungsfehler Der Funktionsaufruf konnte nicht verarbeitet werden, da auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund geringer Arbeitsspeicherbedingungen.
HY018 Anforderung für abgelehnte Serverabbruch Der Server hat die Kündigungsanforderung abgelehnt.
HY117 Die Verbindung wird aufgrund des unbekannten Transaktionsstatus angehalten. Es sind nur Trenn- und schreibgeschützte Funktionen zulässig. (DM) Weitere Informationen zum angehaltenen Zustand finden Sie unter SQLEndTran Function.
HYT01 Verbindungstimeout abgelaufen Der Zeitraum für das Verbindungstimeout ist abgelaufen, bevor die Datenquelle auf die Anforderung geantwortet hat. Der Verbindungstimeoutzeitraum wird über SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT festgelegt.
IM001 Dieser Treiber unterstützt diese Funktion nicht. (DM) Der dem StatementHandle zugeordnete Treiber unterstützt die Funktion nicht.

Kommentare

SQLCancel kann die folgenden Verarbeitungstypen für eine Anweisung abbrechen:

  • Eine Funktion, die asynchron für die Anweisung ausgeführt wird.

  • Eine Funktion für eine Anweisung, die Daten benötigt.

  • Eine Funktion, die für die Anweisung in einem anderen Thread ausgeführt wird.

In ODBC 2.x, wenn eine Anwendung SQLCancel aufruft, wenn keine Verarbeitung für die Anweisung erfolgt, hat SQLCancel dieselbe Auswirkung wie SQLFreeStmt mit der Option SQL_CLOSE; dieses Verhalten wird nur für Vollständigkeit definiert, und Anwendungen sollten SQLFreeStmt oder SQLCloseCursor aufrufen, um Cursor zu schließen.

Wenn SQLCancel aufgerufen wird, um eine Funktion abzubrechen, die asynchron in einer Anweisung oder einer Funktion für eine Anweisung ausgeführt wird, die Daten benötigt, werden diagnosedatensätze, die von der abgebrochenen Funktion gepostet wurden, gelöscht, und SQLCancel stellt eigene Diagnosedatensätze bereit. Wenn SQLCancel aufgerufen wird, um eine Funktion abzubrechen, die auf einer Anweisung in einem anderen Thread ausgeführt wird, werden die Diagnosedatensätze der abgebrochenen Funktion jedoch nicht gelöscht und keine eigenen Diagnosedatensätze veröffentlicht.

Abbrechen der asynchronen Verarbeitung

Nachdem eine Anwendung eine Funktion asynchron aufgerufen hat, wird die Funktion wiederholt aufgerufen, um festzustellen, ob die Verarbeitung abgeschlossen ist. Wenn die Funktion noch verarbeitet wird, wird SQL_STILL_EXECUTING zurückgegeben. Wenn die Verarbeitung der Funktion abgeschlossen ist, wird ein anderer Code zurückgegeben.

Nach einem Aufruf der Funktion, die SQL_STILL_EXECUTING zurückgibt, kann eine Anwendung SQLCancel aufrufen, um die Funktion abzubrechen. Wenn die Abbrechenanforderung erfolgreich ist, gibt der Treiber SQL_SUCCESS zurück. Diese Meldung weist nicht darauf hin, dass die Funktion tatsächlich abgebrochen wurde. sie gibt an, dass die Abbruchanforderung verarbeitet wurde. Wenn die Funktion tatsächlich abgebrochen wird, ist treiberabhängig und datenquellenabhängig. Die Anwendung muss die ursprüngliche Funktion weiterhin aufrufen, bis der Rückgabecode nicht SQL_STILL_EXECUTING ist. Wenn die Funktion erfolgreich abgebrochen wurde, ist der Rückgabecode SQL_ERROR und SQLSTATE HY008 (Vorgang abgebrochen). Wenn die Funktion die normale Verarbeitung abgeschlossen hat, wird der Rückgabecode SQL_SUCCESS oder SQL_SUCCESS_WITH_INFO, wenn die Funktion erfolgreich war oder SQL_ERROR und ein anderer SQLSTATE-Wert als HY008 (Vorgang abgebrochen) ist, wenn die Funktion fehlgeschlagen ist.

Hinweis

In ODBC 3.5 wird ein Aufruf von SQLCancel , wenn keine Verarbeitung für die Anweisung ausgeführt wird, nicht als SQLFreeStmt mit der Option SQL_CLOSE behandelt, hat aber überhaupt keine Auswirkung. Zum Schließen eines Cursors sollte eine Anwendung SQLCloseCursor aufrufen, nicht SQLCancel.

Weitere Informationen zur asynchronen Verarbeitung finden Sie unter "Asynchrone Ausführung".

Abbrechen von Funktionen, die Daten benötigen

Nachdem SQLExecute oder SQLExecDirect SQL_NEED_DATA zurückgegeben haben und bevor Daten für alle Daten bei ausführungsparametern gesendet wurden, kann eine Anwendung SQLCancel aufrufen, um die Ausführung der Anweisung abzubrechen. Nachdem die Anweisung abgebrochen wurde, kann die Anwendung SQLExecute oder SQLExecDirect erneut aufrufen. Weitere Informationen finden Sie unter SQLBindParameter.

Nachdem SQLBulkOperations oder SQLSetPos SQL_NEED_DATA und bevor Daten für alle Daten bei ausführungsspalten gesendet wurden, kann eine Anwendung SQLCancel aufrufen, um den Vorgang abzubrechen. Nachdem der Vorgang abgebrochen wurde, kann die Anwendung SQLBulkOperations oder SQLSetPos erneut aufrufen. Das Abbrechen wirkt sich nicht auf den Cursorzustand oder die aktuelle Cursorposition aus. Weitere Informationen finden Sie unter SQLBulkOperations oder SQLSetPos.

Abbrechen von Funktionen, die in einem anderen Thread ausgeführt werden

In einer Multithreadanwendung kann die Anwendung eine Funktion abbrechen, die auf einem anderen Thread ausgeführt wird. Um die Funktion abzubrechen, ruft die Anwendung SQLCancel mit demselben Anweisungshandle auf, das von der Zielfunktion verwendet wird, aber in einem anderen Thread. Wie die Funktion abgebrochen wird, hängt vom Treiber und vom Betriebssystem ab. Wie beim asynchronen Abbrechen einer Funktion gibt der Rückgabecode von SQLCancel nur an, ob der Treiber die Anforderung erfolgreich verarbeitet hat. Nur SQL_SUCCESS oder SQL_ERROR können zurückgegeben werden; es werden keine Diagnoseinformationen zurückgegeben. Wenn die ursprüngliche Funktion abgebrochen wird, wird SQL_ERROR und SQLSTATE HY008 (Vorgang abgebrochen) zurückgegeben.

Wenn eine SQL-Anweisung ausgeführt wird, wenn SQLCancel auf einem anderen Thread aufgerufen wird, um die Ausführung der Anweisung abzubrechen, ist es möglich, dass die Ausführung erfolgreich ist und SQL_SUCCESS zurückgegeben wird, während der Abbruch ebenfalls erfolgreich ist. In diesem Fall geht der Treiber-Manager davon aus, dass der durch die Anweisung geöffnete Cursor durch den Cancel geschlossen wird, sodass die Anwendung den Cursor nicht verwenden kann.

Weitere Informationen zum Threading finden Sie unter Multithreading.

Weitere Informationen zu Siehe
Binden eines Puffers an einen Parameter SQLBindParameter-Funktion
Ausführen von Masseneinfüge- oder Aktualisierungsvorgängen SQLBulkOperations-Funktion
Bricht eine Funktion ab, die asynchron auf einem Verbindungshandle ausgeführt wird, zusätzlich zur Funktionalität von SQLCancel. SQLCancelHandle-Funktion
Ausführen einer SQL-Anweisung SQLExecDirect-Funktion
Ausführen einer vorbereiteten SQL-Anweisung SQLExecute-Funktion
Freigeben eines Anweisungshandles SQLFreeStmt
Abrufen eines Felds eines Diagnosedatensatzes oder eines Felds des Diagnoseheaders SQLGetDiagField-Funktion
Abrufen mehrerer Felder einer Diagnosedatenstruktur SQLGetDiagRec-Funktion
Zurückgeben des nächsten Parameters zum Senden von Daten für SQLParamData-Funktion
Senden von Parameterdaten zur Ausführungszeit SQLPutData-Funktion
Positionieren des Cursors in einem Rowset, Aktualisieren von Daten im Rowset oder Aktualisieren oder Löschen von Daten im Resultset SQLSetPos-Funktion

Weitere Informationen

ODBC-API-Referenz
ODBC-Headerdateien