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 en 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 un ODBC 3.La aplicación x funciona con ODBC 2.Controlador x , consulte Asignación de funciones de reemplazo para compatibilidad con versiones anteriores de aplicaciones.
Sintaxis
SQLRETURN SQLColAttribute (
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier,
SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr,
SQLLEN * NumericAttributePtr);
Argumentos
StatementHandle
[Entrada] Identificador de instrucciones.
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, a partir de 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 indefinidos.
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 se va a 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, se omite este campo. 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 devolver 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 en BufferLength menos la longitud de un carácter de terminación NULL y el controlador termina con null.
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 de 32 o 16 bits inferior de un búfer y dejar sin cambios el bit de orden superior. 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 el valor de cadena completo, por lo que el valor de cadena se truncaba. 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 funciones | (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 que ejecuta de forma 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 el 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 a 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 las funciones de desconexión y solo lectura. | (DM) Para obtener más información sobre el estado suspendido, vea Función SQLEndTran. |
HYC00 | Controlador no compatible | 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 respondiera 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 procesamiento posterior y completar la operación. |
Cuando se llama después de SQLPrepare y antes de SQLExecute, SQLColAttribute puede devolver cualquier VALOR SQLSTATE que sqlPrepare o SQLExecute pueda devolver, dependiendo 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 entera 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 de 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 los distintos 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.
Compatibilidad con versiones anteriores
ODBC 3.La función x SQLColAttribute reemplaza a ODBC 2 en desuso.función x SQLColAttributes. Al asignar SQLColAttributes a SQLColAttribute (cuando odbc 2.La aplicación x funciona con ODBC 3.x driver) o asignación de 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 usado en ODBC 2.x. El nuevo prefijo es "SQL_DESC"; el prefijo anterior era "SQL_COLUMN".
Si el #define valor de ODBC 2.x FieldIdentifier es el mismo que el #define valor de ODBC 3.x FieldIdentifier, el valor de la llamada de función se pasa simplemente a través.
Los valores #define de ODBC 2.x FieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION y SQL_COLUMN_SCALE son diferentes de los valores de #define de ODBC 3.x FieldIdentifiers 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 de lo que estaban en ODBC 2.x. Para obtener más información, vea Tamaño de columna, Dígitos decimales, Longitud de octeto de transferencia y Tamaño de presentación.
Si el #define valor de ODBC 2.x FieldIdentifier es diferente del valor #define de ODBC 3.x FieldIdentifier, 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, en función de 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 odbc 3.La aplicación x la usa en una llamada a SQLColAttribute en un ODBC 2.x driver 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 las columnas de tipo de datos numéricos. Una aplicación puede insertar valores en una fila que contenga una columna de creación automática, 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 creación automática 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 el nombre de la tabla base no se puede definir 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 las intercalaciones y comparaciones. SQL_FALSE si la columna no se trata como distingue mayúsculas de minúsculas para las intercalaciones y comparaciones o no es de carácter general. |
SQL_DESC_CATALOG_NAME (ODBC 2.0) | CharacterAttributePtr | Catálogo de la tabla que contiene la columna. El valor devuelto se define en 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, consulte 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 ninguna columna en el conjunto de resultados. El valor del argumento ColumnNumber se omite. 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 visualizació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 específicas del origen de datos. SQL_FALSE si la columna no tiene una precisión fija y una escala distinta de cero 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 etiquetarse 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 sin 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 para un tipo de datos de longitud fija o la longitud real de caracteres para 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 de 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 y sufijos literales. |
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 y sufijos literales. |
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 la columna. En cualquier caso, SQL_DESC_UNNAMED se establece en SQL_NAMED. Si no hay ningún nombre de columna o alias de columna, se devuelve una cadena vacía y SQL_DESC_UNNAMED se establece 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. En el caso de los tipos binarios o caracteres de longitud variable, esta es la longitud máxima en bytes. Este valor no incluye el terminador NULO. 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 de octeto de transferencia y Tamaño de presentación en el Apéndice D: Tipos de datos. |
SQL_DESC_PRECISION (ODBC 3.0) | NumericAttributePtr | Un 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 en 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. (Este 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. (Este 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. (Este 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 en 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, consulte Identificadores y descriptores de tipo de datos del 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.En su lugar, use SQL_DESC_CONCISE_TYPE controladores x . |
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 se desconoce el tipo, 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 está firmada (o no numérica). 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 updatability 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 extenso de información de descriptor disponible en las extensiones de proveedor de ANSI SQL-92 y DBMS.
Funciones relacionadas
Para obtener información sobre | Vea |
---|---|
Enlazar un búfer a una columna de un conjunto de resultados | Función SQLBindCol |
Cancelación del procesamiento de instrucciones | Función SQLCancel |
Devolver información sobre una columna en un conjunto de resultados | Función SQLDescribeCol |
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 y conexiones. Consulte 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