Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Conformidad
Versión introducida: Normas ODBC 3.0 Cumplimiento: ISO 92
Resumen
SQLSetDescField establece el valor de un solo campo de un registro descriptor.
Syntax
SQLRETURN SQLSetDescField(
SQLHDESC DescriptorHandle,
SQLSMALLINT RecNumber,
SQLSMALLINT FieldIdentifier,
SQLPOINTER ValuePtr,
SQLINTEGER BufferLength);
Arguments
DescriptorHandle
[Entrada] Descriptor handle.
RecNumber
[Entrada] Indica el registro descriptor que contiene el campo que la aplicación busca establecer. Los registros descriptores se numeran desde 0, siendo el registro número 0 el registro de marcador. El argumento RecNumber se ignora en los campos de cabecera.
FieldIdentifier
[Entrada] Indica el campo del descriptor cuyo valor se va a establecer. Para más información, consulte "Argumento FieldIdentifier " en la sección "Comentarios".
ValuePtr
[Entrada] Puntero a un búfer que contiene la información del descriptor o a un valor entero. El tipo de dato depende del valor de FieldIdentifier. Si ValuePtr es un valor entero, puede considerarse como 8 bytes (SQLLEN), 4 bytes (SQLINTEGER) o 2 bytes (SQLSMALLINT), dependiendo del valor del argumento FieldIdentifier .
BufferLength
[Entrada] Si FieldIdentifier es un campo definido por ODBC y ValuePtr apunta a una cadena de caracteres o a un búfer binario, este argumento debe ser la longitud de *ValuePtr. Para los datos de cadenas de caracteres, este argumento debe contener el número de bytes en la cadena.
Si FieldIdentifier es un campo definido por ODBC y ValuePtr es un entero, se ignora BufferLength .
Si FieldIdentifier es un campo definido por el driver, la aplicación indica la naturaleza del campo al Driver Manager estableciendo el argumento BufferLength . BufferLength puede tener los siguientes valores:
Si ValuePtr es un puntero a una cadena de caracteres, entonces BufferLength es la longitud de la cadena o SQL_NTS.
Si ValuePtr es un puntero a un búfer binario, entonces la aplicación coloca el resultado de la macro SQL_LEN_BINARY_ATTR(longitud) en BufferLength. Esto coloca un valor negativo en BufferLength.
Si ValuePtr es un puntero a un valor distinto de una cadena de caracteres o una cadena binaria, entonces BufferLength debería tener el valor SQL_IS_POINTER.
Si ValuePtr contiene un valor de longitud fija, entonces BufferLength es SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT o SQL_IS_USMALLINT, según corresponda.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR o SQL_INVALID_HANDLE.
Diagnostics
Cuando SQLSetDescField devuelve SQL_ERROR o SQL_SUCCESS_WITH_INFO, se puede obtener un valor SQLSTATE asociado llamando a SQLGetDiagRec con un HandleType de SQL_HANDLE_DESC y un Handle de DescriptorHandle. La siguiente tabla enumera los valores SQLSTATE que suele devolver SQLSetDescField y explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de los SQLSTATE devueltas por el Driver Manager. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | Advertencia general | Mensaje informativo específico del controlador. (Function devuelve SQL_SUCCESS_WITH_INFO). |
| 01S02 | Valor de opción cambiado | El controlador no soportaba el valor especificado en *ValuePtr (si ValuePtr era un puntero) ni el valor en ValuePtr (si ValuePtr era un valor entero), o *ValuePtr era inválido debido a las condiciones de trabajo de la implementación, por lo que el controlador sustituyó un valor similar. (Function devuelve SQL_SUCCESS_WITH_INFO). |
| 07009 | Índice de descriptores inválidos | El argumento FieldIdentifier era un campo de registro, el argumento RecNumber era 0 y el argumento DescriptorHandle se refería a un handle IPD. El argumento RecNumber era menor que 0, y el argumento DescriptorHandle se refería a un ARD o un APD. El argumento RecNumber era mayor que el número máximo de columnas o parámetros que la fuente de datos puede soportar, y el argumento DescriptorHandle se refería a un APD o ARD. (DM) El argumento FieldIdentifier era SQL_DESC_COUNT, y el argumento *ValuePtr era menor que 0. El argumento RecNumber era igual a 0, y el argumento DescriptorHandle se refería a un APD asignado implícitamente. (Este error no ocurre con un descriptor de aplicación explícitamente asignado, porque no se sabe si un descriptor de aplicación explícitamente asignado es un APD o ARD hasta el momento de ejecución.) |
| 08S01 | Error de vínculo de comunicación | Se produjo un error en el vínculo de comunicación entre el controlador y el origen de datos al que se conectó el controlador antes de que la función completara el procesamiento. |
| 22001 | Datos de cadena, truncados a la derecha | El argumento FieldIdentifier era SQL_DESC_NAME, y el argumento BufferLength era un valor mayor que SQL_MAX_IDENTIFIER_LEN. |
| HY000 | Error genérico | 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 SQLGetDiagRec en el búfer *MessageText 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. |
| HY010 | Error de secuencia de funciones | (DM) El DescriptorHandle estaba asociado a un StatementHandle para el que se llamaba una función que se ejecutaba de forma asíncrona (no esta) y seguía ejecutándose cuando se llamaba a esta función. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos se llamaba para el HandleStatement con el que el DescriptorHandle estaba asociado y devuelto 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. (DM) Se llamaba a una función de ejecución asíncrona para el handle de conexión asociado al DescriptorHandle. Esta función asíncrona seguía ejecutándose cuando se llamó la función SQLSetDescField . (DM) SQLExecute, SQLExecDirect o SQLMoreResults fue llamado para uno de los handles de sentencias asociados al DescriptorHandle y devolvió SQL_PARAM_DATA_AVAILABLE. Se llamó a esta función antes de recuperar los datos para todos los parámetros transmitidos. |
| 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. |
| HY016 | No se puede modificar un descriptor de fila de implementación | El argumento DescriptorHandle estaba asociado a un IRD, y el argumento FieldIdentifier no era SQL_DESC_ARRAY_STATUS_PTR ni SQL_DESC_ROWS_PROCESSED_PTR. |
| HY021 | Información de descriptores inconsistente | Los campos SQL_DESC_TYPE y SQL_DESC_DATETIME_INTERVAL_CODE no forman un tipo SQL ODBC válido, ni un tipo SQL específico de controlador válido (para IPDs), ni un tipo C ODBC válido (para APDs o ARDs). La información del descriptor comprobada durante una comprobación de consistencia no fue consistente. (Véase "Comprobación de consistencia" en SQLSetDescRec.) |
| HY090 | Longitud de búfer o cadena no válida | (DM) *ValuePtr es una cadena de caracteres, y BufferLength era menor que cero pero no era igual a SQL_NTS. (DM) El controlador era un controlador ODBC 2*.x*, el descriptor era un ARD, el argumento ColumnNumber estaba establecido en 0 y el valor especificado para el argumento BufferLength no era igual a 4. |
| HY091 | Identificador de campo descriptor inválido | El valor especificado para el argumento FieldIdentifier no era un campo definido por ODBC ni era un valor definido por la implementación. El argumento FieldIdentifier era inválido para el argumento DescriptorHandle . El argumento FieldIdentifier era un campo definido por ODBC de solo lectura. |
| HY092 | Identificador de atributo/opción inválido | El valor en *ValuePtr no era válido para el argumento FieldIdentifique . El argumento FieldIdentifier era SQL_DESC_UNNAMED, y ValuePtr era SQL_NAMED. |
| HY105 | Tipo de parámetro no válido | (DM) El valor especificado para el campo SQL_DESC_PARAMETER_TYPE era inválido. (Para más información, véase la sección "InputOutputType Argument" en SQLBindParameter.) |
| 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 más información sobre el estado suspendido, véase Nuevas novedades en ODBC 3.8. |
| 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 al DescriptorHandle no soporta la función. |
Comentarios
Una aplicación puede llamar a SQLSetDescField para establecer cualquier campo descriptor uno a uno. Una llamada a SQLSetDescField establece un solo campo en un único descriptor. Esta función puede llamarse para establecer cualquier campo en cualquier tipo de descriptor, siempre que el campo pueda establecerse. (Véase la tabla más adelante en esta sección.)
Nota:
Si una llamada a SQLSetDescField falla, el contenido del registro descriptor identificado por el argumento RecNumber queda indefinido.
Se pueden llamar otras funciones para establecer múltiples campos descriptores con una sola llamada a la función. La función SQLSetDescRec establece una variedad de campos que afectan al tipo de dato y al búfer asignados a una columna o parámetro (los campos SQL_DESC_TYPE, SQL_DESC_DATETIME_INTERVAL_CODE, SQL_DESC_OCTET_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR y SQL_DESC_INDICATOR_PTR). SQLBindCol o SQLBindParameter pueden usarse para crear una especificación completa para la unión de una columna o parámetro. Estas funciones establecen un grupo específico de campos descriptores con una llamada a una función.
SQLSetDescField puede ser llamado para cambiar los búferes de enlace añadiendo un desplazamiento a los punteros de enlace (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR o SQL_DESC_OCTET_LENGTH_PTR). Esto cambia los búferes de enlace sin llamar a SQLBindCol ni SQLBindParameter, lo que permite a una aplicación cambiar SQL_DESC_DATA_PTR sin modificar otros campos, como SQL_DESC_DATA_TYPE.
Si una aplicación llama a SQLSetDescField para establecer cualquier campo distinto de SQL_DESC_COUNT o los campos diferidos SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR o SQL_DESC_INDICATOR_PTR, el registro se vuelve desvinculado.
Los campos de cabecera de descriptor se establecen llamando a SQLSetDescField con el FieldIdentifier correspondiente. Muchos campos de cabecera también son atributos de sentencia, por lo que también pueden establecerse mediante una llamada a SQLSetStmtAttr. Esto permite a las aplicaciones establecer un campo descriptor sin obtener primero un handle descriptor. Cuando se llama a SQLSetDescField para establecer un campo de cabecera, se ignora el argumento RecNumber .
Se utiliza un RecNumber de 0 para establecer campos de marcadores.
Nota:
El atributo de la sentencia SQL_ATTR_USE_BOOKMARKS siempre debe establecerse antes de llamar a SQLSetDescField para establecer campos de marcadores. Aunque esto no es obligatorio, se recomienda encarecidamente.
Secuencia de campos de descriptor de ajuste
Al establecer campos descriptores llamando a SQLSetDescField, la aplicación debe seguir una secuencia específica:
La aplicación debe primero establecer el campo SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE o SQL_DESC_DATETIME_INTERVAL_CODE.
Una vez que uno de estos campos se ha configurado, la aplicación puede establecer un atributo de un tipo de dato, y el controlador establece los campos de atributos del tipo de dato a los valores predeterminados apropiados para ese tipo de dato. La configuración automática por defecto de los campos de atributos de tipo garantiza que el descriptor esté siempre listo para usarse una vez que la aplicación ha especificado un tipo de dato. Si la aplicación establece explícitamente un atributo de tipo de dato, está anulando el atributo por defecto.
Una vez que uno de los campos listados en el paso 1 se haya establecido y se hayan establecido atributos de tipo de dato, la aplicación puede establecer SQL_DESC_DATA_PTR. Esto solicita una comprobación de consistencia de los campos de descriptores. Si la aplicación cambia el tipo de dato o los atributos tras establecer el campo SQL_DESC_DATA_PTR, el controlador establece SQL_DESC_DATA_PTR a un puntero nulo, desvinculando el registro. Esto obliga a la aplicación a completar los pasos correctos en secuencia, antes de que el registro descriptor sea utilizable.
Inicialización de campos descriptores
Cuando se asigna un descriptor, los campos del descriptor pueden inicializarse a un valor por defecto, inicializarse sin un valor por defecto o no definirse para el tipo de descriptor. Las siguientes tablas indican la inicialización de cada campo para cada tipo de descriptor, con "D" indicando que el campo se inicializa por defecto, y "ND" indicando que el campo se inicializa sin un valor por defecto. Si se muestra un número, el valor por defecto del campo es ese número. Las tablas también indican si un campo es de lectura/escritura (R/W) o de solo lectura (R).
Los campos de un IRD tienen un valor por defecto solo después de que la instrucción ha sido preparada o ejecutada y el IRD se ha llenado, no cuando se ha asignado el handle o descriptor de la sentencia. Hasta que el IRD se haya llenado, cualquier intento de acceder a un campo de un IRD devolverá un error.
Algunos campos de descriptores están definidos para uno o más, pero no todos, los tipos de descriptores (ARDs y IRDs, y APDs y IPDs). Cuando un campo no está definido para un tipo de descriptor, ninguna de las funciones que lo utiliza lo necesita.
Los campos a los que puede acceder SQLGetDescField no pueden necesariamente ser establecidos por SQLSetDescField. Los campos que SQLSetDescField puede establecer se enumeran en las siguientes tablas.
La inicialización de los campos de cabecera se describe en la tabla que sigue.
| Nombre del campo de encabezado | Tipo | R/W | Predeterminado |
|---|---|---|---|
| SQL_DESC_ALLOC_TYPE | SQLSMALLINT | ARD: R APD: R IRD: R IPD: R | ARD: SQL_DESC_ALLOC_AUTO para implícito o SQL_DESC_ALLOC_USER para explícito APD: SQL_DESC_ALLOC_AUTO para implícito o SQL_DESC_ALLOC_USER para explícito IRD: SQL_DESC_ALLOC_AUTO IPD: SQL_DESC_ALLOC_AUTO |
| SQL_DESC_ARRAY_SIZE | SQLULEN | ARD: R/W APD: R/W IRD: IPD NO UTILIZADO: No utilizado | ARD:[1] APD:[1] IRD: IPD no utilizado: No utilizado |
| SQL_DESC_ARRAY_STATUS_PTR | SQLUSMALLINT* | ARD: R/W APD: R/W IRD: R/W IPD: R/W | ARD: Null ptr APD: Null ptr IRD: Null ptr IPD: Null ptr |
| SQL_DESC_BIND_OFFSET_PTR | SQLLEN* | ARD: R/W APD: R/W IRD: IPD NO UTILIZADO: No utilizado | ARD: Null ptr APD: Null ptr IRD: IPD no utilizado: No utilizado |
| SQL_DESC_BIND_TYPE | SQLINTEGER | ARD: R/W APD: R/W IRD: IPD NO UTILIZADO: No utilizado | ARD: SQL_BIND_BY_COLUMN APD: SQL_BIND_BY_COLUMN IRD: No utilizado IPD: No utilizado |
| SQL_DESC_COUNT | SQLSMALLINT | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: 0 APD: 0 IRD: D IPD: 0 |
| SQL_DESC_ROWS_PROCESSED_PTR | SQLULEN* | ARD: AP no utilizado: IRD SIN USAR: R/W IPD: R/W | ARD: APD no utilizado: IRD no utilizado: Null ptr IPD: Null ptr |
[1] Estos campos se definen solo cuando el controlador se rellena automáticamente con el IPD. Si no es así, no están definidos. Si una aplicación intenta establecer estos campos, se devolverá SQLSTATE HY091 (identificador de descriptor inválido).
La inicialización de los campos de registro es la que se muestra en la siguiente tabla.
| Nombre del campo del récord | Tipo | R/W | Predeterminado |
|---|---|---|---|
| SQL_DESC_AUTO_UNIQUE_VALUE | SQLINTEGER | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_BASE_COLUMN_NAME | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_BASE_TABLE_NAME | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_CASE_SENSITIVE | SQLINTEGER | ARD: No utilizado APD: No utilizado IRD: R IPD: R | ARD: APD no utilizado: No utilizado IRD: D IPD: D[1] |
| SQL_DESC_CATALOG_NAME | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_CONCISE_TYPE | SQLSMALLINT | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: SQL_C_ DEFAULT APD: SQL_C_ DEFAULT IRD: D IPD: ND |
| SQL_DESC_DATA_PTR | SQLPOINTER | ARD: R/W APD: R/W IRD: IPD NO UTILIZADO: No utilizado | ARD: Null ptr APD: Null ptr IRD: IPD no utilizado: No utilizado[2] |
| SQL_DESC_CODIGO_INTERVALO_FECHA_HORA | SQLSMALLINT | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_DATETIME_INTERVAL_PRECISION | SQLINTEGER | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_DISPLAY_SIZE | SQLLEN | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_FIXED_PREC_SCALE | SQLSMALLINT | ARD: No utilizado APD: No utilizado IRD: R IPD: R | ARD: APD no utilizado: No utilizado IRD: D IPD: D[1] |
| SQL_DESC_INDICATOR_PTR | SQLLEN * | ARD: R/W APD: R/W IRD: IPD NO UTILIZADO: No utilizado | ARD: Null ptr APD: Null ptr IRD: IPD no utilizado: No utilizado |
| SQL_DESC_LABEL | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_LENGTH | SQLULEN | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_LITERAL_PREFIX | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_LITERAL_SUFFIX | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_LOCAL_TYPE_NAME | SQLCHAR * | ARD: No utilizado APD: No utilizado IRD: R IPD: R | ARD: APD no utilizado: No utilizado IRD: D IPD: D[1] |
| SQL_DESC_NAME | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_NULLABLE | SQLSMALLINT | ARD: No utilizado APD: No utilizado IRD: R IPD: R | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_NUM_PREC_RADIX | SQLINTEGER | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_OCTET_LENGTH | SQLLEN | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_OCTET_LENGTH_PTR | SQLLEN * | ARD: R/W APD: R/W IRD: IPD NO UTILIZADO: No utilizado | ARD: Null ptr APD: Null ptr IRD: IPD no utilizado: No utilizado |
| SQL_DESC_PARAMETER_TYPE | SQLSMALLINT | ARD: APD no utilizado: IRD no utilizado: IPD no utilizado: R/W | ARD: APD no utilizado: IRD no utilizado: IPD no utilizado: D=SQL_PARAM_INPUT |
| SQL_DESC_PRECISION | SQLSMALLINT | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_ROWVER | SQLSMALLINT | ARD: No utilizado APD: No utilizado IRD: R IPD: R |
ARD: No utilizado APD: No utilizado IRD: ND IPD: ND |
| SQL_DESC_SCALE | SQLSMALLINT | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_SCHEMA_NAME | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_SEARCHABLE | SQLSMALLINT | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_TABLE_NAME | SQLCHAR * | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
| SQL_DESC_TYPE | SQLSMALLINT | ARD: R/W APD: R/W IRD: R IPD: R/W | ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND |
| SQL_DESC_TYPE_NAME | SQLCHAR * | ARD: No utilizado APD: No utilizado IRD: R IPD: R | ARD: APD no utilizado: No utilizado IRD: D IPD: D[1] |
| SQL_DESC_UNNAMED | SQLSMALLINT | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: R/W | ARD: ND APD: ND IRD: D IPD: ND |
| SQL_DESC_UNSIGNED | SQLSMALLINT | ARD: No utilizado APD: No utilizado IRD: R IPD: R | ARD: APD no utilizado: No utilizado IRD: D IPD: D[1] |
| SQL_DESC_UPDATABLE | SQLSMALLINT | ARD: APD no utilizado: IRD no utilizado IRD: R IPD: No utilizado | ARD: No utilizado APD: No utilizado IRD: D IPD: No utilizado |
[1] Estos campos se definen solo cuando el controlador se rellena automáticamente con el IPD. Si no es así, no están definidos. Si una aplicación intenta establecer estos campos, se devolverá SQLSTATE HY091 (identificador de descriptor inválido).
[2] El campo SQL_DESC_DATA_PTR en el IPD puede configurarse para forzar una comprobación de consistencia. En una llamada posterior a SQLGetDescField o SQLGetDescRec, el controlador no está obligado a devolver el valor que SQL_DESC_DATA_PTR estaba asignado.
Argumento FieldIdentifier
El argumento FieldIdentifier indica el campo descriptor que se va a establecer. Un descriptor contiene el encabezado del descriptor, que consiste en los campos de cabecera descritos en la siguiente sección, "Campos de cabecera", y cero o más registros de descriptores, que consisten en los campos de registro descritos en la sección siguiente a la sección "Campos de cabecera".
Campos de cabecera
Cada descriptor tiene un encabezado que consiste en los siguientes campos:
SQL_DESC_ALLOC_TYPE [Todos]
Este campo de cabecera SQLSMALLINT de solo lectura especifica si el descriptor fue asignado automáticamente por el controlador o explícitamente por la aplicación. La aplicación puede obtener este campo, pero no modificar. El campo se establece como SQL_DESC_ALLOC_AUTO por el conductor si el descriptor fue asignado automáticamente por el conductor. Se establece para SQL_DESC_ALLOC_USER por el controlador si el descriptor fue asignado explícitamente por la aplicación.
SQL_DESC_ARRAY_SIZE [Descripciones de la aplicación]
En los ARD, este campo de cabecera SQLULEN especifica el número de filas en el conjunto de filas. Este es el número de filas que se deben devolver mediante una llamada a SQLFetch o SQLFetchScroll o a ser operadas mediante una llamada a SQLBulkOperations o SQLSetPos.
En los APD, este campo de cabecera SQLULEN especifica el número de valores para cada parámetro.
El valor por defecto de este campo es 1. Si SQL_DESC_ARRAY_SIZE es mayor que 1, SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR y SQL_DESC_OCTET_LENGTH_PTR del APD o ARD apuntan a los arrays. La cardinalidad de cada array es igual al valor de este campo.
Este campo en el ARD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_ROW_ARRAY_SIZE. Este campo en el APD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_PARAMSET_SIZE.
SQL_DESC_ARRAY_STATUS_PTR [Todos]
Para cada tipo de descriptor, este campo de cabecera de SQLUSMALLINT * apunta a un array de valores de SQLUSMALLINT. Estos arreglos se denominan de la siguiente manera: array de estado de fila (IRD), array de estado de parámetros (IPD), array de operaciones de fila (ARD) y array de operación de parámetros (APD).
En el IRD, este campo de cabecera apunta a un array de estado de fila que contiene valores de estado tras una llamada a SQLBulkOperations, SQLFetch, SQLFetchScroll o SQLSetPos. El array tiene tantos elementos como filas en el conjunto de filas. La aplicación debe asignar un array de SQLUSMALLINTs y establecer este campo para que apunte al array. El campo está configurado por defecto como puntero nulo. El controlador llenará el array, a menos que el campo SQL_DESC_ARRAY_STATUS_PTR esté configurado como puntero nulo, en cuyo caso no se generan valores de estado y el array no se llena.
Caution
El comportamiento del controlador no está definido si la aplicación establece los elementos del array de estado de fila a los que apunta el campo SQL_DESC_ARRAY_STATUS_PTR del IRD.
El array se llena inicialmente mediante una llamada a SQLBulkOperations, SQLFetch, SQLFetchScroll o SQLSetPos. Si la llamada no devolvió SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, el contenido del array al que apunta este campo no está definido. Los elementos del array pueden contener los siguientes valores:
SQL_ROW_SUCCESS: La fila fue recogida con éxito y no ha cambiado desde la última vez que se recogió.
SQL_ROW_SUCCESS_WITH_INFO: La fila fue recogida con éxito y no ha cambiado desde la última vez que se recogió. Sin embargo, se devolvió una advertencia sobre la fila.
SQL_ROW_ERROR: Ocurrió un error al recuperar la fila.
SQL_ROW_UPDATED: La fila se recuperó con éxito y se ha actualizado desde la última vez que se recuperó. Si la fila se recupera de nuevo, su estado es SQL_ROW_SUCCESS.
SQL_ROW_DELETED: La fila ha sido eliminada desde la última vez que se recuperó.
SQL_ROW_ADDED: La fila fue insertada por SQLBulkOperations. Si la fila se recupera de nuevo, su estado es SQL_ROW_SUCCESS.
SQL_ROW_NOROW: El conjunto de filas se solapaba con el final del conjunto de resultados, y no se devolvía ninguna fila que correspondiera a este elemento del array de estado de filas.
Este campo en el IRD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_ROW_STATUS_PTR.
El campo SQL_DESC_ARRAY_STATUS_PTR del IRD solo es válido después de que se haya devuelto SQL_SUCCESS o SQL_SUCCESS_WITH_INFO. Si el código de retorno no es uno de estos, la ubicación a la que apunta SQL_DESC_ROWS_PROCESSED_PTR no está definida.
En el IPD, este campo de cabecera apunta a un array de estado de parámetros que contiene información de estado para cada conjunto de valores de parámetros tras una llamada a SQLExecute o SQLExecDirect. Si la llamada a SQLExecute o SQLExecDirect no devolvió SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, el contenido del array al que apunta este campo queda indefinido. La aplicación debe asignar un array de SQLUSMALLINTs y establecer este campo para que apunte al array. El controlador llenará el array, a menos que el campo SQL_DESC_ARRAY_STATUS_PTR esté configurado como puntero nulo, en cuyo caso no se generan valores de estado y el array no se llena. Los elementos del array pueden contener los siguientes valores:
SQL_PARAM_SUCCESS: La instrucción SQL se ejecutó correctamente para este conjunto de parámetros.
SQL_PARAM_SUCCESS_WITH_INFO: La sentencia SQL se ejecutó con éxito para este conjunto de parámetros; Sin embargo, la información de advertencia está disponible en la estructura de datos de diagnóstico.
SQL_PARAM_ERROR: Se produjo un error al procesar este conjunto de parámetros. Información adicional sobre errores está disponible en la estructura de datos de diagnóstico.
SQL_PARAM_UNUSED: Este conjunto de parámetros no se utilizó, posiblemente porque algún conjunto de parámetros anterior causó un error que abortó el procesamiento posterior, o porque SQL_PARAM_IGNORE se estableció para ese conjunto de parámetros en el array especificado por el campo SQL_DESC_ARRAY_STATUS_PTR del APD.
SQL_PARAM_DIAG_UNAVAILABLE: No hay información diagnóstica disponible. Un ejemplo de esto es cuando el controlador trata los arrays de parámetros como una unidad monolítica y, por tanto, no genera este nivel de información de error.
Este campo en el IPD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_PARAM_STATUS_PTR.
En el ARD, este campo de cabecera apunta a un array de operaciones de fila con valores que la aplicación puede establecer para indicar si esta fila debe ignorarse para operaciones SQLSetPos. Los elementos del array pueden contener los siguientes valores:
SQL_ROW_PROCEED: La fila se incluye en la operación masiva usando SQLSetPos. (Esta configuración no garantiza que la operación ocurra en la fila. Si la fila tiene el estado SQL_ROW_ERROR en el array de estado de la fila IRD, el controlador podría no ser capaz de realizar la operación en la fila.)
SQL_ROW_IGNORE: La fila queda excluida de la operación masiva usando SQLSetPos.
Si no se establecen elementos del array, todas las filas se incluyen en la operación masiva. Si el valor en el campo SQL_DESC_ARRAY_STATUS_PTR del ARD es un puntero nulo, todas las filas se incluyen en la operación masiva; La interpretación es la misma que si el puntero apuntara a un array válido y todos los elementos del array estuvieran SQL_ROW_PROCEED. Si un elemento del array se establece como SQL_ROW_IGNORE, el valor en el array de estado de fila para la fila ignorada no cambia.
Este campo en el ARD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_ROW_OPERATION_PTR.
En el APD, este campo de cabecera apunta a un array de operaciones de parámetros de valores que la aplicación puede establecer para indicar si este conjunto de parámetros debe ignorarse cuando se llama SQLExecute o SQLExecDirect . Los elementos del array pueden contener los siguientes valores:
SQL_PARAM_PROCEED: El conjunto de parámetros se incluye en la llamada SQLExecute o SQLExecDirect .
SQL_PARAM_IGNORE: El conjunto de parámetros queda excluido de la llamada SQLExecute o SQLExecDirect .
Si no se establecen elementos del array, todos los conjuntos de parámetros del array se utilizan en las llamadas SQLExecute o SQLExecDirect . Si el valor en el campo SQL_DESC_ARRAY_STATUS_PTR del APD es un puntero nulo, se utilizan todos los conjuntos de parámetros; La interpretación es la misma que si el puntero apuntara a un array válido y todos los elementos del array fueran SQL_PARAM_PROCEED.
Este campo en el APD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_PARAM_OPERATION_PTR.
SQL_DESC_BIND_OFFSET_PTR [Descripciones de la aplicación]
Este campo de cabecera de SQLLEN * apunta al desplazamiento de enlace. Por defecto está configurado como puntero nulo. Si este campo no es un puntero nulo, el controlador desreferencia el puntero y añade el valor desreferenciado a cada uno de los campos diferidos que tenga un valor no nulo en el registro descriptor (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR y SQL_DESC_OCTET_LENGTH_PTR) en el momento de obtención y utiliza los nuevos valores del puntero al enlazar.
El offset de enlace siempre se añade directamente a los valores de los campos SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR y SQL_DESC_OCTET_LENGTH_PTR. Si el desplazamiento cambia a un valor diferente, el nuevo valor se añade directamente al valor de cada campo descriptor. El nuevo desplazamiento no se añade al valor del campo más ningún desplazamiento anterior.
Este campo es un campo diferido: no se utiliza en el momento en que se establece, pero sí lo emplea el controlador más adelante cuando necesita determinar direcciones para los búferes de datos.
Este campo en el ARD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_ROW_BIND_OFFSET_PTR. Este campo en el ARD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_PARAM_BIND_OFFSET_PTR.
Para más información, consulte la descripción de la vinculación por filas en SQLFetchScroll y SQLBindParameter.
SQL_DESC_BIND_TYPE [Descripciones de la aplicación]
Este campo de encabezado de SQLUINTEGER establece la orientación de enlace que se usará para vincular columnas o parámetros.
En los ARDs, este campo especifica la orientación de enlace cuando se llama SQLFetchScroll o SQLFetch en el handle de la sentencia asociada.
Para seleccionar la asignación columna por columnas, este campo se establece en SQL_BIND_BY_COLUMN (el valor predeterminado).
Este campo en el ARD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_ROW_BIND_TYPE.
En los APD, este campo especifica la orientación de enlace que se va a usar para los parámetros dinámicos.
Para seleccionar la asignación columna a columna para los parámetros, este campo se establece en SQL_BIND_BY_COLUMN (el valor predeterminado).
Este campo en el APD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_PARAM_BIND_TYPE.
SQL_DESC_COUNT [Todos]
Este campo de cabecera SQLSMALLINT especifica el índice basado en 1 del registro con mayor número que contiene datos. Cuando el controlador establece la estructura de datos para el descriptor, también debe establecer el campo SQL_DESC_COUNT para mostrar cuántos registros son significativos. Cuando una aplicación asigna una instancia de esta estructura de datos, no tiene que especificar cuántos registros reservar espacio. A medida que la aplicación especifica el contenido de los registros, el controlador toma cualquier acción necesaria para asegurar que el handle descriptor se refiera a una estructura de datos del tamaño adecuado.
SQL_DESC_COUNT no es un recuento de todas las columnas de datos que están acotadas (si el campo está en un ARD) ni de todos los parámetros que están acotados (si el campo está en un APD), sino el número del registro con mayor número. Si la columna o parámetro con el número más alto no está vinculado, SQL_DESC_COUNT cambia por el número de la siguiente columna o parámetro con el número más alto. Si una columna o un parámetro con un número menor que el número de la columna de mayor número está desvinculado (llamando a SQLBindCol con el argumento TargetValuePtr asignado a puntero nulo, o a SQLBindParameter con el argumento ParameterValuePtr asignado a puntero nulo), SQL_DESC_COUNT no cambia. Si columnas o parámetros adicionales se vinculan con números mayores que el registro de mayor número que contiene datos, el controlador aumenta automáticamente el valor en el campo SQL_DESC_COUNT. Si todas las columnas se desvinculan llamando a SQLFreeStmt con la opción SQL_UNBIND, los campos SQL_DESC_COUNT en el ARD y el IRD se establecen en 0. Si se llama a SQLFreeStmt con la opción SQL_RESET_PARAMS, los campos SQL_DESC_COUNT en el APD y el IPD se establecen en 0.
El valor en SQL_DESC_COUNT puede ser establecido explícitamente por una aplicación llamando a SQLSetDescField. Si el valor en SQL_DESC_COUNT se reduce explícitamente, todos los registros con números mayores que el nuevo valor en SQL_DESC_COUNT se eliminan efectivamente. Si el valor en SQL_DESC_COUNT está explícitamente establecido en 0 y el campo está en un ARD, se liberan todos los búferes de datos excepto una columna de marcador encuadernado.
El recuento de registros en este campo de un ARD no incluye una columna de marcador encuadernado. La única forma de desvincular una columna de marcador es establecer el campo SQL_DESC_DATA_PTR como puntero nulo.
SQL_DESC_ROWS_PROCESSED_PTR [Descriptores de implementación]
En un IRD, este campo de cabecera de SQLULEN * apunta a un búfer que contiene el número de filas obtenidas tras una llamada a SQLFetch o SQLFetchScroll, o el número de filas afectadas en una operación masiva realizada por una llamada a SQLBulkOperations o SQLSetPos, incluyendo filas de error.
En un IPD, este campo de cabecera * de SQLUINTEGER apunta a un búfer que contiene el número de conjuntos de parámetros que se han procesado, incluidos los conjuntos de errores. No se devolverá ningún número si esto es un puntero nulo.
SQL_DESC_ROWS_PROCESSED_PTR es válida solo después de que SQL_SUCCESS o SQL_SUCCESS_WITH_INFO hayan sido devueltos tras una llamada a SQLFetch o SQLFetchScroll (para un campo IRD) o SQLExecute, SQLExecDirect o SQLParamData (para un campo IPD). Si la llamada que rellena el búfer al que apunta este campo no devuelve SQL_SUCCESS ni SQL_SUCCESS_WITH_INFO, el contenido del búfer queda indefinido, a menos que devuelva SQL_NO_DATA, en cuyo caso el valor en el búfer se establece en 0.
Este campo en el ARD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_ROWS_FETCHED_PTR. Este campo en el APD también puede configurarse llamando a SQLSetStmtAttr con el atributo SQL_ATTR_PARAMS_PROCESSED_PTR.
El buffer al que apunta este campo se asigna la aplicación. Es un búfer de salida diferida que establece el controlador. Por defecto está configurado como puntero nulo.
Campos de Récords
Cada descriptor contiene uno o más registros que consisten en campos que definen datos de columna o parámetros dinámicos, dependiendo del tipo de descriptor. Cada registro es una definición completa de una sola columna o parámetro.
SQL_DESC_AUTO_UNIQUE_VALUE [IRDs]
Este campo de registro SQLINTEGER de solo lectura contiene SQL_TRUE si la columna es una columna de autoincremento, o SQL_FALSE si la columna no es de auto-incremento. Este campo es de solo lectura, pero la columna subyacente de auto-incremento no es necesariamente de solo lectura.
SQL_DESC_BASE_COLUMN_NAME [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el nombre de la columna base para la columna del conjunto de resultados. Si no existe un nombre base de columna (como en el caso de columnas que son expresiones), esta variable contiene una cadena vacía.
SQL_DESC_BASE_TABLE_NAME [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el nombre base de la tabla para la columna del conjunto de resultados. Si no se puede definir un nombre de tabla base o no es aplicable, esta variable contiene una cadena vacía.
SQL_DESC_CASE_SENSITIVE [Descriptores de implementación]
Este campo de registro SQLINTEGER de solo lectura contiene SQL_TRUE si la columna o parámetro se trata como sensible a mayúsculas minúsculas para colaciones y comparaciones, o SQL_FALSE si la columna no se trata como sensible a mayúsculas minúsculas para colaciones y comparaciones, o si es una columna que no es de caracteres.
SQL_DESC_CATALOG_NAME [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el catálogo de la tabla base que contiene la columna. El valor de retorno depende del controlador si la columna es una expresión o si la columna forma parte de una vista. Si la fuente de datos no soporta catálogos o no se puede determinar el catálogo, esta variable contiene una cadena vacía.
SQL_DESC_CONCISE_TYPE [Todos]
Este campo de cabecera SQLSMALLINT especifica el tipo de dato conciso para todos los tipos de datos, incluyendo los tipos de data, hora e intervalo.
Los valores en los campos SQL_DESC_CONCISE_TYPE, SQL_DESC_TYPE y SQL_DESC_DATETIME_INTERVAL_CODE son interdependientes. Cada vez que uno de los campos está establecido, también debe estar el otro. SQL_DESC_CONCISE_TYPE pueden establecerse mediante una llamada a SQLBindCol o SQLBindParameter, o SQLSetDescField. SQL_DESC_TYPE pueden configurarse mediante una llamada a SQLSetDescField o SQLSetDescRec.
Si SQL_DESC_CONCISE_TYPE se establece en un tipo de dato conciso distinto de un tipo de intervalo o fecha, el campo SQL_DESC_TYPE se establece en el mismo valor y el campo SQL_DESC_DATETIME_INTERVAL_CODE en 0.
Si SQL_DESC_CONCISE_TYPE se configura al tipo de data concisa y hora o intervalo, el campo SQL_DESC_TYPE se establece al tipo verboso correspondiente (SQL_DATETIME o SQL_INTERVAL) y el campo SQL_DESC_DATETIME_INTERVAL_CODE al subcódigo correspondiente.
SQL_DESC_DATA_PTR [Descriptores de aplicación y IPDs]
Este campo de registro SQLPOINTER apunta a una variable que contendrá el valor del parámetro (para APDs) o el valor de columna (para ARDs). Este campo es un campo diferido. No se utiliza en el momento en que se configura, pero el controlador lo utiliza posteriormente para recuperar datos.
La columna especificada por el campo SQL_DESC_DATA_PTR del ARD no está acotada si el argumento TargetValuePtr en una llamada a SQLBindCol es un puntero nulo o si el campo SQL_DESC_DATA_PTR en el ARD se establece mediante una llamada a SQLSetDescField o SQLSetDescRec a un puntero nulo. Otros campos no se ven afectados si el campo SQL_DESC_DATA_PTR está configurado como puntero nulo.
Si la llamada a SQLFetch o SQLFetchScroll que rellena el búfer al que apunta este campo no devuelve SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, el contenido del búfer no está definido.
Siempre que se establece el campo SQL_DESC_DATA_PTR de un APD, ARD o IPD, el controlador comprueba que el valor en el campo SQL_DESC_TYPE contiene uno de los tipos de datos ODBC C válidos o un tipo de dato específico del controlador, y que todos los demás campos que afectan a los tipos de datos sean consistentes. Solicitar una comprobación de consistencia es el único uso del campo SQL_DESC_DATA_PTR de un IPD. Específicamente, si una aplicación establece el campo SQL_DESC_DATA_PTR de un IPD y posteriormente llama a SQLGetDescField en este campo, no necesariamente se le devuelve el valor que había establecido. Para más información, véase "Comprobaciones de Consistencia" en SQLSetDescRec.
SQL_DESC_DATETIME_INTERVAL_CODE [Todos]
Este campo de registro SQLSMALLINT contiene el subcódigo para el tipo de dato de fecha, hora o intervalo específico cuando el campo SQL_DESC_TYPE está SQL_DATETIME o SQL_INTERVAL. Esto es cierto tanto para los tipos de datos SQL como para los de C. El código consiste en el nombre del tipo de datos con "CODE" sustituido por "TYPE" o "C_TYPE" (para tipos de fecha), o "CODE" sustituido por "INTERVAL" o "C_INTERVAL" (para tipos de intervalo).
Si SQL_DESC_TYPE y SQL_DESC_CONCISE_TYPE en un descriptor de aplicación se establecen en SQL_C_DEFAULT y el descriptor no está asociado a un handle de sentencia, el contenido de SQL_DESC_DATETIME_INTERVAL_CODE no está definido.
Este campo puede configurarse para los tipos de datos de fecha y hora que se enumeran en la siguiente tabla.
| Tipos de fecha | DATETIME_INTERVAL_CODE |
|---|---|
| SQL_TYPE_DATE/SQL_C_TYPE_DATE | SQL_CODE_DATE |
| SQL_TYPE_TIME/SQL_C_TYPE_TIME | SQL_CODE_TIME |
| SQL_TYPE_TIMESTAMP/ SQL_C_TYPE_TIMESTAMP | SQL_CODE_TIMESTAMP |
Este campo puede configurarse para los tipos de datos de intervalo que se enumeran en la siguiente tabla.
| Tipo de intervalo | DATETIME_INTERVAL_CODE |
|---|---|
| SQL_INTERVAL_DAY/ SQL_C_INTERVAL_DAY | SQL_CODE_DAY |
| SQL_INTERVAL_DAY_TO_HOUR/ SQL_C_INTERVAL_DAY_TO_HOUR | SQL_CODE_DAY_TO_HOUR |
| SQL_INTERVAL_DAY_TO_MINUTE/ SQL_C_INTERVAL_DAY_TO_MINUTE | SQL_CODE_DAY_TO_MINUTE |
| SQL_INTERVAL_DAY_TO_SECOND/ SQL_C_INTERVAL_DAY_TO_SECOND | SQL_CODE_DAY_TO_SECOND |
| SQL_INTERVAL_HOUR/ SQL_C_INTERVAL_HOUR | SQL_CODE_HOUR |
| SQL_INTERVAL_HOUR_TO_MINUTE/ SQL_C_INTERVAL_HOUR_TO_MINUTE | SQL_CODE_HOUR_TO_MINUTE |
| SQL_INTERVAL_HOUR_TO_SECOND/ SQL_C_INTERVAL_HOUR_TO_SECOND | SQL_CODE_HOUR_TO_SECOND |
| SQL_INTERVAL_MINUTE/ SQL_C_INTERVAL_MINUTE | SQL_CODE_MINUTE |
| SQL_INTERVAL_MINUTE_TO_SECOND/ SQL_C_INTERVAL_MINUTE_TO_SECOND | SQL_CODE_MINUTE_TO_SECOND |
| SQL_INTERVAL_MONTH/ SQL_C_INTERVAL_MONTH | SQL_CODE_MONTH |
| SQL_INTERVAL_SECOND/ SQL_C_INTERVAL_SECOND | SQL_CODE_SECOND |
| SQL_INTERVAL_YEAR/ SQL_C_INTERVAL_YEAR | SQL_CODE_YEAR |
| SQL_INTERVAL_YEAR_TO_MONTH/ SQL_C_INTERVAL_YEAR_TO_MONTH | SQL_CODE_YEAR_TO_MONTH |
Para más información sobre los intervalos de datos y este campo, consulte Identificadores y Descriptores de Tipo de Datos.
SQL_DESC_DATETIME_INTERVAL_PRECISION [Todos]
Este campo de registro SQLINTEGER contiene la precisión que precede el intervalo si el campo SQL_DESC_TYPE es SQL_INTERVAL. Cuando el campo SQL_DESC_DATETIME_INTERVAL_CODE se establece en un tipo de dato de intervalo, este campo se establece con la precisión predeterminada que conduce el intervalo.
SQL_DESC_DISPLAY_SIZE [IRDs]
Este campo de registro SQLINTEGER de solo lectura contiene el número máximo de caracteres necesarios para mostrar los datos de la columna.
SQL_DESC_FIXED_PREC_SCALE [Descriptores de implementación]
Este campo de registro SQLSMALLINT de solo lectura se establece en SQL_TRUE si la columna es una columna numérica exacta y tiene precisión fija y escala no nula, o para SQL_FALSE si la columna no es una columna numérica exacta con precisión y escala fijas.
SQL_DESC_INDICATOR_PTR [Descriptores de la aplicación]
En los ARDs, este campo de registro de SQLLEN * apunta a la variable indicadora. Esta variable contiene SQL_NULL_DATA si el valor de columna es un NULL. Para los APD, la variable indicadora se establece para SQL_NULL_DATA especificar argumentos dinámicos NULL. De lo contrario, la variable es cero (a menos que los valores en SQL_DESC_INDICATOR_PTR y SQL_DESC_OCTET_LENGTH_PTR sean el mismo puntero).
Si el campo SQL_DESC_INDICATOR_PTR en un ARD es un puntero nulo, el controlador no puede devolver información sobre si la columna es NULA o no. Si la columna es NULL y SQL_DESC_INDICATOR_PTR es un puntero nulo, SQLSTATE 22002 (Variable indicadora requerida pero no suministrada) se devuelve cuando el controlador intenta llenar el búfer tras una llamada a SQLFetch o SQLFetchScroll. Si la llamada a SQLFetch o SQLFetchScroll no devolvió SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, el contenido del búfer no está definido.
El campo SQL_DESC_INDICATOR_PTR determina si el campo al que apunta SQL_DESC_OCTET_LENGTH_PTR está establecido. Si el valor de datos de una columna es NULL, el controlador establece la variable indicadora en SQL_NULL_DATA. El campo al que apunta SQL_DESC_OCTET_LENGTH_PTR entonces no está establecido. Si no se encuentra un valor NULL durante la obtención, el búfer al que apunta SQL_DESC_INDICATOR_PTR se pone en cero y el búfer al que apunta SQL_DESC_OCTET_LENGTH_PTR se establece a la longitud de los datos.
Si el campo SQL_DESC_INDICATOR_PTR en un APD es un puntero nulo, la aplicación no puede usar este registro descriptor para especificar argumentos NULL.
Este campo es un campo diferido: no se utiliza en el momento en que se configura, pero el controlador lo utiliza posteriormente para indicar la nulidad (en casos de ARD) o para determinar la nulidad (para los APD).
SQL_DESC_LABEL [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene la etiqueta de columna o el título. Si la columna no tiene etiqueta, esta variable contiene el nombre de la columna. Si la columna no tiene nombre ni etiqueta, esta variable contiene una cadena vacía.
SQL_DESC_LENGTH [Todos]
Este campo de registro SQLULEN es la longitud máxima o real de una cadena de caracteres en caracteres o un tipo de dato binario en bytes. Es la longitud máxima para un tipo de dato de longitud fija, o la longitud real para un tipo de dato de longitud variable. Su valor siempre excluye el carácter de terminación nula que termina la cadena de caracteres. Para valores cuyo tipo es SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP o uno de los tipos de datos de intervalo SQL, este campo tiene la longitud en caracteres de la representación de la cadena de caracteres del valor de fecha, hora o intervalo.
El valor en este campo puede ser diferente del valor de "longitud" tal como se define en ODBC 2*.x*. Para más información, véase el Apéndice D: Tipos de datos.
SQL_DESC_LITERAL_PREFIX [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el carácter o caracteres que el controlador reconoce como prefijo para un literal de este tipo de datos. Esta variable contiene una cadena vacía para un tipo de dato para el que no se aplica un prefijo literal.
SQL_DESC_LITERAL_SUFFIX [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el carácter o caracteres que el controlador reconoce como sufijo para un literal de este tipo de dato. Esta variable contiene una cadena vacía para un tipo de dato para el que no se aplica un sufijo literal.
SQL_DESC_LOCAL_TYPE_NAME [Descriptores de implementación]
Este campo de registro SQLCHAR * de solo lectura contiene cualquier nombre localizado (idioma nativo) para el tipo de dato que pueda ser diferente del nombre normal del tipo de dato. Si no hay un nombre localizado, se devuelve una cadena vacía. Este campo es solo para fines de visualización.
SQL_DESC_NAME [Descriptores de implementación]
Este campo de registro * de SQLCHAR en un descriptor de fila contiene el alias de columna, si es aplicable. Si el alias de columna no se aplica, se devuelve el nombre de la columna. En cualquier caso, el driver establece el campo SQL_DESC_UNNAMED a SQL_NAMED cuando establece el campo SQL_DESC_NAME. Si no hay nombre de columna ni alias de columna, el controlador devuelve una cadena vacía en el campo SQL_DESC_NAME y establece el campo SQL_DESC_UNNAMED en SQL_UNNAMED.
Una aplicación puede establecer el campo SQL_DESC_NAME de un IPD como un nombre de parámetro o alias para especificar los parámetros del procedimiento almacenado por nombre. (Para más información, véase Parámetros de enlace por nombre (parámetros con nombre).) El campo SQL_DESC_NAME de un IRD es un campo de solo lectura; SQLSTATE HY091 (Identificador de campo descriptor inválido) se devolverá si una aplicación intenta configurarlo.
En los IPD, este campo no está definido si el controlador no soporta parámetros nombrados. Si el controlador soporta parámetros nombrados y es capaz de describirlos, el nombre del parámetro se devuelve en este campo.
SQL_DESC_NULLABLE [Descriptores de implementación]
En los IRD, este campo de registro SQLSMALLINT de solo lectura es 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. Este campo pertenece a la columna del conjunto de resultados, no a la columna base.
En los IPD, este campo siempre se establece en SQL_NULLABLE porque los parámetros dinámicos siempre son anulables y no pueden ser configurados por una aplicación.
SQL_DESC_NUM_PREC_RADIX [Todos]
Este campo SQLINTEGER contiene un valor de 2 si el tipo de dato en el campo SQL_DESC_TYPE es un tipo numérico aproximado, porque el campo SQL_DESC_PRECISION contiene el número de bits. Este campo contiene un valor de 10 si el tipo de dato en el campo SQL_DESC_TYPE es un tipo numérico exacto, porque el campo SQL_DESC_PRECISION contiene el número de dígitos decimales. Este campo está configurado a 0 para todos los tipos de datos no numéricos.
SQL_DESC_OCTET_LENGTH [Todos]
Este campo de registro SQLLEN contiene la longitud, en bytes, de una cadena de caracteres o tipo de dato binario. Para caracteres de longitud fija o tipos binarios, esta es la longitud real en bytes. Para caracteres de longitud variable o tipos binarios, esta es la longitud máxima en bytes. Este valor siempre excluye espacio para el carácter de terminación nula para descriptores de implementación y siempre incluye espacio para el carácter de terminación nula para descriptores de aplicación. Para los datos de la aplicación, este campo contiene el tamaño del búfer. Para los APD, este campo está definido solo para parámetros de salida o entrada/salida.
SQL_DESC_OCTET_LENGTH_PTR [Descripciones de la aplicación]
Este campo de registro * de SQLLEN apunta a una variable que contendrá la longitud total en bytes de un argumento dinámico (para descriptores de parámetros) o de un valor de columna acotado (para descriptores de fila).
Para un APD, este valor se ignora para todos los argumentos excepto la cadena de caracteres y el binario; si este campo apunta a SQL_NTS, el argumento dinámico debe ser terminado en modo nulo. Para indicar que un parámetro acotado será un parámetro de datos en la ejecución, una aplicación establece este campo en el registro correspondiente del APD a una variable que, en tiempo de ejecución, contendrá el valor SQL_DATA_AT_EXEC o el resultado de la macro SQL_LEN_DATA_AT_EXEC. Si hay más de un campo de este tipo, SQL_DESC_DATA_PTR puede asignarse a un valor que identifique de forma única el parámetro para ayudar a la aplicación a determinar qué parámetro se está solicitando.
Si el campo OCTET_LENGTH_PTR de un ARD es un puntero nulo, el controlador no devuelve la información de longitud de la columna. Si el campo SQL_DESC_OCTET_LENGTH_PTR de un APD es un puntero nulo, el controlador asume que las cadenas de caracteres y los valores binarios están terminados en nulo. (Los valores binarios no deben terminarse en nulo, sino que deben tener una longitud para evitar el truncamiento.)
Si la llamada a SQLFetch o SQLFetchScroll que rellena el búfer al que apunta este campo no devuelve SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, el contenido del búfer no está definido. Este campo es un campo diferido. No se utiliza en el momento en que se establece, pero sí lo emplea el controlador en un momento posterior para determinar o indicar la longitud del octeto de los datos.
SQL_DESC_PARAMETER_TYPE [IPDs]
Este campo de registro SQLSMALLINT se establece como SQL_PARAM_INPUT para un parámetro de entrada, SQL_PARAM_INPUT_OUTPUT para un parámetro de entrada/salida, SQL_PARAM_OUTPUT para un parámetro de salida, SQL_PARAM_INPUT_OUTPUT_STREAM para un parámetro de entrada/salida transmitido o SQL_PARAM_OUTPUT_STREAM para un parámetro de salida transmitido. Por defecto está configurado para SQL_PARAM_INPUT.
Para un IPD, el campo se establece como SQL_PARAM_INPUT por defecto si el IPD no se llena automáticamente por el controlador (el atributo de la sentencia SQL_ATTR_ENABLE_AUTO_IPD es SQL_FALSE). Una aplicación debe establecer este campo en el IPD para parámetros que no son parámetros de entrada.
SQL_DESC_PRECISION [Todos]
Este campo de registro SQLSMALLINT contiene el número de dígitos para un tipo numérico exacto, el número de bits en la mantissa (precisión binaria) para un tipo numérico aproximado, o el número de dígitos en el componente de fracciones de segundo para el tipo de dato SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP o SQL_INTERVAL_SECOND. Este campo no está definido para todos los demás tipos de datos.
El valor en este campo puede ser diferente del valor de "precisión" tal como se define en ODBC 2*.x*. Para más información, véase el Apéndice D: Tipos de datos.
SQL_DESC_ROWVER [Descriptores de implementación]
Este campo SQLSMALLINTrecord indica si una columna es modificada automáticamente por el SGBD cuando se actualiza una fila (por ejemplo, una columna del tipo "timestamp" en SQL Server). El valor de este campo de registro se establece como SQL_TRUE si la columna es una columna de versión de fila, y para SQL_FALSE de otra manera. Este atributo de columna es similar a llamar a SQLSpecialColumns con IdentifierType de SQL_ROWVER para determinar si una columna se actualiza automáticamente.
SQL_DESC_SCALE [Todos]
Este campo de registro SQLSMALLINT contiene la escala definida para tipos de datos decimales y numéricos. El campo no está definido para todos los demás tipos de datos.
El valor en este campo puede ser diferente del valor de "escala" tal como se define en ODBC 2*.x*. Para más información, véase el Apéndice D: Tipos de datos.
SQL_DESC_SCHEMA_NAME [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el nombre del esquema de la tabla base que contiene la columna. El valor de retorno depende del controlador si la columna es una expresión o si la columna forma parte de una vista. Si la fuente de datos no soporta esquemas o no se puede determinar el nombre del esquema, esta variable contiene una cadena vacía.
SQL_DESC_SEARCHABLE [IRDs]
Este campo de registro SQLSMALLINT de solo lectura está asignado a uno de los siguientes valores:
SQL_PRED_NONE si la columna no puede usarse en una cláusula WHERE . (Esto es lo mismo que el valor de SQL_UNSEARCHABLE en ODBC 2*.x*.)
SQL_PRED_CHAR si la columna puede usarse en una cláusula WHERE pero solo con el predicado LIKE . (Esto es el mismo valor que el SQL_LIKE_ONLY en ODBC 2*.x*.)
SQL_PRED_BASIC si la columna puede usarse en una cláusula WHERE con todos los operadores de comparación excepto LIKE. (Esto es el mismo que el valor de SQL_EXCEPT_LIKE en ODBC 2*.x*.)
SQL_PRED_SEARCHABLE si la columna puede usarse en una cláusula WHERE con cualquier operador de comparación.
SQL_DESC_TABLE_NAME [IRDs]
Este campo de registro SQLCHAR * de solo lectura contiene el nombre de la tabla base que contiene esta columna. El valor de retorno depende del controlador si la columna es una expresión o si la columna forma parte de una vista.
SQL_DESC_TYPE [Todos]
Este campo de registro SQLSMALLINT especifica el tipo de dato SQL o C conciso para todos los tipos de datos excepto los tipos de data, hora e intervalo. Para los tipos de datos de fecha, hora e intervalo, este campo especifica el tipo de dato verboso, que es SQL_DATETIME o SQL_INTERVAL.
Siempre que este campo contenga SQL_DATETIME o SQL_INTERVAL, el campo SQL_DESC_DATETIME_INTERVAL_CODE debe contener el subcódigo correspondiente para el tipo conciso. Para los tipos de datos de fecha y hora, SQL_DESC_TYPE contiene SQL_DATETIME, y el campo SQL_DESC_DATETIME_INTERVAL_CODE contiene un subcódigo para el tipo de dato específico de fecha y hora. Para los tipos de datos de intervalo, SQL_DESC_TYPE contiene SQL_INTERVAL y el campo SQL_DESC_DATETIME_INTERVAL_CODE contiene un subcódigo para el tipo de dato de intervalo específico.
Los valores en los campos SQL_DESC_TYPE y SQL_DESC_CONCISE_TYPE son interdependientes. Cada vez que uno de los campos está establecido, también debe estar el otro. SQL_DESC_TYPE pueden configurarse mediante una llamada a SQLSetDescField o SQLSetDescRec. SQL_DESC_CONCISE_TYPE pueden establecerse mediante una llamada a SQLBindCol o SQLBindParameter, o SQLSetDescField.
Si SQL_DESC_TYPE se establece en un tipo de dato conciso distinto de un tipo de intervalo o de data-hora, el campo SQL_DESC_CONCISE_TYPE se establece con el mismo valor y el campo SQL_DESC_DATETIME_INTERVAL_CODE se establece en 0.
Si SQL_DESC_TYPE se configura en el tipo de data verbosa de fecha o intervalo (SQL_DATETIME o SQL_INTERVAL) y el campo SQL_DESC_DATETIME_INTERVAL_CODE se establece en el subcódigo correspondiente, el campo SQL_DESC_CONCISE TYPE se establece en el tipo conciso correspondiente. Intentar establecer SQL_DESC_TYPE a uno de los tipos concisos de fecha, hora o intervalo devolverá SQLSTATE HY021 (Información descriptora inconsistente).
Cuando el campo SQL_DESC_TYPE se establece mediante una llamada a SQLBindCol, SQLBindParameter o SQLSetDescField, los siguientes campos se establecen con los siguientes valores por defecto, como se muestra en la tabla siguiente. Los valores de los campos restantes del mismo registro no están definidos.
| Valor de SQL_DESC_TYPE | Otros campos implícitamente definidos |
|---|---|
| SQL_CHAR, SQL_VARCHAR, SQL_C_CHAR, SQL_C_VARCHAR | SQL_DESC_LENGTH está configurado en 1. SQL_DESC_PRECISION está configurado en 0. |
| SQL_DATETIME | Cuando SQL_DESC_DATETIME_INTERVAL_CODE está configurado en SQL_CODE_DATE o SQL_CODE_TIME, SQL_DESC_PRECISION se pone en 0. Cuando está en SQL_DESC_TIMESTAMP, SQL_DESC_PRECISION está en 6. |
| SQL_DECIMAL, SQL_NUMERIC, SQL_C_NUMERIC | SQL_DESC_SCALE está configurado en 0. SQL_DESC_PRECISION se establece con la precisión definida por la implementación para el tipo de dato respectivo. Consulta SQL a C: Numérico para información sobre cómo asignar manualmente un valor de SQL_C_NUMERIC. |
| SQL_FLOAT, SQL_C_FLOAT | SQL_DESC_PRECISION se establece en la precisión por defecto definida por la implementación para SQL_FLOAT. |
| SQL_INTERVAL | Cuando SQL_DESC_DATETIME_INTERVAL_CODE se establece en un tipo de dato de intervalo, SQL_DESC_DATETIME_INTERVAL_PRECISION se establece en 2 (la precisión predeterminada que guía el intervalo). Cuando el intervalo tiene un componente de segundos, SQL_DESC_PRECISION se establece en 6 (la precisión predeterminada de intervalos de segundos). |
Cuando una aplicación llama a SQLSetDescField para establecer campos de un descriptor en lugar de llamar a SQLSetDescRec, la aplicación debe primero declarar el tipo de dato. Cuando lo hace, los otros campos indicados en la tabla anterior se establecen implícitamente. Si alguno de los valores implícitamente establecidos es inaceptable, la aplicación puede entonces llamar a SQLSetDescField o SQLSetDescRec para establecer explícitamente el valor inaceptable.
SQL_DESC_TYPE_NAME [Descriptores de implementación]
Este campo de registro SQLCHAR * de solo lectura contiene el nombre del tipo dependiente de la fuente de datos (por ejemplo, "CHAR", "VARCHAR", etc.). Si el nombre del tipo de dato es desconocido, esta variable contiene una cadena vacía.
SQL_DESC_UNNAMED [Descriptores de implementación]
Este campo de registro SQLSMALLINT en un descriptor de fila es configurado por el controlador para que SQL_NAMED o SQL_UNNAMED cuando establece el campo SQL_DESC_NAME. Si el campo SQL_DESC_NAME contiene un alias de columna o si el alias de columna no se aplica, el controlador establece el campo SQL_DESC_UNNAMED en SQL_NAMED. Si una aplicación establece el campo SQL_DESC_NAME de un IPD como un nombre de parámetro o alias, el controlador establece el campo SQL_DESC_UNNAMED del IPD como SQL_NAMED. Si no hay nombre de columna ni alias de columna, el controlador establece el campo de SQL_DESC_UNNAMED a SQL_UNNAMED.
Una aplicación puede establecer el campo SQL_DESC_UNNAMED de un IPD en SQL_UNNAMED. Un controlador devuelve SQLSTATE HY091 (identificador de campo de descriptor inválido) si una aplicación intenta establecer el campo SQL_DESC_UNNAMED de un IPD como SQL_NAMED. El campo SQL_DESC_UNNAMED de un IRD es de solo lectura; SQLSTATE HY091 (Identificador de campo descriptor inválido) se devolverá si una aplicación intenta configurarlo.
SQL_DESC_UNSIGNED [Descriptores de implementación]
Este campo de registro SQLSMALLINT de solo lectura se establece para SQL_TRUE si el tipo de columna es no firmado o no numérico, o SQL_FALSE si el tipo de columna está firmado.
SQL_DESC_UPDATABLE [IRDs]
Este campo de registro SQLSMALLINT de solo lectura está asignado a uno de los siguientes valores:
SQL_ATTR_READ_ONLY si la columna del conjunto de resultados es de solo lectura.
SQL_ATTR_WRITE si la columna del conjunto de resultados es lectura-escritura.
SQL_ATTR_READWRITE_UNKNOWN si no se sabe si la columna del conjunto de resultados es actualizable o no.
SQL_DESC_UPDATABLE describe la actualización de la columna en el conjunto de resultados, no la columna de la tabla base. La actualización de la columna en la tabla base en la que se basa esta columna del conjunto de resultados puede ser diferente al valor en este campo. Si una columna es actualizable puede depender del tipo de dato, los privilegios del usuario y la definición del propio conjunto de resultados. Si no está claro si una columna es actualizable, SQL_ATTR_READWRITE_UNKNOWN debe devolverse.
Comprobaciones de consistencia
El controlador realiza automáticamente una comprobación de consistencia cada vez que una aplicación introduce un valor para el campo SQL_DESC_DATA_PTR del ARD, APD o IPD. Si alguno de los campos es inconsistente con otros, SQLSetDescField devolverá SQLSTATE HY021 (Información descriptora inconsistente). Para más información, véase "Comprobación de consistencia" en SQLSetDescRec.
Funciones relacionadas
| Para obtener información sobre | Vea |
|---|---|
| Enlazar una columna | Función SQLBindCol |
| Vinculación de un parámetro | Función SQLBindParameter |
| Obtención de un campo descriptor | Función SQLGetDescField |
| Obtención de múltiples campos descriptores | Función SQLGetDescRec |
| Configuración de múltiples campos descriptores | Función SQLSetDescRec |