Handle

Gli handle sono valori opachi a 32 bit che identificano un particolare elemento; in ODBC, questo elemento può essere un ambiente, una connessione, un'istruzione o un descrittore. Quando l'applicazione chiama SQLAllocHandle, Gestione driver o il driver crea un nuovo elemento del tipo specificato e ne restituisce l'handle all'applicazione. In seguito, l'applicazione utilizza l'handle per identificare l'elemento quando chiama le funzioni ODBC. Gestione driver e driver usano l'handle per individuare le informazioni sull'elemento.

Ad esempio, il codice seguente usa due handle di istruzione (hstmtOrder e hstmtLine) per identificare le istruzioni su cui creare set di risultati degli ordini di vendita e numeri di riga degli ordini di vendita. Successivamente usa questi handle per identificare il set di risultati da cui recuperare i dati.

SQLHSTMT      hstmtOrder, hstmtLine; // Statement handles.  
SQLUINTEGER   OrderID;  
SQLINTEGER    OrderIDInd = 0;  
SQLRETURN     rc;  
  
// Prepare the statement that retrieves line number information.  
SQLPrepare(hstmtLine, "SELECT * FROM Lines WHERE OrderID = ?", SQL_NTS);  
  
// Bind OrderID to the parameter in the preceding statement.  
SQLBindParameter(hstmtLine, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
               &OrderID, 0, &OrderIDInd);  
  
// Bind the result sets for the Order table and the Lines table. Bind  
// OrderID to the OrderID column in the Orders table. When each row is  
// fetched, OrderID will contain the current order ID, which will then be  
// passed as a parameter to the statement tofetch line number  
// information. Code not shown.  
  
// Create a result set of sales orders.  
SQLExecDirect(hstmtOrder, "SELECT * FROM Orders", SQL_NTS);  
  
// Fetch and display the sales order data. Code to check if rc equals  
// SQL_ERROR or SQL_SUCCESS_WITH_INFO not shown.  
while ((rc = SQLFetch(hstmtOrder)) != SQL_NO_DATA) {  
   // Display the sales order data. Code not shown.  
  
   // Create a result set of line numbers for the current sales order.  
   SQLExecute(hstmtLine);  
  
   // Fetch and display the sales order line number data. Code to check  
   // if rc equals SQL_ERROR or SQL_SUCCESS_WITH_INFO not shown.  
   while ((rc = SQLFetch(hstmtLine)) != SQL_NO_DATA) {  
      // Display the sales order line number data. Code not shown.  
   }  
  
   // Close the sales order line number result set.  
   SQLCloseCursor(hstmtLine);  
}  
  
// Close the sales order result set.  
SQLCloseCursor(hstmtOrder);  

Gli handle sono significativi solo per il componente ODBC che li ha creati; ovvero solo Gestione driver può interpretare gli handle di Gestione driver e solo un driver può interpretare i propri handle.

Ad esempio, supponiamo che il driver nell'esempio precedente alloca una struttura per archiviare informazioni su un'istruzione e restituisce il puntatore a questa struttura come handle di istruzione. Quando l'applicazione chiama SQLPrepare, passa un'istruzione SQL e l'handle dell'istruzione usata per i numeri di riga degli ordini di vendita. Il driver invia l'istruzione SQL all'origine dati, che la prepara e restituisce un identificatore del piano di accesso. Il driver usa l'handle per trovare la struttura in cui archiviare questo identificatore.

Successivamente, quando l'applicazione chiama SQLExecute per generare il set di risultati di numeri di riga per un determinato ordine di vendita, passa lo stesso handle. Il driver usa l'handle per recuperare l'identificatore del piano di accesso dalla struttura. Invia l'identificatore all'origine dati per indicare a quale piano eseguire.

ODBC ha due livelli di handle: quello di Gestione driver e quello di driver. L'applicazione usa gli handle di Gestione driver quando si chiamano funzioni ODBC perché chiama tali funzioni in Gestione driver. Gestione driver usa questo handle per trovare l'handle del driver corrispondente e usa l'handle del driver quando chiama la funzione nel driver. Per un esempio d’uso degli handle di driver e di Gestione driver, consulta Ruolo Gestione driver nel processo di connessione.

Che ci sono due livelli di handle è un artefatto dell'architettura ODBC; nella maggior parte dei casi, non è rilevante per l'applicazione o il driver. Anche se di solito non c'è motivo di farlo, è possibile per l'applicazione determinare gli handle del driver chiamando SQLGetInfo.

Questa sezione contiene i seguenti argomenti: