Función SQLColAttribute

Conformidad
Versión introducida: Cumplimiento de estándares ODBC 3.0: ISO 92

Resumen
SQLColAttribute devuelve información de descriptor para una columna de un conjunto de resultados. La información del descriptor se devuelve como una cadena de caracteres, un valor dependiente del descriptor o un valor entero.

Nota

Para obtener más información sobre lo que el Administrador de controladores asigna esta función a cuando odbc 3. La aplicación x funciona con ODBC 2. x driver, consulte Mapping Replacement Functions for Backward Compatibility of Applications.

Sintaxis

  
SQLRETURN SQLColAttribute (  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ColumnNumber,  
      SQLUSMALLINT    FieldIdentifier,  
      SQLPOINTER      CharacterAttributePtr,  
      SQLSMALLINT     BufferLength,  
      SQLSMALLINT *   StringLengthPtr,  
      SQLLEN *        NumericAttributePtr);  

Argumentos

StatementHandle
[Entrada] Identificador de instrucción.

ColumnNumber
[Entrada] Número del registro del IRD desde el que se va a recuperar el valor del campo. Este argumento corresponde al número de columnas de datos de resultados, ordenados secuencialmente en orden de columna creciente, empezando por 1. Las columnas se pueden describir en cualquier orden.

La columna 0 se puede especificar en este argumento, pero todos los valores excepto SQL_DESC_TYPE y SQL_DESC_OCTET_LENGTH devolverán valores no definidos.

FieldIdentifier
[Entrada] Identificador del descriptor. Este identificador define qué campo del IRD se debe consultar (por ejemplo, SQL_COLUMN_TABLE_NAME).

CharacterAttributePtr
[Salida] Puntero a un búfer en el que devolver el valor en el campo FieldIdentifier de la fila ColumnNumber del IRD, si el campo es una cadena de caracteres. De lo contrario, el campo no se usa.

Si CharacterAttributePtr es NULL, StringLengthPtr seguirá devolviendo el número total de bytes (excepto el carácter de terminación NULL para los datos de caracteres) disponible para devolver en el búfer al que apunta CharacterAttributePtr.

BufferLength
[Entrada] Si FieldIdentifier es un campo definido por ODBC y CharacterAttributePtr apunta a una cadena de caracteres o un búfer binario, este argumento debe ser la longitud de *CharacterAttributePtr. Si FieldIdentifier es un campo definido por ODBC y *CharacterAttributePtr es un entero, este campo se omite. Si *CharacterAttributePtr es una cadena Unicode (al llamar a SQLColAttributeW), el argumento BufferLength debe ser un número par. Si FieldIdentifier es un campo definido por el controlador, la aplicación indica la naturaleza del campo en el Administrador de controladores estableciendo el argumento BufferLength . BufferLength puede tener los siguientes valores:

  • Si CharacterAttributePtr es un puntero a un puntero, BufferLength debe tener el valor SQL_IS_POINTER.

  • Si CharacterAttributePtr es un puntero a una cadena de caracteres, BufferLength es la longitud del búfer.

  • Si CharacterAttributePtr es un puntero a un búfer binario, la aplicación coloca el resultado de la macro SQL_LEN_BINARY_ATTR(length) en BufferLength. Esto coloca un valor negativo en BufferLength.

  • Si CharacterAttributePtr es un puntero a un tipo de datos de longitud fija, BufferLength debe ser uno de los siguientes: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT o SQL_IS_USMALLINT.

StringLengthPtr
[Salida] Puntero a un búfer en el que se devuelve el número total de bytes (excepto el byte de terminación NULL para los datos de caracteres) disponible para devolver en *CharacterAttributePtr.

En el caso de los datos de caracteres, si el número de bytes disponibles para devolver es mayor o igual que BufferLength, la información del descriptor de *CharacterAttributePtr se trunca a BufferLength menos la longitud de un carácter de terminación NULL y termina en null por el controlador.

Para todos los demás tipos de datos, se omite el valor de BufferLength y el controlador supone que el tamaño de *CharacterAttributePtr es de 32 bits.

