SQLFreeStmt-Funktion

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

Summary
SQLFreeStmt stoppt die Verarbeitung, die mit einer bestimmten Anweisung verbunden ist, schließt alle offenen Cursor, die mit der Anweisung verbunden sind, verworfen ausstehende Ergebnisse oder freigibt optional alle mit dem Anweisungshandle verbundenen Ressourcen.

Syntax

  
SQLRETURN SQLFreeStmt(  
     SQLHSTMT       StatementHandle,  
     SQLUSMALLINT   Option);  

Argumente

StatementHandle
[Eingabe] Anweisungshandle

Auswahl
[Eingabe] Eine der folgenden Optionen:

SQL_ CLOSE: Schließt den mit StatementHandle verbundenen Cursor (falls einer definiert war) und verwirft alle ausstehenden Ergebnisse. Die Anwendung kann diesen Cursor später wieder öffnen, indem sie eine SELECT-Anweisung erneut mit denselben oder anderen Parameterwerten ausführt. Wenn kein Cursor offen ist, hat diese Option keine Auswirkungen auf die Anwendung. SQLCloseCursor kann auch aufgerufen werden, um einen Cursor zu schließen. Weitere Informationen finden Sie unter Schließen des Cursors.

SQL_DROP: Diese Option ist eingestellt. Ein Aufruf zu SQLFreeStmt mit der Option SQL_DROP wird im Treibermanager auf SQLFreeHandle abgebildet.

SQL_UNBIND: Setzt das SQL_DESC_COUNT Feld der ARD auf 0 und gibt alle durch SQLBindCol gebundenen Spaltenpuffer für das gegebene StatementHandle frei. Dies entbindet die Lesezeichenspalte nicht; dazu wird das SQL_DESC_DATA_PTR Feld der ARD für die Lesezeichenspalte auf NULL gesetzt. Beachten Sie, dass, wenn diese Operation auf einem explizit zugewiesenen Deskriptor ausgeführt wird, der von mehreren Anweisungen geteilt wird, die Operation die Bindungen aller Anweisungen beeinflusst, die den Deskriptor teilen. Weitere Informationen finden Sie unter Überblick über das Abrufen von Ergebnissen (Basic).

SQL_RESET_PARAMS: Setzt das SQL_DESC_COUNT Feld der APD auf 0 und gibt alle von SQLBindParameter für den gegebenen StatementHandle gesetzten Parameterpuffer frei. Wenn diese Operation auf einem explizit zugewiesenen Deskriptor ausgeführt wird, der von mehreren Anweisungen geteilt wird, beeinflusst sie die Bindungen aller Aussagen, die den Deskriptor teilen. Weitere Informationen finden Sie unter Bindungsparameter.

Rücklieferungen

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR oder SQL_INVALID_HANDLE.

Diagnostics

Wenn SQLFreeStmt SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugehöriger SQLSTATE-Wert erhalten werden, indem SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle von StatementHandle aufgerufen wird. Die folgende Tabelle listet die SQLSTATE-Werte auf, die typischerweise von SQLFreeStmt zurückgegeben werden, und erklärt jeden einzelnen im Kontext dieser Funktion; die Notation "(DM)" geht den vom Treibermanager zurückgegebenen SQLSTATE-Beschreibungen voraus. Der rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben.

SQLSTATE Fehler Description
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 *MessageText-Puffer zurückgegebene Fehlermeldung beschreibt den Fehler und dessen 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 lief noch, als SQLFreeStmt aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect oder SQLMoreResults wurde für " StatementHandle " aufgerufen und SQL_PARAM_DATA_AVAILABLE zurückgegeben. Diese Funktion wurde mit der Option auf SQL_RESET_PARAMS aufgerufen, bevor die Daten für alle gestreamten Parameter abgerufen wurden.

(DM) Eine asynchron ausgeführte Funktion wurde für " StatementHandle " aufgerufen und wurde noch ausgeführt, als diese Funktion aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations oder SQLSetPos wurde für " StatementHandle " aufgerufen und SQL_NEED_DATA zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle Daten bei ausführungsparametern oder -spalten gesendet wurden.
HY013 Speicherverwaltungsfehler Der Funktionsaufruf konnte nicht verarbeitet werden, da auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund geringer Arbeitsspeicherbedingungen.
HY092 Optionstyp außerhalb des Reichweitens (DM) Der für das Argument Option angegebene Wert war nicht:

SQL_CLOSE SQL_DROP SQL_UNBIND SQL_RESET_PARAMS
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

Das Aufrufen von SQLFreeStmt mit der SQL_CLOSE-Option entspricht dem Aufruf von SQLCloseCursor, außer dass SQLFreeStmt mit SQL_CLOSE die Anwendung nicht beeinflusst, wenn kein Cursor auf der Anweisung geöffnet ist. Wenn kein Cursor offen ist, gibt ein Aufruf von SQLCloseCursor SQLSTATE 24000 (Invalid Cursor State) zurück.

Eine Anwendung sollte keinen Anweisungshandle mehr verwenden, nachdem sie freigegeben wurde; prüft der Driver Manager nicht die Gültigkeit eines Handles in einem Funktionsaufruf.

Example

Es ist eine gute Programmiermethode, Handles freizumachen. Der Einfachheit halber enthält das folgende Beispiel jedoch keinen Code, der zugewiesene Handles freigibt. Ein Beispiel dafür, wie man Handles freisetzt, siehe SQLFreeHandle Function.

// SQLFreeStmt.cpp  
// compile with: user32.lib odbc32.lib  
#include <windows.h>  
#include <sqlext.h>  
  
int main() {  
   // declare and initialize the environment, connection, statement handles  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   SQLRETURN retCode;  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen;  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, (SQLCHAR *)"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1024 + 1, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
   retCode = SQLFreeStmt(hstmt, SQL_UNBIND);  
   retCode = SQLFreeStmt(hstmt, SQL_RESET_PARAMS);  
}  
Weitere Informationen zu Siehe
Zuweisung eines Handles SQLAllocHandle-Funktion
Abbrechen der Verarbeitung von Anweisungen SQLCancel-Funktion
Schließen eines Cursors SQLCloseCursor-Funktion
Einen Griff freigeben SQLFreeHandle-Funktion
Festlegen eines Cursornamens SQLSetCursorName-Funktion