Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os handles são opacos, valores de 32 bits que identificam um item específico; no ODBC, este item pode ser um ambiente, ligação, instrução ou descritor. Quando a aplicação chama SQLAllocHandle, o Gestor de Drivers ou driver cria um novo item do tipo especificado e devolve o seu handle à aplicação. A aplicação utiliza posteriormente o handle para identificar esse item ao chamar funções ODBC. O Gestor de Controladores e o controlador usam a alça para localizar informações sobre o item.
Por exemplo, o código seguinte utiliza dois handles de instruções (hstmtOrder e hstmtLine) para identificar as instruções sobre as quais criar conjuntos de resultados de encomendas de vendas e números de linhas de encomendas de venda. Mais tarde, utiliza estes identificadores para identificar de qual dos conjuntos de resultados obter dados.
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);
Os handles têm significado apenas para o componente ODBC que os criou; ou seja, apenas o Gestor de Drivers pode interpretar os handles do Driver Manager e só um driver pode interpretar os seus próprios handles.
Por exemplo, suponha que o driver no exemplo anterior aloca uma estrutura para armazenar informação sobre uma instrução e devolve o ponteiro para essa estrutura como a alavanca da instrução. Quando a aplicação chama SQLPrepare, passa uma instrução SQL e o identificador da instrução utilizado para os números de linhas de encomendas de vendas. O driver envia a instrução SQL para a fonte de dados, que a prepara e devolve um identificador do plano de acesso. O driver usa a alavanca para encontrar a estrutura onde armazenar este identificador.
Mais tarde, quando a aplicação chama SQLExecute para gerar o conjunto de resultados de números de linha para uma determinada encomenda de venda, usa o mesmo identificador. O driver utiliza a alavanca para recuperar o identificador do plano de acesso da estrutura. Envia o identificador para a fonte de dados para lhe indicar qual o plano a executar.
O ODBC tem dois níveis de alavancas: alavancas do Driver Manager e alavancas do driver. A aplicação utiliza o Driver Manager handles ao chamar funções ODBC porque chama essas funções no Driver Manager. O Gestor de Drivers utiliza este handle para encontrar o handle do driver correspondente e utiliza este handle ao chamar a função no driver. Para um exemplo de como o driver e o Driver Manager são utilizados, veja o Papel do Driver Manager no Processo de Ligação.
O facto de existirem dois níveis de handles é um artefacto da arquitetura ODBC; na maioria dos casos, não é relevante nem para a aplicação nem para o driver. Embora normalmente não haja razão para tal, é possível que a aplicação determine os identificadores do driver chamando SQLGetInfo.
Esta seção contém os seguintes tópicos.