NumericAttributePtr
[Salida] Puntero a un búfer entero en el que devolver el valor en el campo FieldIdentifier de la fila ColumnNumber del IRD, si el campo es un tipo de descriptor numérico, como SQL_DESC_COLUMN_LENGTH. De lo contrario, el campo no se usa. Tenga en cuenta que algunos controladores solo pueden escribir el bit inferior de 32 o 16 bits de un búfer y dejar el bit de orden superior sin cambios. Por lo tanto, las aplicaciones deben inicializar el valor en 0 antes de llamar a esta función.

Devoluciones

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR o SQL_INVALID_HANDLE.

Diagnóstico

Cuando SQLColAttribute devuelve SQL_ERROR o SQL_SUCCESS_WITH_INFO, se puede obtener un valor SQLSTATE asociado mediante una llamada a SQLGetDiagRec con un HandleType de SQL_HANDLE_STMT y un identificador de StatementHandle. En la tabla siguiente se enumeran los valores SQLSTATE devueltos normalmente por SQLColAttribute y se explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de SQLSTATEs devueltas por el Administrador de controladores. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.

SQLSTATE Error Descripción
01000 Advertencia general Mensaje informativo específico del controlador. (Function devuelve SQL_SUCCESS_WITH_INFO).
01004 Datos de cadena, truncados a la derecha El búfer *CharacterAttributePtr no era lo suficientemente grande como para devolver todo el valor de cadena, por lo que el valor de cadena se truncó. La longitud del valor de cadena notruncado se devuelve en *StringLengthPtr. (Function devuelve SQL_SUCCESS_WITH_INFO).
07005 Instrucción preparada no es una especificación de cursor La instrucción asociada a StatementHandle no devolvió un conjunto de resultados y FieldIdentifier no se SQL_DESC_COUNT. No había columnas que describir.
07009 Índice de descriptor no válido (DM) El valor especificado para ColumnNumber era igual a 0 y el atributo de instrucción SQL_ATTR_USE_BOOKMARKS se SQL_UB_OFF.

El valor especificado para el argumento ColumnNumber era mayor que el número de columnas del conjunto de resultados.
HY000 Error general Se produjo un error para el que no había ningún SQLSTATE específico y para el que no se definió SQLSTATE específico de la implementación. El mensaje de error devuelto por SQLGetDiagField de la estructura de datos de diagnóstico describe el error y su causa.
HY001 Error de asignación de memoria El controlador no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función.
HY008 Operación cancelada El procesamiento asincrónico se ha habilitado para StatementHandle. Se llamó a la función y antes de completar la ejecución, se llamó a SQLCancel o SQLCancelHandle en StatementHandle. A continuación, se llamó a la función de nuevo en StatementHandle.

Se llamó a la función y antes de completar la ejecución, se llamó a SQLCancel o SQLCancelHandle en statementHandle desde un subproceso diferente en una aplicación multiproceso.
HY010 Error de secuencia de función (DM) Se llamó a una función de ejecución asincrónica para el identificador de conexión asociado a StatementHandle. Esta función ayncrónica todavía se estaba ejecutando cuando se llamó a SQLColAttribute.

(DM) SQLExecute, SQLExecDirect o SQLMoreResults se llamó a para statementHandle y devolvió SQL_PARAM_DATA_AVAILABLE. Se llamó a esta función antes de recuperar los datos para todos los parámetros transmitidos.

(DM) Se llamó a la función antes de llamar a SQLPrepare, SQLExecDirect o una función de catálogo para StatementHandle.

(DM) Se llamó a una función de ejecución asincrónica (no esta) para StatementHandle y todavía se estaba ejecutando cuando se llamó a esta función.

(DM) se llamó a SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos para statementHandle y devolvió SQL_NEED_DATA. Se llamó a esta función antes de enviar datos para todos los parámetros o columnas de datos en ejecución.
HY013 Error de administración de memoria No se pudo procesar la llamada de función porque no se pudo tener acceso a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria baja.
HY090 Longitud de búfer o cadena no válida (DM) *CharacterAttributePtr es una cadena de caracteres y BufferLength era menor que 0, pero no igual que SQL_NTS.
HY091 Identificador de campo de descriptor no válido El valor especificado para el argumento FieldIdentifier no era uno de los valores definidos y no era un valor definido por la implementación.
HY117 La conexión se suspende debido al estado de transacción desconocido. Solo se permiten funciones de desconexión y de solo lectura. (DM) Para obtener más información sobre el estado suspendido, vea Función SQLEndTran.
HYC00 El controlador no es capaz El controlador no admite el valor especificado para el argumento FieldIdentifier .
HYT01 Se ha agotado el tiempo de espera de la conexión. El período de tiempo de espera de conexión expiró antes de que el origen de datos responda a la solicitud. El período de tiempo de espera de conexión se establece a través de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 El controlador no admite esta función (DM) El controlador asociado a StatementHandle no admite la función .
IM017 El sondeo está deshabilitado en modo de notificación asincrónica Cada vez que se usa el modelo de notificación, el sondeo está deshabilitado.
IM018 No se ha llamado a SQLCompleteAsync para completar la operación asincrónica anterior en este identificador. Si la llamada de función anterior en el identificador devuelve SQL_STILL_EXECUTING y si el modo de notificación está habilitado, se debe llamar a SQLCompleteAsync en el identificador para realizar el posprocesamiento y completar la operación.

