Asas
Los identificadores son valores opacos de 32 bits que identifican un elemento determinado; en ODBC, este elemento puede ser un entorno, una conexión, una instrucción o un descriptor. Cuando la aplicación llama a SQLAllocHandle, el Administrador de controladores o el controlador crea un nuevo elemento del tipo especificado y devuelve su identificador a la aplicación. La aplicación usa más adelante el identificador para identificar ese elemento al llamar a funciones ODBC. El Administrador de controladores y el controlador usan el identificador para buscar información sobre el elemento.
Por ejemplo, el código siguiente usa dos identificadores de instrucción (hstmtOrder y hstmtLine) para identificar las instrucciones en las que se crean conjuntos de resultados de pedidos de ventas y números de línea de pedidos de ventas. Más adelante, usa estos identificadores para identificar el conjunto de resultados del que se van a capturar datos.
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);
Los identificadores solo son significativos para el componente ODBC que los creó; es decir, solo el Administrador de controladores puede interpretar los identificadores del Administrador de controladores y solo un controlador puede interpretar sus propios identificadores.
Por ejemplo, supongamos que el controlador del ejemplo anterior asigna una estructura para almacenar información sobre una instrucción y devuelve el puntero a esta estructura como identificador de instrucción. Cuando la aplicación llama a SQLPrepare, pasa una instrucción SQL y el identificador de la instrucción usada para los números de línea de pedidos de ventas. El controlador envía la instrucción SQL al origen de datos, que lo prepara y devuelve un identificador de plan de acceso. El controlador usa el identificador para buscar la estructura en la que almacenar este identificador.
Más adelante, cuando la aplicación llama a SQLExecute para generar el conjunto de resultados de números de línea para un pedido de ventas determinado, pasa el mismo identificador. El controlador usa el identificador para recuperar el identificador del plan de acceso de la estructura. Envía el identificador al origen de datos para indicarle qué plan ejecutar.
ODBC tiene dos niveles de identificadores: identificadores del Administrador de controladores e identificadores de controladores. La aplicación usa identificadores del Administrador de controladores al llamar a funciones ODBC porque llama a esas funciones en el Administrador de controladores. El Administrador de controladores usa este identificador para buscar el identificador de controlador correspondiente y usa el identificador de controlador al llamar a la función en el controlador. Para obtener un ejemplo de cómo se usan los identificadores de controladores y los identificadores del Administrador de controladores, consulte Rol del Administrador de controladores en el proceso de conexión.
Que haya dos niveles de identificadores es un artefacto de la arquitectura ODBC. En la mayoría de los casos, no es relevante para la aplicación o el controlador. Aunque normalmente no hay ninguna razón para hacerlo, es posible que la aplicación determine los identificadores del controlador mediante una llamada a SQLGetInfo.
Esta sección contiene los temas siguientes.