Поделиться через


Дескрипторы

Дескриптора являются непрозрачными, 32-разрядными значениями, определяющими определенный элемент; В ODBC этот элемент может быть средой, подключением, оператором или дескриптором. Когда приложение вызывает SQLAllocHandle, диспетчер драйверов или драйвер создает новый элемент указанного типа и возвращает его дескриптор приложению. Позже приложение использует дескриптор для идентификации этого элемента при вызове функций ODBC. Диспетчер драйверов и драйвер используют дескриптор для поиска сведений об элементе.

Например, следующий код использует два дескриптора инструкций (hstmtOrder и hstmtLine) для идентификации инструкций, на которых создаются результирующие наборы заказов на продажу и номера строк заказов на продажу. Позже эти дескрипторы используются для определения результирующих наборов для получения данных.

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

Дескриптор имеет смысл только для созданного компонента ODBC; То есть только диспетчер драйверов может интерпретировать дескриптор диспетчера драйверов, и только драйвер может интерпретировать свои собственные дескриптора.

Например, предположим, что драйвер в предыдущем примере выделяет структуру для хранения сведений об операторе и возвращает указатель на эту структуру в качестве дескриптора инструкции. Когда приложение вызывает SQLPrepare, он передает инструкцию SQL и дескриптор инструкции, используемой для номеров строк заказа на продажу. Драйвер отправляет инструкцию SQL в источник данных, который подготавливает его и возвращает идентификатор плана доступа. Драйвер использует дескриптор для поиска структуры, в которой хранится этот идентификатор.

Позже, когда приложение вызывает SQLExecute , чтобы создать результирующий набор номеров строк для определенного заказа на продажу, он передает тот же дескриптор. Драйвер использует дескриптор для получения идентификатора плана доступа из структуры. Он отправляет идентификатор источнику данных, чтобы сообщить ему, какой план необходимо выполнить.

ODBC имеет два уровня дескрипторов: дескриптор диспетчера драйверов и дескриптор драйверов. Приложение использует диспетчер драйверов для вызова функций ODBC, так как вызывает эти функции в диспетчере драйверов. Диспетчер драйверов использует этот дескриптор для поиска соответствующего дескриптора драйвера и использует дескриптор драйвера при вызове функции в драйвере. Пример использования дескрипторов драйвера и диспетчера драйверов см . в разделе "Роль диспетчера драйверов" в процессе подключения.

Что есть два уровня дескрипторов является артефактом архитектуры ODBC; В большинстве случаев это не относится ни к приложению, ни к драйверу. Хотя обычно нет никаких оснований для этого, приложение может определить дескриптор драйвера путем вызова SQLGetInfo.

Этот раздел содержит следующие подразделы.