Cuando se llama a después de SQLPrepare y antes de SQLExecute, SQLColAttribute puede devolver cualquier SQLSTATE que pueda devolver SQLPrepare o SQLExecute, en función de cuándo el origen de datos evalúe la instrucción SQL asociada a StatementHandle.

Por motivos de rendimiento, una aplicación no debe llamar a SQLColAttribute antes de ejecutar una instrucción .

Comentarios

Para obtener información sobre cómo las aplicaciones usan la información devuelta por SQLColAttribute, vea Metadatos del conjunto de resultados.

SQLColAttribute devuelve información en *NumericAttributePtr o en *CharacterAttributePtr. La información de entero se devuelve en *NumericAttributePtr como un valor SQLLEN; Todos los demás formatos de información se devuelven en *CharacterAttributePtr. Cuando se devuelve información en *NumericAttributePtr, el controlador omite CharacterAttributePtr, BufferLength y StringLengthPtr. Cuando se devuelve información en *CharacterAttributePtr, el controlador omite NumericAttributePtr.

SQLColAttribute devuelve valores de los campos descriptores del IRD. Se llama a la función con un identificador de instrucción en lugar de un identificador descriptor. Los valores devueltos por SQLColAttribute para los valores FieldIdentifier enumerados más adelante en esta sección también se pueden recuperar llamando a SQLGetDescField con el identificador IRD adecuado.

Los campos descriptores definidos actualmente, la versión de ODBC en la que se introdujeron y los argumentos en los que se devuelve información para ellos se muestran más adelante en esta sección; los controladores pueden definir más tipos de descriptores para aprovechar diferentes orígenes de datos.

Odbc 3. El controlador x debe devolver un valor para cada uno de los campos descriptores. Si un campo descriptor no se aplica a un controlador o origen de datos y, a menos que se indique lo contrario, el controlador devuelve 0 en *StringLengthPtr o una cadena vacía en *CharacterAttributePtr.

Backward Compatibility

ODBC 3. La función xSQLColAttribute reemplaza a ODBC 2 en desuso. x función SQLColAttributes. Al asignar SQLColAttributes a SQLColAttribute (cuando odbc 2. La aplicación x funciona con ODBC 3. x driver) o asigna SQLColAttribute a SQLColAttributes (cuando odbc 3. La aplicación x funciona con ODBC 2. x driver), el Administrador de controladores pasa el valor de FieldIdentifier a través, lo asigna a un nuevo valor o devuelve un error, como se indica a continuación:

Nota

Prefijo usado en los valores FieldIdentifier en ODBC 3. x se ha cambiado de lo que se usa en ODBC 2. x. El nuevo prefijo es "SQL_DESC"; el prefijo anterior era "SQL_COLUMN".

  • Si el valor #define de ODBC 2. xFieldIdentifier es el mismo que el valor de #define de ODBC 3. xFieldIdentifier, el valor de la llamada de función se pasa simplemente a través.

  • Los valores #define de ODBC 2. xFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION y SQL_COLUMN_SCALE son diferentes de los valores de #define de ODBC 3. xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE y SQL_DESC_LENGTH. Odbc 2. El controlador x solo necesita admitir ODBC 2. valores x . Odbc 3. El controlador x debe admitir los valores "SQL_COLUMN" y "SQL_DESC" para estos tres FieldIdentifiers. Estos valores son diferentes porque la precisión, la escala y la longitud se definen de forma diferente en ODBC 3. x que estaban en ODBC 2. x. Para obtener más información, vea Tamaño de columna, Dígitos decimales, Longitud del octeto de transferencia y Tamaño de presentación.

  • Si el valor #define de ODBC 2. xFieldIdentifier es diferente del valor de #define de ODBC 3. xFieldIdentifier, como ocurre con los valores COUNT, NAME y NULLABLE, el valor de la llamada de función se asigna al valor correspondiente. Por ejemplo, SQL_COLUMN_COUNT se asigna a SQL_DESC_COUNT y SQL_DESC_COUNT se asigna a SQL_COLUMN_COUNT, según la dirección de la asignación.

  • Si FieldIdentifier es un nuevo valor en ODBC 3. x, para el que no había ningún valor correspondiente en ODBC 2. x, no se asignará cuando un ODBC 3. La aplicación x la usa en una llamada a SQLColAttribute en odbc 2. El controlador x y la llamada devolverá SQLSTATE HY091 (identificador de campo descriptor no válido).

