SQLFreeHandle Function
Conformità
Versione introdotta: Conformità agli standard ODBC 3.0: ISO 92
Riepilogo
SQLFreeHandle libera le risorse associate a un ambiente, una connessione, un'istruzione o un handle descrittore specifico.
Nota
Questa funzione è una funzione generica per liberare handle. Sostituisce le funzioni ODBC 2.0 SQLFreeConnect (per liberare un handle di connessione) e SQLFreeEnv (per liberare un handle di ambiente). SQLFreeConnect e SQLFreeEnv sono entrambi deprecati in ODBC 3*.x*. SQLFreeHandle sostituisce anche la funzione ODBC 2.0 SQLFreeStmt (con l'opzione SQL_DROP) per liberare un handle di istruzione. Per altre informazioni, vedere "Commenti". Per altre informazioni sul mapping di questa funzione a quando un'applicazione ODBC 3*.x* utilizza un driver ODBC 2*.x*, vedere Mapping di funzioni di sostituzione per compatibilità con le versioni precedenti delle applicazioni.
Sintassi
SQLRETURN SQLFreeHandle(
SQLSMALLINT HandleType,
SQLHANDLE Handle);
Argomenti
HandleType
[Input] Tipo di handle da liberare da SQLFreeHandle. Deve essere uno dei valori seguenti:
SQL_HANDLE_DBC
SQL_HANDLE_DBC_INFO_TOKEN
SQL_HANDLE_DESC
SQL_HANDLE_ENV
SQL_HANDLE_STMT
SQL_HANDLE_DBC_INFO_TOKEN handle viene usato solo da Gestione driver e driver. Le applicazioni non devono usare questo tipo di handle. Per altre informazioni sulle SQL_HANDLE_DBC_INFO_TOKEN, vedere Sviluppo di consapevolezza del pool di connessioni in un driver ODBC.
Se HandleType non è uno di questi valori, SQLFreeHandle restituisce SQL_INVALID_HANDLE.
Handle
[Input] Handle da liberare.
Resi
SQL_SUCCESS, SQL_ERROR o SQL_INVALID_HANDLE.
Se SQLFreeHandle restituisce SQL_ERROR, l'handle è ancora valido.
Diagnostica
Quando SQLFreeHandle restituisce SQL_ERROR, è possibile ottenere un valore SQLSTATE associato dalla struttura dei dati di diagnostica per l'handle che SQLFreeHandle ha tentato di liberare ma non è stato possibile. La tabella seguente elenca i valori SQLSTATE restituiti in genere da SQLFreeHandle e ne spiega ognuno nel contesto di questa funzione. La notazione "(DM)" precede le descrizioni di SQLSTATEs restituite da Gestione driver. Il codice restituito associato a ogni valore SQLSTATE è SQL_ERROR, a meno che non sia specificato diversamente.
SQLSTATE | Errore | Descrizione |
---|---|---|
HY000 | Errore generale: | Si è verificato un errore per il quale non è stato specificato SQLSTATE e per il quale non è stato definito alcun SQLSTATE specifico dell'implementazione. Il messaggio di errore restituito da SQLGetDiagRec nel buffer *MessageText descrive l'errore e la relativa causa. |
HY001 | Errore di allocazione della memoria | Il driver non è riuscito ad allocare memoria necessaria per supportare l'esecuzione o il completamento della funzione. |
HY010 | Errore della sequenza di funzioni | (DM) L'argomento HandleType è stato SQL_HANDLE_ENV e almeno una connessione era allocata o connessa. È necessario chiamare SQLDisconnect e SQLFreeHandle con handleType di SQL_HANDLE_DBC per ogni connessione prima di chiamare SQLFreeHandle con handleType di SQL_HANDLE_ENV. (DM) L'argomento HandleType è stato SQL_HANDLE_DBC e la funzione è stata chiamata prima di chiamare SQLDisconnect per la connessione. (DM) L'argomento HandleType è stato SQL_HANDLE_DBC. Una funzione in esecuzione asincrona è stata chiamata con Handle e la funzione era ancora in esecuzione quando è stata chiamata questa funzione. (DM) L'argomento HandleType è stato SQL_HANDLE_STMT. SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos è stato chiamato con l'handle di istruzione e restituito SQL_NEED_DATA. Questa funzione è stata chiamata prima dell'invio dei dati per tutti i parametri o le colonne data-at-execution. (DM) L'argomento HandleType è stato SQL_HANDLE_STMT. È stata chiamata una funzione in esecuzione asincrona sull'handle di istruzione o sull'handle di connessione associato e la funzione era ancora in esecuzione quando è stata chiamata questa funzione. (DM) L'argomento HandleType è stato SQL_HANDLE_DESC. È stata chiamata una funzione in esecuzione asincrona sull'handle di connessione associato; e la funzione era ancora in esecuzione quando questa funzione è stata chiamata. (DM) Tutti gli handle sussidiari e altre risorse non sono stati rilasciati prima della chiamata di SQLFreeHandle . (DM) SQLExecute, SQLExecDirect o SQLMoreResults è stato chiamato per uno degli handle di istruzione associati a Handle e HandleType è stato impostato su SQL_HANDLE_STMT o SQL_HANDLE_DESC restituito SQL_PARAM_DATA_AVAILABLE. Questa funzione è stata chiamata prima del recupero dei dati per tutti i parametri trasmessi. |
HY013 | Errore di gestione della memoria | L'argomento HandleType è stato SQL_HANDLE_STMT o SQL_HANDLE_DESC e non è stato possibile elaborare la chiamata di funzione perché non è stato possibile accedere agli oggetti di memoria sottostanti, probabilmente a causa di condizioni di memoria insufficiente. |
HY017 | Uso non valido di un handle descrittore allocato automaticamente. | (DM) L'argomento Handle è stato impostato sull'handle per un descrittore allocato automaticamente. |
HY117 | La connessione viene sospesa a causa dello stato sconosciuto della transazione. Sono consentite solo funzioni disconnesse e di sola lettura. | (DM) Per altre informazioni sullo stato sospeso, vedere Funzione SQLEndTran. |
HYT01 | Il timeout della connessione è scaduto | Periodo di timeout della connessione scaduto prima che l'origine dati rispondesse alla richiesta. Il periodo di timeout della connessione viene impostato tramite SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Il driver non supporta questa funzione | (DM) L'argomento HandleType è stato SQL_HANDLE_DESC e il driver era un driver ODBC 2*.x*. (DM) L'argomento HandleType è stato SQL_HANDLE_STMT e il driver non era un driver ODBC valido. |
Commenti
SQLFreeHandle viene usato per liberare handle per ambienti, connessioni, istruzioni e descrittori, come descritto nelle sezioni seguenti. Per informazioni generali sugli handle, vedere Handle.
Un'applicazione non deve usare un handle dopo che è stato liberato; Gestione driver non controlla la validità di un handle in una chiamata di funzione.
Liberare un handle di ambiente
Prima di chiamare SQLFreeHandle con handleType di SQL_HANDLE_ENV, un'applicazione deve chiamare SQLFreeHandle con handleType di SQL_HANDLE_DBC per tutte le connessioni allocate nell'ambiente. In caso contrario, la chiamata a SQLFreeHandle restituisce SQL_ERROR e l'ambiente e qualsiasi connessione attiva rimane valida. Per altre informazioni, vedere Handle di ambiente e allocazione dell'handle di ambiente.
Se l'ambiente è un ambiente condiviso, l'applicazione che chiama SQLFreeHandle con handleType di SQL_HANDLE_ENV non ha più accesso all'ambiente dopo la chiamata, ma le risorse dell'ambiente non vengono necessariamente liberate. La chiamata a SQLFreeHandle decrementa il conteggio dei riferimenti dell'ambiente. Il conteggio dei riferimenti viene gestito da Gestione driver. Se non raggiunge zero, l'ambiente condiviso non viene liberato perché viene ancora usato da un altro componente. Se il conteggio dei riferimenti raggiunge zero, le risorse dell'ambiente condiviso vengono liberate.
Liberare un handle di connessione
Prima di chiamare SQLFreeHandle con handleType di SQL_HANDLE_DBC, un'applicazione deve chiamare SQLDisconnect per la connessione se è presente una connessione in questo handle*.* In caso contrario, la chiamata a SQLFreeHandle restituisce SQL_ERROR e la connessione rimane valida.
Per altre informazioni, vedere Handle di connessione e disconnessione da un'origine dati o un driver.
Rilascio di un handle di istruzione
Una chiamata a SQLFreeHandle con handleType di SQL_HANDLE_STMT libera tutte le risorse allocate da una chiamata a SQLAllocHandle con handleType di SQL_HANDLE_STMT. Quando un'applicazione chiama SQLFreeHandle per liberare un'istruzione con risultati in sospeso, i risultati in sospeso vengono eliminati. Quando un'applicazione libera un handle di istruzione, il driver libera i quattro descrittori allocati automaticamente associati a tale handle. Per altre informazioni, vedere Handle di istruzioni e liberamento di un handle di istruzione.
Si noti che SQLDisconnect elimina automaticamente tutte le istruzioni e i descrittori aperti nella connessione.
Liberare un handle del descrittore
Una chiamata a SQLFreeHandle con handleTypedi SQL_HANDLE_DESC libera l'handle del descrittore in Handle. La chiamata a SQLFreeHandle non rilascia memoria allocata dall'applicazione a cui può fare riferimento un campo puntatore (inclusi SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR e SQL_DESC_OCTET_LENGTH_PTR) di qualsiasi record descrittore di Handle. La memoria allocata dal driver per i campi che non sono campi puntatore viene liberata quando l'handle viene liberato. Quando viene liberato un handle di descrittore allocato dall'utente, tutte le istruzioni associate all'handle liberato sono state associate al ripristino dei rispettivi handle del descrittore allocati automaticamente.
Nota
I driver ODBC 2*.x* non supportano la liberazione degli handle del descrittore, così come non supportano l'allocazione degli handle del descrittore.
Si noti che SQLDisconnect elimina automaticamente tutte le istruzioni e i descrittori aperti nella connessione. Quando un'applicazione libera un handle di istruzione, il driver libera tutti i descrittori generati automaticamente associati a tale handle.
Per altre informazioni sui descrittori, vedere Descrittori.
Esempio di codice
Per altri esempi di codice, vedere SQLBrowseConnect e SQLConnect.
Codice
// SQLFreeHandle.cpp
// compile with: user32.lib odbc32.lib
#include <windows.h>
#include <sqlext.h>
#include <stdio.h>
int main() {
SQLRETURN retCode;
HWND desktopHandle = GetDesktopWindow(); // desktop's window handle
SQLCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen;
// Initialize the environment, connection, statement handles.
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
// Allocate the environment.
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set environment attributes.
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, -1);
// Allocate the connection.
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// Set the login timeout.
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);
// Let the user select the data source and connect to the database.
retCode = SQLDriverConnect(hdbc, desktopHandle, (SQLCHAR *)"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// Free handles, and disconnect.
if (hstmt) {
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
hstmt = NULL;
}
if (hdbc) {
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
hdbc = NULL;
}
if (henv) {
SQLFreeHandle(SQL_HANDLE_ENV, henv);
henv = NULL;
}
}
Funzioni correlate
Per informazioni su | Vedere |
---|---|
Allocazione di un handle | Funzione SQLAllocHandle |
Annullamento dell'elaborazione delle istruzioni | Funzione SQLCance |
Impostazione di un nome di cursore | Funzione SQLSetCursorName |
Vedi anche
Riferimento API ODBC
File di intestazione ODBC
Programma di esempio ODBC