Sdílet prostřednictvím


Úchyty

Popisovače jsou neprůhlené, 32bitové hodnoty, které identifikují konkrétní položku; v rozhraní ODBC může být tato položka prostředí, připojení, příkaz nebo popisovač. Když aplikace volá SQLAllocHandle, Driver Manager nebo ovladač vytvoří novou položku zadaného typu a vrátí její popisovač aplikaci. Aplikace později použije popisovač k identifikaci této položky při volání funkcí ODBC. Správce ovladačů a ovladač používají popisovač k vyhledání informací o položce.

Následující kód například používá dva popisovače příkazů (hstmtOrder a hstmtLine) k identifikaci příkazů, pro které se mají vytvořit sady výsledků prodejních objednávek a čísel řádků prodejní objednávky. Později tyto popisovače použije k identifikaci sady výsledků, ze které se mají načítat data.

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

Popisovače jsou smysluplné pouze pro komponentu ODBC, která je vytvořila; to znamená, že pouze Správce ovladačů může interpretovat popisovače Správce ovladačů a pouze ovladač může interpretovat vlastní popisovače.

Předpokládejme například, že ovladač v předchozím příkladu přidělí strukturu pro uložení informací o příkazu a vrátí ukazatel na tuto strukturu jako popisovač příkazu. Když aplikace volá SQLPrepare, předá příkaz SQL a popisovač příkazu používaný pro čísla položek v prodejní objednávce. Ovladač odešle příkaz SQL do zdroje dat, který ho připraví a vrátí identifikátor plánu přístupu. Ovladač používá popisovač k vyhledání struktury, ve které má být tento identifikátor uložen.

Později, když aplikace zavolá SQLExecute, aby vygenerovala sadu výsledků čísel řádků pro konkrétní prodejní objednávku, použije stejný popisovač. Ovladač používá popisovač k načtení identifikátoru plánu přístupu ze struktury. Odešle identifikátor zdroji dat, aby určil, který plán se má provést.

Rozhraní ODBC má dvě úrovně popisovačů: popisovače Správce ovladačů a popisovače ovladačů. Aplikace používá správce ovladačů při volání funkcí ODBC, protože volá tyto funkce ve Správci ovladačů. Správce ovladačů používá tento popisovač k vyhledání odpovídajícího popisovače ovladače a při volání funkce v ovladači použije popisovač ovladače. Příklad použití popisovačů ovladačů a správce ovladačů najdete v tématu Role Správce ovladačů v procesu připojení.

Existence dvou úrovní popisovačů je artefaktem architektury ODBC; ve většině případů není relevantní pro aplikaci nebo ovladače. I když obvykle není důvod k tomu, aplikace může určit popisovače zavoláním SQLGetInfo.

Tato část obsahuje následující témata.