En la tabla siguiente se enumeran los tipos de descriptor devueltos por SQLColAttribute. El tipo de valores NumericAttributePtr es SQLLEN *.

FieldIdentifier Información

devuelto en
Descripción
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) NumericAttributePtr SQL_TRUE si la columna es una columna de creación automática.

SQL_FALSE si la columna no es una columna de creación automática o no es numérica.

Este campo solo es válido para columnas de tipo de datos numéricos. Una aplicación puede insertar valores en una fila que contenga una columna decremento automático, pero normalmente no puede actualizar los valores de la columna.

Cuando se realiza una inserción en una columna de creación automática, se inserta un valor único en la columna en tiempo de inserción. El incremento no está definido, pero es específico del origen de datos. Una aplicación no debe suponer que una columna de autoincremento se inicia en cualquier punto o incremento determinado por cualquier valor determinado.
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) CharacterAttributePtr Nombre de columna base de la columna del conjunto de resultados. Si no existe un nombre de columna base (como en el caso de las columnas que son expresiones), esta variable contiene una cadena vacía.

Esta información se devuelve del campo de registro SQL_DESC_BASE_COLUMN_NAME del IRD, que es un campo de solo lectura.
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) CharacterAttributePtr Nombre de la tabla base que contiene la columna. Si no se puede definir el nombre de la tabla base o no es aplicable, esta variable contiene una cadena vacía.

Esta información se devuelve del campo de registro SQL_DESC_BASE_TABLE_NAME del IRD, que es un campo de solo lectura.
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) NumericAttributePtr SQL_TRUE si la columna se trata como distingue mayúsculas de minúsculas para intercalaciones y comparaciones.

SQL_FALSE si la columna no se trata como distingue mayúsculas de minúsculas para intercalaciones y comparaciones o no es de caracteres.
SQL_DESC_CATALOG_NAME (ODBC 2.0) CharacterAttributePtr Catálogo de la tabla que contiene la columna. El valor devuelto se define por la implementación si la columna es una expresión o si la columna forma parte de una vista. Si el origen de datos no admite catálogos o no se puede determinar el nombre del catálogo, se devuelve una cadena vacía. Este campo de registro VARCHAR no está limitado a 128 caracteres.
SQL_DESC_CONCISE_TYPE (ODBC 1.0) NumericAttributePtr Tipo de datos conciso.

Para los tipos de datos datetime e interval, este campo devuelve el tipo de datos conciso; por ejemplo, SQL_TYPE_TIME o SQL_INTERVAL_YEAR. (Para obtener más información, vea Identificadores y descriptores de tipo de datos en el Apéndice D: Tipos de datos).

Esta información se devuelve del campo de registro SQL_DESC_CONCISE_TYPE del IRD.
SQL_DESC_COUNT (ODBC 1.0) NumericAttributePtr Número de columnas disponibles en el conjunto de resultados. Esto devuelve 0 si no hay columnas en el conjunto de resultados. Se omite el valor del argumento ColumnNumber .

Esta información se devuelve del campo de encabezado SQL_DESC_COUNT del IRD.
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) NumericAttributePtr Número máximo de caracteres necesarios para mostrar datos de la columna. Para obtener más información sobre el tamaño de presentación, vea Tamaño de columna, Dígitos decimales, Longitud del octeto de transferencia y Tamaño de presentación en el Apéndice D: Tipos de datos.
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) NumericAttributePtr SQL_TRUE si la columna tiene una precisión fija y una escala distinta de cero que son específicas del origen de datos.

