Descripteurs

Les handles sont des valeurs opaques, 32 bits qui identifient un élément particulier ; dans ODBC, cet élément peut être un environnement, une connexion, une instruction ou un descripteur. Lorsque l’application appelle SQLAllocHandle, le Gestionnaire de pilotes ou le pilote crée un élément du type spécifié et retourne son handle à l’application. L’application utilise ultérieurement le handle pour identifier cet élément lors de l’appel de fonctions ODBC. Le Gestionnaire de pilotes et le pilote utilisent le handle pour rechercher des informations sur l’élément.

Par exemple, le code suivant utilise deux handles d’instructions (hstmtOrder et hstmtLine) pour identifier les instructions sur lesquelles créer des jeux de résultats de commandes et de numéros de ligne de commandes. Il utilise ultérieurement ces handles pour identifier le jeu de résultats à partir duquel extraire des données.

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);  

Les handles sont significatifs uniquement pour le composant ODBC qui les a créés ; autrement dit, seul le Gestionnaire de pilotes peut interpréter les poignées du Gestionnaire de pilotes et seul un pilote peut interpréter ses propres handles.

Par exemple, supposons que le pilote de l’exemple précédent alloue une structure pour stocker des informations sur une instruction et retourne le pointeur vers cette structure en tant que handle d’instruction. Lorsque l’application appelle SQLPrepare, elle transmet une instruction SQL et le handle de l’instruction utilisée pour les numéros de ligne de commande. Le pilote envoie l’instruction SQL à la source de données, qui la prépare et retourne un identificateur de plan d’accès. Le pilote utilise le handle pour rechercher la structure dans laquelle stocker cet identificateur.

Plus tard, lorsque l’application appelle SQLExecute pour générer le jeu de résultats des numéros de ligne pour une commande de vente particulière, elle transmet le même handle. Le pilote utilise le handle pour récupérer l’identificateur du plan d’accès à partir de la structure. Il envoie l’identificateur à la source de données pour lui indiquer quel plan exécuter.

ODBC a deux niveaux de handles : les handles du Gestionnaire de pilotes et les handles de pilote. L’application utilise des handles Driver Manager lors de l’appel de fonctions ODBC, car elle appelle ces fonctions dans le Gestionnaire de pilotes. Le Gestionnaire de pilotes utilise ce handle pour rechercher le handle de pilote correspondant et utilise le handle de pilote lors de l’appel de la fonction dans le pilote. Pour obtenir un exemple de l’utilisation des handles driver et Driver Manager, consultez le rôle du Gestionnaire de pilotes dans le processus de connexion.

Qu’il existe deux niveaux de handles est un artefact de l’architecture ODBC ; dans la plupart des cas, il n’est pas pertinent pour l’application ou le pilote. Bien qu’il n’y ait généralement aucune raison de le faire, il est possible pour l’application de déterminer les handles du pilote en appelant SQLGetInfo.

Cette section contient les rubriques suivantes :