SQLBindCol--Enlazar una columna a una variable de aplicación

Finalidad

Especificación: CLI de DB2 1.1 ODBC 1.0 ISO CLI

SQLBindCol() se utiliza para asociar (enlazar) columnas de un conjunto resultante con variables de aplicación, para todos los tipos de datos C. Se transfieren datos del DBMS a la aplicación cuando se invoca SQLFetch(). Durante la transferencia de datos puede producirse una conversión de los datos.

SQLBindCol() se invoca una vez para cada columna del conjunto resultante que la aplicación necesite recuperar.

En general, SQLPrepare() o SQLExecDirect() se invocan antes que esta función y SQLFetch() se invoca después. Pueden también ser necesarios atributos de columnas antes de invocar SQLBindCol() y se pueden obtener utilizando SQLDescribeCol().

Sintaxis

SQLRETURN   SQLBindCol       (SQLHSTMT
StatementHandle,   /* hstmt */
                SQLUSMALLINT      ColumnNumber,      /* icol */
                SQLSMALLINT       TargetType,        /* fCType */
                SQLPOINTER        TargetValuePtr,    /* rgbValue */
                SQLINTEGER        BufferLength,      /* cbValueMax */
                SQLINTEGER   *FAR StrLen_or_IndPtr); /* pcbValue */

Argumentos de la función

Tabla 32. Argumentos de SQLBindCol

Tipo de datos Argumento Uso Descripción
SQLHSTMT StatementHandle entrada Descriptor de contexto de sentencia
SQLUSMALLINT ColumnNumber entrada Número identificador de la columna. Las columnas están numeradas secuencialmente, de izquierda a derecha. Los números de columna comienzan en el 1.
SQLSMALLINT TargetType entrada El tipo de datos C del número de columna ColumnNumber en el conjunto resultante. Se da soporte a los tipos siguientes:

SQL_C_BINARY

SQL_C_BIT

SQL_C_CHAR

SQL_C_DOUBLE

SQL_C_FLOAT

SQL_C_LONG

SQL_C_SHORT

SQL_C_TYPE_DATE

SQL_C_TYPE_TIME

SQL_C_TYPE_TIMESTAMP

SQL_C_TINYINT

Si se especifica SQL_C_DEFAULT, los datos se transfieren a su tipo de datos C por omisión.

SQLPOINTER TargetValuePtr entrada/ salida (diferido) Puntero que apunta al almacenamiento intermedio donde CLI de DB2 debe guardar los datos de columna cuando se obtienen los datos.

Si TargetValuePtr es nulo, la columna no se enlaza.

SQLINTEGER BufferLength entrada Tamaño, en bytes, del almacenamiento intermedio TargetValuePtr disponible para almacenar los datos de columna.

Si TargetType denota una serie binaria o de caracteres o es SQL_C_DEFAULT, BufferLength debe ser mayor que 0 o se devuelve un error. En otro caso, este argumento no se tiene en cuenta.

SQLINTEGER * StrLen_or_IndPtr entrada/salida (diferido) Puntero que apunta a un valor que indica el número de bytes que CLI de DB2 puede devolver en el almacenamiento intermedio TargetValuePtr.

SQLFetch() devuelve SQL_NULL_DATA en este argumento si el valor de datos de la columna es nulo.

También puede devolverse SQL_NO_LENGTH. Consulte la sección sobre uso para obtener más información.

Para esta función, TargetValuePtr y StrLen_or_Ind son salidas diferidas, es decir, las posiciones de memoria a las que apuntan estos punteros no se actualizan hasta que se obtiene una fila del conjunto resultante. En consecuencia, las posiciones referenciadas por estos punteros deben permanecer válidas hasta que se invoque SQLFetch(). Por ejemplo, si se invoca SQLBindCol() dentro de una función local, SQLFetch() se debe llamar desde dentro del mismo ámbito de la función o el almacenamiento intermedio TargetValuePtr debe estar asignado o declarado como estático o global.

Uso

La aplicación llama a SQLBindCol() una vez para cada columna del conjunto resultante para la que la aplicación necesite recuperar datos. Los conjuntos resultantes se generan llamando a SQLExecute() o a SQLExecDirect(). Cuando se invoca SQLFetch(), los datos de cada una de estas columnas enlazadas se colocan en la ubicación asignada (proporcionada por los punteros TargetValuePtr y StrLen_or_Ind).