SQL_FALSE si la columna no tiene una precisión fija y una escala distinta de cero que son específicas del origen de datos.
SQL_DESC_LABEL (ODBC 2.0) CharacterAttributePtr Etiqueta o título de columna. Por ejemplo, una columna denominada EmpName podría estar etiquetada como Nombre del empleado o podría etiquetarse con un alias.

Si una columna no tiene una etiqueta, se devuelve el nombre de la columna. Si la columna no está etiquetada y no tiene nombre, se devuelve una cadena vacía.
SQL_DESC_LENGTH (ODBC 3.0) NumericAttributePtr Valor numérico que es la longitud máxima o real de caracteres de una cadena de caracteres o un tipo de datos binario. Es la longitud máxima de caracteres de un tipo de datos de longitud fija o la longitud de caracteres real de un tipo de datos de longitud variable. Su valor siempre excluye el byte de terminación NULL que finaliza la cadena de caracteres.

Esta información se devuelve del campo de registro SQL_DESC_LENGTH del IRD.

Para obtener más información sobre la longitud, vea Tamaño de columna, Dígitos decimales, Longitud del octeto de transferencia y Tamaño de presentación en el Apéndice D: Tipos de datos.
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) CharacterAttributePtr Este campo de registro VARCHAR(128) contiene el carácter o los caracteres que el controlador reconoce como prefijo para un literal de este tipo de datos. Este campo contiene una cadena vacía para un tipo de datos para el que no se aplica un prefijo literal. Para obtener más información, vea Prefijos literales y sufijos.
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) CharacterAttributePtr Este campo de registro VARCHAR(128) contiene el carácter o los caracteres que el controlador reconoce como sufijo para un literal de este tipo de datos. Este campo contiene una cadena vacía para un tipo de datos para el que no se aplica un sufijo literal. Para obtener más información, vea Prefijos literales y sufijos.
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) CharacterAttributePtr Este campo de registro VARCHAR(128) contiene cualquier nombre localizado (idioma nativo) para el tipo de datos que puede ser diferente del nombre normal del tipo de datos. Si no hay ningún nombre localizado, se devuelve una cadena vacía. Este campo es solo para fines de presentación. El juego de caracteres de la cadena depende de la configuración regional y suele ser el juego de caracteres predeterminado del servidor.
SQL_DESC_NAME (ODBC 3.0) CharacterAttributePtr Alias de columna, si se aplica. Si no se aplica el alias de columna, se devuelve el nombre de columna. En cualquier caso, SQL_DESC_UNNAMED se establece en SQL_NAMED. Si no hay ningún nombre de columna o un alias de columna, se devuelve una cadena vacía y se establece SQL_DESC_UNNAMED en SQL_UNNAMED.

Esta información se devuelve del campo de registro SQL_DESC_NAME del IRD.
SQL_DESC_NULLABLE (ODBC 3.0) NumericAttributePtr SQL_ NULLABLE si la columna puede tener valores NULL; SQL_NO_NULLS si la columna no tiene valores NULL; o SQL_NULLABLE_UNKNOWN si no se sabe si la columna acepta valores NULL.

Esta información se devuelve del campo de registro SQL_DESC_NULLABLE del IRD.
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) NumericAttributePtr Si el tipo de datos del campo SQL_DESC_TYPE es un tipo de datos numérico aproximado, este campo SQLINTEGER contiene un valor de 2 porque el campo SQL_DESC_PRECISION contiene el número de bits. Si el tipo de datos del campo SQL_DESC_TYPE es un tipo de datos numérico exacto, este campo contiene un valor de 10 porque el campo SQL_DESC_PRECISION contiene el número de dígitos decimales. Este campo se establece en 0 para todos los tipos de datos no numéricos.
SQL_DESC_OCTET_LENGTH (ODBC 3.0) NumericAttributePtr Longitud, en bytes, de una cadena de caracteres o de un tipo de datos binario. Para los tipos binarios o caracteres de longitud fija, esta es la longitud real en bytes. Para los tipos binarios o caracteres de longitud variable, esta es la longitud máxima en bytes. Este valor no incluye el terminador NULL.

Esta información se devuelve del campo de registro SQL_DESC_OCTET_LENGTH del IRD.

