Alças
Os identificadores são valores opacos de 32 bits que identificam um item específico; no ODBC, esse item pode ser um ambiente, conexão, instrução ou descritor. Quando o aplicativo chama SQLAllocHandle, o Gerenciador de Driver ou driver cria um novo item do tipo especificado e retorna seu identificador para o aplicativo. O aplicativo usa posteriormente o identificador para identificar esse item ao chamar funções ODBC. O Gerenciador de Driver e o driver usam o identificador para localizar informações sobre o item.
Por exemplo, o código a seguir usa dois identificadores de instrução (hstmtOrder e hstmtLine) para identificar as instruções nas quais criar conjuntos de resultados de ordens de venda e números de linha de ordem de venda. Mais tarde, ele usa esses identificadores para identificar de qual conjunto de resultados buscar 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 identificadores são significativos apenas para o componente ODBC que os criou; ou seja, somente o Gerenciador de Driver pode interpretar identificadores do Gerenciador de Driver e somente um driver pode interpretar seus próprios identificadores.
Por exemplo, suponha que o driver no exemplo anterior atribui uma estrutura para armazenar informações sobre uma instrução e retorna o ponteiro para essa estrutura como o identificador da instrução. Quando o aplicativo chama SQLPrepare, ele passa uma instrução SQL e o identificador da instrução usado para números de linha de ordem de venda. O driver envia a instrução SQL para a fonte de dados, que a prepara e retorna um identificador de plano de acesso. O driver usa o identificador para localizar a estrutura na qual armazenar esse identificador.
Posteriormente, quando o aplicativo chama SQLExecute para gerar o conjunto de resultados de números de linha para uma ordem de venda específica, ele passa o mesmo identificador. O driver usa o identificador para recuperar o identificador do plano de acesso da estrutura. Ele envia o identificador para a fonte de dados para informar qual plano executar.
O ODBC tem dois níveis de identificadores: identificadores do Gerenciador de Driver e identificadores de driver. O aplicativo usa identificadores do Gerenciador de Driver ao chamar funções ODBC porque ele chama essas funções no Gerenciador de Driver. O Gerenciador de Driver usa esse identificador para localizar o identificador de driver correspondente e usa o identificador de driver ao chamar a função no driver. Para obter um exemplo de como os identificadores de driver e Gerenciador de Driver são usados, confira Função do Gerenciador de Driver no processo de conexão.
Que há dois níveis de identificadores é um artefato da arquitetura ODBC; na maioria dos casos, não é relevante para o aplicativo ou driver. Embora geralmente não haja razão para fazer isso, é possível para o aplicativo determinar os identificadores de driver chamando SQLGetInfo.
Esta seção contém os tópicos a seguir.