Las columnas se identifican mediante un número, que se asigna secuencialmente de izquierda a derecha. Los números de columna comienzan en el 1.

El número de columnas del conjunto resultante se puede determinar invocando SQLNumResultCols().

La aplicación puede consultar los atributos de la columna (tales como el tipo de datos y la longitud) invocando primero SQLDescribeCol(). Luego, esta información se puede utilizar para asignar una ubicación de memoria, con el tipo de datos y tamaño apropiados, para indicar una conversión a otro tipo de datos.

Una aplicación puede elegir no enlazar todas las columnas, o incluso no enlazar ninguna columna. Los datos de cualquiera de las columnas también se pueden recuperar utilizando SQLGetData() una vez obtenidas las columnas enlazadas correspondientes a la fila actual.

En recuperaciones subsiguientes de datos, la aplicación puede cambiar el enlace de estas columnas o puede invocar SQLBindCol() para enlazar columnas previamente desenlazadas. El nuevo enlace no afecta a los datos ya capturados, se utiliza en la recuperación siguiente. Para desenlazar una columna individual, llame a SQLBindCol() con el puntero TargetValuePtr establecido en NULL. Para desenlazar todas las columnas, la aplicación debe invocar SQLFreeStmt().

La aplicación debe asegurarse de que se asigna suficiente almacenamiento para los datos que deben recuperarse. Si el almacenamiento intermedio debe contener datos de longitud variable, la aplicación debe asignar suficiente almacenamiento para la longitud máxima de la columna enlazada, de lo contrario se puede producir un truncamiento de los datos. Si el almacenamiento intermedio debe contener datos de longitud fija, CLI de DB2 considera que el tamaño del almacenamiento intermedio es la longitud del tipo de datos C. Si se especifica conversión de datos, ello puede afectar al tamaño de almacenamiento necesario.

Si se produce truncamiento de la serie, se devuelve SQL_SUCCESS_WITH_INFO y StrLen_or_IndPtr se establece en el tamaño real de TargetValuePtr para devolverlo a la aplicación.

Códigos de retorno

Diagnósticos

Tabla 33. SQLSTATE de SQLBindCol

SQLSTATE Descripción Explicación
07009 Índice descriptor no válido. El valor especificado para el argumento ColumnNumber excede el número máximo de columnas del conjunto resultante.
40003 08S01 Error en el enlace de comunicaciones. El enlace de comunicaciones entre la aplicación y la fuente de datos se interrumpió antes de finalizar la función.
58004 Error inesperado del sistema. Error no recuperable del sistema.
HY001 Error de asignación de memoria. CLI de DB2 no puede asignar la memoria necesaria para ejecutar o finalizar la función.
HY002 Número de columna no válido. El valor especificado para el argumento ColumnNumber es menor que 0.

El valor especificado para el argumento ColumnNumber excedía el número máximo de columnas soportadas por la fuente de datos.

HY003 Tipo de programa fuera de rango. TargetType no es un tipo de datos válido ni SQL_C_DEFAULT.
HY013 Error inesperado de gestión de la memoria. CLI de DB2 no puede acceder a la memoria necesaria para ejecutar o finalizar la función.
HY090 Longitud no válida de la serie de caracteres o del almacenamiento intermedio. El valor especificado para el argumento BufferLength es menor que 1 y el argumento TargetType es SQL_C_CHAR, SQL_C_BINARY o SQL_C_DEFAULT.
HYC00 Controlador no apropiado. CLI de DB2 reconoce, pero no da soporte al tipo de datos especificado en el argumento TargetType.

Durante la recuperación de datos pueden presentarse otros mensajes de diagnóstico referentes a las columnas enlazadas.

Restricciones

Los almacenamientos intermedios de salida deben estar alineados por palabras (igual). Muchos procesadores, como Motorola 68000, tienen reglas para la alineación por palabras y la aplicación debería alinear de manera apropiada el almacenamiento intermedio para los tipos de datos que no son caracteres.

Consulta relacionada