Para obtener más información sobre la longitud, vea Tamaño de columna, Dígitos decimales, Longitud del octeto de transferencia y Tamaño de presentación en el Apéndice D: Tipos de datos.
SQL_DESC_PRECISION (ODBC 3.0) NumericAttributePtr Valor numérico que para un tipo de datos numérico denota la precisión aplicable. Para los tipos de datos SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP y todos los tipos de datos de intervalo que representan un intervalo de tiempo, su valor es la precisión aplicable del componente fracciones de segundos.

Esta información se devuelve del campo de registro SQL_DESC_PRECISION del IRD.
SQL_DESC_SCALE (ODBC 3.0) NumericAttributePtr Valor numérico que es la escala aplicable para un tipo de datos numérico. Para los tipos de datos DECIMAL y NUMERIC, se trata de la escala definida. No está definido para todos los demás tipos de datos.

Esta información se devuelve del campo de registro SCALE del IRD.
SQL_DESC_SCHEMA_NAME (ODBC 2.0) CharacterAttributePtr Esquema de la tabla que contiene la columna. El valor devuelto se define por la implementación si la columna es una expresión o si la columna forma parte de una vista. Si el origen de datos no admite esquemas o no se puede determinar el nombre del esquema, se devuelve una cadena vacía. Este campo de registro VARCHAR no está limitado a 128 caracteres.
SQL_DESC_SEARCHABLE (ODBC 1.0) NumericAttributePtr SQL_PRED_NONE si la columna no se puede usar en una cláusula WHERE. (Es el mismo que el valor de SQL_UNSEARCHABLE en ODBC 2. x.)

SQL_PRED_CHAR si la columna se puede usar en una cláusula WHERE, pero solo con el predicado LIKE. (Es el mismo que el valor de SQL_LIKE_ONLY en ODBC 2. x.)

SQL_PRED_BASIC si la columna se puede usar en una cláusula WHERE con todos los operadores de comparación excepto LIKE. (Es el mismo que el valor de SQL_EXCEPT_LIKE en ODBC 2. x.)

SQL_PRED_SEARCHABLE si la columna se puede usar en una cláusula WHERE con cualquier operador de comparación.

Las columnas de tipo SQL_LONGVARCHAR y SQL_LONGVARBINARY normalmente devuelven SQL_PRED_CHAR.
SQL_DESC_TABLE_NAME (ODBC 2.0) CharacterAttributePtr El nombre de la tabla que contiene la columna. El valor devuelto se define por la implementación si la columna es una expresión o si la columna forma parte de una vista.

Si no se puede determinar el nombre de la tabla, se devuelve una cadena vacía.
SQL_DESC_TYPE (ODBC 3.0) NumericAttributePtr Valor numérico que especifica el tipo de datos SQL.

Cuando ColumnNumber es igual a 0, se devuelve SQL_BINARY para los marcadores de longitud variable y se devuelve SQL_INTEGER para los marcadores de longitud fija.

Para los tipos de datos datetime e interval, este campo devuelve el tipo de datos detallado: SQL_DATETIME o SQL_INTERVAL. (Para obtener más información, vea Identificadores y descriptores de tipo de datos en el Apéndice D: Tipos de datos.

Esta información se devuelve del campo de registro SQL_DESC_TYPE del IRD. Nota: Para trabajar con ODBC 2. Los controladores x , use SQL_DESC_CONCISE_TYPE en su lugar.
SQL_DESC_TYPE_NAME (ODBC 1.0) CharacterAttributePtr Nombre del tipo de datos dependiente del origen de datos; por ejemplo, "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" o "CHAR ( ) FOR BIT DATA".

Si el tipo es desconocido, se devuelve una cadena vacía.
SQL_DESC_UNNAMED (ODBC 3.0) NumericAttributePtr SQL_NAMED o SQL_UNNAMED. Si el campo SQL_DESC_NAME del IRD contiene un alias de columna o un nombre de columna, se devuelve SQL_NAMED. Si no hay ningún nombre de columna o alias de columna, se devuelve SQL_UNNAMED.

Esta información se devuelve del campo de registro SQL_DESC_UNNAMED del IRD.
SQL_DESC_UNSIGNED (ODBC 1.0) NumericAttributePtr SQL_TRUE si la columna no tiene signo (o no es numérico).

SQL_FALSE si la columna está firmada.
SQL_DESC_UPDATABLE (ODBC 1.0) NumericAttributePtr La columna se describe mediante los valores de las constantes definidas:

SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN

SQL_DESC_UPDATABLE describe la portabilidad de la columna en el conjunto de resultados, no la columna de la tabla base. La portabilidad de la columna base en la que se basa la columna del conjunto de resultados puede ser diferente del valor de este campo. Si una columna es actualizable puede basarse en el tipo de datos, los privilegios de usuario y la definición del propio conjunto de resultados. Si no está claro si una columna es actualizable, se debe devolver SQL_ATTR_READWRITE_UNKNOWN.

SQLColAttribute es una alternativa extensible a SQLDescribeCol. SQLDescribeCol devuelve un conjunto fijo de información de descriptor basada en ANSI-89 SQL. SQLColAttribute permite el acceso al conjunto más amplio de información de descriptor disponible en las extensiones de proveedor de SQL-92 y DBMS anSI.

Para información acerca de Vea
Enlace de un búfer a una columna de un conjunto de resultados SQLBindCol (función)
Cancelación del procesamiento de instrucciones Función SQLCancel
Devolver información sobre una columna de un conjunto de resultados SQLDescribeCol (función)
Capturar un bloque de datos o desplazarse por un conjunto de resultados Función SQLFetchScroll
Captura de varias filas de datos Función SQLFetch

Ejemplo

El código de ejemplo siguiente no libera identificadores ni conexiones. Vea Función SQLFreeHandle, Programa ODBC de ejemplo y Función SQLFreeStmt para obtener ejemplos de código para liberar identificadores e instrucciones.

// SQLColAttibute.cpp  
// compile with: user32.lib odbc32.lib  
  
#define UNICODE  
  
#include <windows.h>  
#include <sqlext.h>  
#include <strsafe.h>  
  
struct DataBinding {  
   SQLSMALLINT TargetType;  
   SQLPOINTER TargetValuePtr;  
   SQLINTEGER BufferLength;  
   SQLLEN StrLen_or_Ind;  
};  
  
void printStatementResult(SQLHSTMT hstmt) {  
   int bufferSize = 1024, i;  
   SQLRETURN retCode;  
   SQLSMALLINT numColumn = 0, bufferLenUsed;
   
   retCode = SQLNumResultCols(hstmt, &numColumn);  
   
   SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );  
   struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );  
  
   printf( "Columns from that table:\n" );  
   for ( i = 0 ; i < numColumn ; i++ ) {  
      columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );  
  
      retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);  
      wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );  
   }  
  
   // allocate memory for the binding  
   for ( i = 0 ; i < numColumn ; i++ ) {  
      columnData[i].TargetType = SQL_C_CHAR;  
      columnData[i].BufferLength = (bufferSize+1);  
      columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );  
   }  
  
   // setup the binding   
   for ( i = 0 ; i < numColumn ; i++ ) {  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,   
         columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));  
   }  
  
   printf( "Data from that table:\n" );  
   // fetch the data and print out the data  
   for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {  
      int j;  
      for ( j = 0 ; j < numColumn ; j++ )  
         wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );  
      printf( "\n" );  
   }  
   printf( "\n" );   
}  
  
int main() {  
   int bufferSize = 1024, i, count = 1, numCols = 5;  
   wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLWCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen, bufferLen;  
   SQLRETURN retCode;  
  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );  
   SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );  
  
   // connect to database  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   // display the database information  
   retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);  
   retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);  
  
   for ( i = 0 ; i < numCols ; i++ ) {  
      catalogResult[i].TargetType = SQL_C_CHAR;  
      catalogResult[i].BufferLength = (bufferSize + 1);  
      catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );  
   }  
  
   // Set up the binding. This can be used even if the statement is closed by closeStatementHandle  
   for ( i = 0 ; i < numCols ; i++ )  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));  
  
   retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
  
   retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );  
  
   for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )  
      if ( count == 1 )  
         StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
  
   wprintf( L"Select all data from the first table (%s)\n", firstTableName );  
   StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );  
  
   retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);  
   printStatementResult(hstmt);  
}  

Consulte también

Referencia de API ODBC
Archivos de encabezado de ODBC
Programa de ejemplo de ODBC