SQLSetDescField 函数

一致性
引入的版本:ODBC 3.0 标准符合性:ISO 92

摘要
SQLSetDescField 设置描述符记录的单个字段的值。

语法

SQLRETURN SQLSetDescField(  
     SQLHDESC      DescriptorHandle,  
     SQLSMALLINT   RecNumber,  
     SQLSMALLINT   FieldIdentifier,  
     SQLPOINTER    ValuePtr,  
     SQLINTEGER    BufferLength);  

参数

DescriptorHandle
[输入]描述符句柄。

RecNumber
[输入]指示包含应用程序要设置的字段的描述符记录。 描述符记录从 0 开始编号,记录号 0 为书签记录。 对于标头字段,将忽略 RecNumber 参数。

FieldIdentifier
[输入]指示要设置其值的描述符的字段。 有关详细信息,请参阅“注释”部分中的“FieldIdentifier 参数”。

ValuePtr
[输入]指向包含描述符信息或整数值的缓冲区的指针。 数据类型取决于 FieldIdentifier 的值。 如果 ValuePtr 是一个整数值,则根据 FieldIdentifier 参数的值,可以将它视为 SQLLEN) (8 个字节, (SQLINTEGER) 为 4 个字节, (SQLSMALLINT) 为 2 个字节。

BufferLength
[输入]如果 FieldIdentifier 是 ODBC 定义的字段,并且 ValuePtr 指向字符串或二进制缓冲区,则此参数应为 *ValuePtr 的长度。 对于字符串数据,此参数应包含字符串中的字节数。

如果 FieldIdentifier 是 ODBC 定义的字段,而 ValuePtr 是整数,则忽略 BufferLength

如果 FieldIdentifier 是驱动程序定义的字段,则应用程序通过设置 BufferLength 参数向驱动程序管理器指示该字段的性质。 BufferLength 可以具有以下值:

  • 如果 ValuePtr 是指向字符串的指针,则 BufferLength 是字符串或SQL_NTS的长度。

  • 如果 ValuePtr 是指向二进制缓冲区的指针,则应用程序会将SQL_LEN_BINARY_ATTR (长度 的结果) 宏放在 BufferLength 中。 这会在 BufferLength 中放置一个负值。

  • 如果 ValuePtr 是指向字符串或二进制字符串以外的值的指针,则 BufferLength 的值应SQL_IS_POINTER。

  • 如果 ValuePtr 包含固定长度的值,则 BufferLength 是SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT或SQL_IS_USMALLINT(视情况而定)。

返回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

诊断

SQLSetDescField 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值,该 SQLGetDiagRec 的 HandleType 为 SQL_HANDLE_DESC 和 Handle ofDescriptorHandle。 下表列出了 SQLSetDescField 通常返回的 SQLSTATE 值,并说明了此函数上下文中的每个值;表示法“ (DM) ”位于驱动程序管理器返回的 SQLSTATEs 说明之前。 与每个 SQLSTATE 值关联的返回代码SQL_ERROR,除非另有说明。

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。 (函数返回 SQL_SUCCESS_WITH_INFO.)
01S02 选项值已更改 如果 ValuePtr 是) 指针,则驱动程序不支持 ValuePtr (;如果 ValuePtr (是) 的整数值,则驱动程序不支持 ValuePtr (valuePtr 中指定的值;如果 ValuePtr 是) 的整数值,则 *ValuePtr 无效,因此驱动程序替换了类似的值。 (函数返回 SQL_SUCCESS_WITH_INFO.)
07009 描述符索引无效 FieldIdentifier 参数为记录字段,RecNumber 参数为 0,DescriptorHandle 参数引用 IPD 句柄。

RecNumber 参数小于 0,而 DescriptorHandle 参数引用了 ARD 或 APD。

RecNumber 参数大于数据源可支持的最大列数或参数数,并且 DescriptorHandle 参数引用 APD 或 ARD。

(DM) FieldIdentifier 参数已SQL_DESC_COUNT,并且 *ValuePtr 参数小于 0。

RecNumber 参数等于 0,而 DescriptorHandle 参数引用隐式分配的 APD。 (显式分配的应用程序描述符不会发生此错误,因为直到执行 time.)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
22001 字符串数据,右截断 FieldIdentifier 参数已SQL_DESC_NAME,BufferLength 参数的值大于 SQL_MAX_IDENTIFIER_LEN。
HY000 常规错误 发生错误,其中没有特定的 SQLSTATE,并且没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (DM) DescriptorHandle一个 StatementHandle 相关联,该语句调用了异步执行的函数 (不是此) 函数,并且调用此函数时仍在执行。

(DM) SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos 被调用,该 语句DescriptorHandle 关联并返回SQL_NEED_DATA。 在为所有数据执行时参数或列发送数据之前调用了此函数。

(DM) 为与 DescriptorHandle 关联的连接句柄调用了异步执行的函数。 调用 SQLSetDescField 函数时,此异步函数仍在执行。

(DM) SQLExecuteSQLExecDirectSQLMoreResults 已为 与 DescriptorHandle 关联的语句句柄之一调用,并返回SQL_PARAM_DATA_AVAILABLE。 此函数是在检索所有流式处理参数的数据之前调用的。
HY013 内存管理错误 无法处理函数调用,因为无法访问基础内存对象,可能是因为内存不足。
HY016 无法修改实现行描述符 DescriptorHandle 参数与 IRD 相关联,并且 FieldIdentifier 参数未SQL_DESC_ARRAY_STATUS_PTR或SQL_DESC_ROWS_PROCESSED_PTR。
HY021 描述符信息不一致 SQL_DESC_TYPE和SQL_DESC_DATETIME_INTERVAL_CODE字段不构成有效的 ODBC SQL 类型或特定于驱动程序的有效 SQL 类型 ((适用于 IPD) )或有效的 ODBC C 类型 ((适用于 APD 或 ARD) )。

在一致性检查期间检查的描述符信息不一致。 (请参阅 SQLSetDescRec.) 中的“一致性检查”
HY090 无效的字符串或缓冲区长度 (DM) *ValuePtr 是一个字符串, BufferLength 小于零但不等于SQL_NTS。

(DM) 驱动程序是 ODBC 2*.x* 驱动程序,描述符是 ARD, ColumnNumber 参数设置为 0,为 参数 BufferLength 指定的值不等于 4。
HY091 描述符字段标识符无效 FieldIdentifier 参数指定的值不是 ODBC 定义的字段,也不是实现定义的值。

FieldIdentifier 参数对于 DescriptorHandle 参数无效。

FieldIdentifier 参数是一个只读的 ODBC 定义的字段。
HY092 无效的属性/选项标识符 *ValuePtr 中的值对 FieldIdentifier 参数无效。

FieldIdentifier 参数已SQL_DESC_UNNAMED,valuePtr 已SQL_NAMED。
HY105 参数类型无效 (DM) 为SQL_DESC_PARAMETER_TYPE字段指定的值无效。 (有关详细信息,请参阅 SQLBindParameter.)
HY117 由于事务状态未知,连接已暂停。 仅允许断开连接和只读函数。 (DM) 有关挂起状态的详细信息,请参阅 ODBC 3.8 中的新增功能
HYT01 超过连接超时时间 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT设置。
IM001 驱动程序不支持此函数 (DM) 与 DescriptorHandle 关联的驱动程序不支持函数。

注释

应用程序可以调用 SQLSetDescField ,一次设置一个描述符字段。 对 SQLSetDescField 的一次调用在单个描述符中设置单个字段。 如果可以设置字段,则可以调用此函数来设置任何描述符类型中的任何字段。 (请参阅本节后面的表。)

注意

如果对 SQLSetDescField 的调用失败,则 RecNumber 参数标识的描述符记录的内容未定义。

可以调用其他函数,通过单个函数调用来设置多个描述符字段。 SQLSetDescRec 函数设置影响绑定到列或参数的数据类型和缓冲区的各种字段,这些字段 (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和SQL_DESC_INDICATOR_PTR字段) 。 SQLBindColSQLBindParameter 可用于为列或参数的绑定制定完整的规范。 这些函数使用一个函数调用设置描述符字段的特定组。

可以通过调用 SQLSetDescField 来更改绑定缓冲区,方法是将偏移量添加到绑定指针 (SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR或SQL_DESC_OCTET_LENGTH_PTR) 。 这会在不调用 SQLBindColSQLBindParameter 的情况下更改绑定缓冲区,这允许应用程序在不更改其他字段(如SQL_DESC_DATA_TYPE)的情况下更改SQL_DESC_DATA_PTR。

如果应用程序调用 SQLSetDescField 来设置除SQL_DESC_COUNT或SQL_DESC_DATA_PTR、SQL_DESC_OCTET_LENGTH_PTR或SQL_DESC_INDICATOR_PTR以外的任何字段,则记录将变为未绑定。

描述符标头字段是通过使用相应的 FieldIdentifier 调用 SQLSetDescField 来设置的。 许多标头字段也是语句属性,因此也可以通过调用 SQLSetStmtAttr 来设置它们。 这样,应用程序无需先获取描述符句柄即可设置描述符字段。 调用 SQLSetDescField 以设置标头字段时, 将忽略 RecNumber 参数。

RecNumber 为 0 用于设置书签字段。

注意

在调用 SQLSetDescField 以设置书签字段之前,应始终设置语句属性SQL_ATTR_USE_BOOKMARKS。 虽然这不是强制性的,但强烈建议这样做。

设置描述符字段的顺序

通过调用 SQLSetDescField 设置描述符字段时,应用程序必须遵循特定的顺序:

  1. 应用程序必须首先设置SQL_DESC_TYPE、SQL_DESC_CONCISE_TYPE或SQL_DESC_DATETIME_INTERVAL_CODE字段。

  2. 设置其中一个字段后,应用程序可以设置数据类型的属性,驱动程序将数据类型属性字段设置为数据类型的相应默认值。 类型属性字段的自动默认值可确保在应用程序指定数据类型后,描述符始终可供使用。 如果应用程序显式设置数据类型属性,它将覆盖默认属性。

  3. 设置步骤 1 中列出的某个字段并设置数据类型属性后,应用程序可以设置SQL_DESC_DATA_PTR。 这提示对描述符字段进行一致性检查。 如果应用程序在设置SQL_DESC_DATA_PTR字段后更改了数据类型或属性,驱动程序会将SQL_DESC_DATA_PTR设置为 null 指针,从而取消绑定记录。 这会强制应用程序在描述符记录可用之前按顺序完成适当的步骤。

描述符字段的初始化

分配描述符时,描述符中的字段可以初始化为默认值,在不使用默认值的情况下进行初始化,或者为描述符的类型取消定义。 下表指示每种类型的描述符的每个字段的初始化,其中“D”表示用默认值初始化字段,“ND”指示该字段在没有默认值的情况下初始化。 如果显示数字,则字段的默认值为该数字。 这些表还指示字段是读/写 (R/W) 还是只读 (R) 。

只有在准备好或执行语句并填充 IRD 之后,IRD 的字段才具有默认值,而不是在分配语句句柄或描述符时。 在填充 IRD 之前,任何获取 IRD 字段访问权限的尝试都将返回错误。

某些描述符字段是为一个或多个描述符类型(但并非全部)定义的, (ARD 和 IRD,APD 和 IPD) 。 当某个类型的描述符未定义字段时,使用该描述符的任何函数都不需要该字段。

SQLGetDescField 可以访问的字段不一定由 SQLSetDescField 设置。 下表中列出了可由 SQLSetDescField 设置的字段。

下表概述了标头字段的初始化。

标头字段名称 类型 R/W 默认
SQL_DESC_ALLOC_TYPE SQLSMALLINT ARD:R APD:R IRD:R IPD:R ARD:隐式SQL_DESC_ALLOC_AUTO或显式SQL_DESC_ALLOC_USER

APD:隐式SQL_DESC_ALLOC_AUTO或显式SQL_DESC_ALLOC_USER

IRD:SQL_DESC_ALLOC_AUTO

IPD:SQL_DESC_ALLOC_AUTO
SQL_DESC_ARRAY_SIZE SQLULEN ARD:R/W APD:R/W IRD:未使用的 IPD:未使用 ARD:[1] APD:[1] IRD:未使用的 IPD:未使用
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:未使用 ARD:Null ptr APD:Null ptr IRD:未使用的 IPD:未使用
SQL_DESC_BIND_TYPE SQLINTEGER ARD:R/W APD:R/W IRD:未使用的 IPD:未使用 ARD:SQL_BIND_BY_COLUMN

APD:SQL_BIND_BY_COLUMN

IRD:未使用

IPD:未使用
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:未使用的 APD:未使用的 IRD:R/W IPD:R/W ARD:未使用的 APD:未使用的 IRD:Null ptr IPD:Null ptr

[1] 仅当驱动程序自动填充 IPD 时,才会定义这些字段。 如果没有,则为未定义。 如果应用程序尝试设置这些字段,将返回 SQLSTATE HY091 (无效的描述符字段标识符) 。

记录字段的初始化如下表所示。

记录字段名称 类型 R/W 默认
SQL_DESC_AUTO_UNIQUE_VALUE SQLINTEGER ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_BASE_COLUMN_NAME SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_BASE_TABLE_NAME SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_CASE_SENSITIVE SQLINTEGER ARD:未使用的 APD:未使用的 IRD:R IPD:R ARD:未使用的 APD:未使用的 IRD:D IPD:D[1]
SQL_DESC_CATALOG_NAME SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
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:未使用 ARD:Null ptr APD:Null ptr IRD:未使用的 IPD:未使用[2]
SQL_DESC_DATETIME_INTERVAL_CODE 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:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_FIXED_PREC_SCALE SQLSMALLINT ARD:未使用的 APD:未使用的 IRD:R IPD:R ARD:未使用的 APD:未使用的 IRD:D IPD:D[1]
SQL_DESC_INDICATOR_PTR SQLLEN * ARD:R/W APD:R/W IRD:未使用的 IPD:未使用 ARD: Null ptr APD: Null ptr IRD: 未使用的 IPD: 未使用
SQL_DESC_LABEL SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
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:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_LITERAL_SUFFIX SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_LOCAL_TYPE_NAME SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:R ARD:未使用的 APD:未使用的 IRD:D IPD:D[1]
SQL_DESC_NAME SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_NULLABLE SQLSMALLINT ARD:未使用的 APD:未使用的 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:未使用 ARD: Null ptr APD: Null ptr IRD: 未使用的 IPD: 未使用
SQL_DESC_PARAMETER_TYPE SQLSMALLINT ARD:未使用的 APD:未使用的 IRD:未使用的 IPD:R/W ARD:未使用的 APD:未使用的 IRD:未使用的 IPD: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:未使用

APD:未使用

IRD:R

IPD:R
ARD:未使用

APD:未使用

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:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_SEARCHABLE SQLSMALLINT ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
SQL_DESC_TABLE_NAME SQLCHAR * ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用
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:未使用的 APD:未使用的 IRD:R IPD:R ARD:未使用的 APD:未使用的 IRD:D IPD:D[1]
SQL_DESC_UNNAMED SQLSMALLINT ARD:未使用的 APD:未使用的 IRD:R IPD:R/W ARD:ND APD:ND IRD:D IPD:ND
SQL_DESC_UNSIGNED SQLSMALLINT ARD:未使用的 APD:未使用的 IRD:R IPD:R ARD:未使用的 APD:未使用的 IRD:D IPD:D[1]
SQL_DESC_UPDATABLE SQLSMALLINT ARD:未使用的 APD:未使用的 IRD:R IPD:未使用 ARD:未使用的 APD:未使用的 IRD:D IPD:未使用

[1] 仅当驱动程序自动填充 IPD 时,才会定义这些字段。 如果不是,则为未定义。 如果应用程序尝试设置这些字段,则 SQLSTATE HY091 (将返回无效的描述符字段标识符) 。

[2] IPD 中的SQL_DESC_DATA_PTR字段可以设置为强制进行一致性检查。 在后续调用 SQLGetDescFieldSQLGetDescRec 时,驱动程序不需要返回SQL_DESC_DATA_PTR设置为 的值。

FieldIdentifier 参数

FieldIdentifier 参数指示要设置的描述符字段。 描述符包含 描述符标头, 由下一节所述的标头字段“标头字段”和零个或多个 描述符记录组成,这些记录 由“标头字段”部分后面的部分中介绍的记录字段组成。

标头字段

每个描述符都有一个包含以下字段的标头:

SQL_DESC_ALLOC_TYPE [全部]
此只读 SQLSMALLINT 标头字段指定描述符是由驱动程序自动分配还是由应用程序显式分配。 应用程序可以获取但不能修改此字段。 如果描述符由驱动程序自动分配,则字段设置为由驱动程序SQL_DESC_ALLOC_AUTO。 如果应用程序显式分配了描述符,则它设置为驱动程序SQL_DESC_ALLOC_USER。

SQL_DESC_ARRAY_SIZE [应用程序描述符]
在 ARD 中,此 SQLULEN 标头字段指定行集中的行数。 这是调用 SQLFetchSQLFetchScroll 或通过调用 SQLBulkOperationsSQLSetPos 操作所返回的行数。

在 APD 中,此 SQLULEN 标头字段指定每个参数的值数。

此字段的默认值为 1。 如果SQL_DESC_ARRAY_SIZE大于 1,SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR和SQL_DESC_OCTET_LENGTH_PTR APD 或 ARD 指向数组。 每个数组的基数等于此字段的值。

还可以通过使用 SQL_ATTR_ROW_ARRAY_SIZE 属性调用 SQLSetStmtAttr 来设置 ARD 中的此字段。 还可以通过使用 SQL_ATTR_PARAMSET_SIZE 属性调用 SQLSetStmtAttr 来设置 APD 中的此字段。

SQL_DESC_ARRAY_STATUS_PTR [全部]
对于每种描述符类型,此 SQLUSMALLINT * 标头字段指向 SQLUSMALLINT 值的数组。 这些数组的命名方式如下:行状态数组 (IRD) 、参数状态数组 (IPD) 、行操作数组 (ARD) ,参数操作数组 (APD) 。

在 IRD 中,此标头字段指向在调用 SQLBulkOperations、SQLFetchSQLFetchScrollSQLSetPos 后包含状态值的行状态数组。 数组的元素数与行集中的行数一样多。 应用程序必须分配 SQLUSMALLINT 数组,并将此字段设置为指向该数组。 默认情况下,字段设置为 null 指针。 驱动程序将填充数组 - 除非将SQL_DESC_ARRAY_STATUS_PTR字段设置为 null 指针,在这种情况下,不会生成任何状态值,并且不填充数组。

注意

如果应用程序设置 IRD SQL_DESC_ARRAY_STATUS_PTR 字段指向的行状态数组的元素,则驱动程序行为是未定义的。

数组最初是通过调用 SQLBulkOperationsSQLFetchSQLFetchScrollSQLSetPos 填充的。 如果调用未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则此字段指向的数组的内容是未定义的。 数组中的元素可以包含以下值:

  • SQL_ROW_SUCCESS:该行已成功提取,自上次提取以来未更改。

  • SQL_ROW_SUCCESS_WITH_INFO:该行已成功提取,自上次提取以来未发生更改。 但是,返回了有关该行的警告。

  • SQL_ROW_ERROR:提取行时出错。

  • SQL_ROW_UPDATED:已成功提取行,自上次提取以来已更新。 如果再次提取行,则其状态为SQL_ROW_SUCCESS。

  • SQL_ROW_DELETED:自上次提取以来,该行已被删除。

  • SQL_ROW_ADDED:该行由 SQLBulkOperations 插入。 如果再次提取行,则其状态为SQL_ROW_SUCCESS。

  • SQL_ROW_NOROW:行集与结果集的末尾重叠,并且未返回与行状态数组的此元素对应的行。

也可以使用 SQL_ATTR_ROW_STATUS_PTR 属性调用 SQLSetStmtAttr 来设置 IRD 中的此字段。

IRD 的SQL_DESC_ARRAY_STATUS_PTR字段仅在返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO后有效。 如果返回代码不是其中之一,则SQL_DESC_ROWS_PROCESSED_PTR指向的位置未定义。

在 IPD 中,此标头字段指向一个参数状态数组,其中包含调用 SQLExecuteSQLExecDirect 后每组参数值的状态信息。 如果对 SQLExecuteSQLExecDirect 的调用未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则此字段指向的数组的内容未定义。 应用程序必须分配 SQLUSMALLINT 数组,并将此字段设置为指向该数组。 驱动程序将填充数组 - 除非将SQL_DESC_ARRAY_STATUS_PTR字段设置为 null 指针,在这种情况下,不会生成任何状态值,并且不填充数组。 数组中的元素可以包含以下值:

  • SQL_PARAM_SUCCESS:已成功为此参数集执行 SQL 语句。

  • SQL_PARAM_SUCCESS_WITH_INFO:已成功为这组参数执行 SQL 语句;但是,诊断数据结构中提供了警告信息。

  • SQL_PARAM_ERROR:处理这组参数时出错。 诊断数据结构中提供了其他错误信息。

  • SQL_PARAM_UNUSED:此参数集未使用,可能是因为某些以前的参数集导致错误中止了进一步处理,或者因为已为 APD SQL_DESC_ARRAY_STATUS_PTR 字段指定的数组中的该参数集设置了SQL_PARAM_IGNORE。

  • SQL_PARAM_DIAG_UNAVAILABLE:诊断信息不可用。 例如,驱动程序将参数数组视为整体单元,因此不会生成此级别的错误信息。

还可以通过使用 SQL_ATTR_PARAM_STATUS_PTR 属性调用 SQLSetStmtAttr 来设置 IPD 中的此字段。

在 ARD 中,此标头字段指向可由应用程序设置的值的行操作数组,以指示是否要忽略 SQLSetPos 操作的此行。 数组中的元素可以包含以下值:

  • SQL_ROW_PROCEED:该行包含在使用 SQLSetPos 的批量操作中。 (此设置不保证对行执行该操作。如果行的状态SQL_ROW_ERROR在 IRD 行状态数组中,驱动程序可能无法在行中执行操作。)

  • SQL_ROW_IGNORE:使用 SQLSetPos 从批量操作中排除该行。

如果未设置数组的元素,则所有行都包含在批量操作中。 如果 ARD 的“SQL_DESC_ARRAY_STATUS_PTR”字段中的值为 null 指针,则所有行都包含在批量操作中;解释与指向有效数组且数组的所有元素SQL_ROW_PROCEED的指针相同。 如果数组中的元素设置为 SQL_ROW_IGNORE,则忽略行的行状态数组中的值不会更改。

还可以通过使用 SQL_ATTR_ROW_OPERATION_PTR 属性调用 SQLSetStmtAttr 来设置 ARD 中的此字段。

在 APD 中,此标头字段指向可由应用程序设置的值的参数操作数组,以指示在调用 SQLExecuteSQLExecDirect 时是否忽略这组参数。 数组中的元素可以包含以下值:

  • SQL_PARAM_PROCEED:参数集包含在 SQLExecuteSQLExecDirect 调用中。

  • SQL_PARAM_IGNORE:参数集从 SQLExecuteSQLExecDirect 调用中排除。

如果未设置数组的元素,则数组中的所有参数集都在 SQLExecuteSQLExecDirect 调用中使用。 如果 APD SQL_DESC_ARRAY_STATUS_PTR 字段中的值为 null 指针,则使用所有参数集;解释与指向有效数组且数组的所有元素都SQL_PARAM_PROCEED的指针相同。

还可以通过使用 SQL_ATTR_PARAM_OPERATION_PTR 属性调用 SQLSetStmtAttr 来设置 APD 中的此字段。

SQL_DESC_BIND_OFFSET_PTR [应用程序描述符]
此 SQLLEN * 标头字段指向绑定偏移量。 默认情况下,它设置为 null 指针。 如果此字段不是 null 指针,驱动程序将取消引用指针,并将取消引用值添加到描述符记录中具有非 null 值的每个延迟字段 (SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR,并在提取时SQL_DESC_OCTET_LENGTH_PTR) ,并在绑定时使用新的指针值。

绑定偏移量始终直接添加到SQL_DESC_DATA_PTR、SQL_DESC_INDICATOR_PTR和SQL_DESC_OCTET_LENGTH_PTR字段中的值。 如果偏移量更改为其他值,则新值仍会直接添加到每个描述符字段中的值。 新偏移量不会添加到字段值加上任何先前的偏移量。

此字段是 一个延迟字段:在设置时不使用它,但在以后需要确定数据缓冲区的地址时,驱动程序会使用它。

还可以通过使用 SQL_ATTR_ROW_BIND_OFFSET_PTR 属性调用 SQLSetStmtAttr 来设置 ARD 中的此字段。 还可以通过使用 SQL_ATTR_PARAM_BIND_OFFSET_PTR 属性调用 SQLSetStmtAttr 来设置 ARD 中的此字段。

有关详细信息,请参阅 SQLFetchScrollSQLBindParameter 中行绑定的说明。

SQL_DESC_BIND_TYPE [应用程序描述符]
此 SQLUINTEGER 标头字段设置用于绑定列或参数的绑定方向。

在 ARD 中,此字段指定在关联的语句句柄上调用 SQLFetchScrollSQLFetch 时的绑定方向。

若要为列选择列的按列绑定,请将此字段设置为SQL_BIND_BY_COLUMN (默认) 。

还可以使用 SQL_ATTR_ROW_BIND_TYPE 属性调用 SQLSetStmtAttr 来设置 ARD 中的此字段。

在 APD 中,此字段指定要用于动态参数的绑定方向。

若要为参数选择按列绑定,请将此字段设置为SQL_BIND_BY_COLUMN (默认) 。

还可以通过使用 SQL_ATTR_PARAM_BIND_TYPE 属性调用 SQLSetStmtAttr 来设置 APD 中的此字段。

SQL_DESC_COUNT [全部]
此 SQLSMALLINT 标头字段指定包含数据的最高编号记录的从 1 开始的索引。 驱动程序为描述符设置数据结构时,还必须设置SQL_DESC_COUNT字段以显示有多少记录是重要的。 当应用程序分配此数据结构的实例时,它不必指定要为其保留空间的记录数。 当应用程序指定记录的内容时,驱动程序会执行任何必需的操作,以确保描述符句柄引用足够大的数据结构。

SQL_DESC_COUNT不是绑定 (字段位于 ARD) 中的所有数据列的计数,也不是绑定 ((如果字段位于 APD) )的所有参数的计数,而是编号最高的记录数。 如果编号最高的列或参数未绑定,则SQL_DESC_COUNT更改为下一个编号最高的列或参数的数目。 如果具有小于最高编号列数的列或参数未绑定 (,方法是调用 TARGETValuePtr 参数设置为 null 指针的 SQLBindCol,或者将 ParameterValuePtr 参数设置为 null 指针的 SQLBindParameter) ,SQL_DESC_COUNT不会更改。 如果附加列或参数的绑定数字大于包含数据的最高编号的记录,则驱动程序会自动增加SQL_DESC_COUNT字段中的值。 如果使用 SQL_UNBIND 选项调用 SQLFreeStmt 来取消绑定所有列,则 ARD 和 IRD 中的SQL_DESC_COUNT字段将设置为 0。 如果使用 SQL_RESET_PARAMS 选项调用 SQLFreeStmt ,则 APD 和 IPD 中的SQL_DESC_COUNT字段将设置为 0。

应用程序可以通过调用 SQLSetDescField 来显式设置 SQL_DESC_COUNT 中的值。 如果显式减少 SQL_DESC_COUNT 中的值,则有效删除SQL_DESC_COUNT中数字大于新值的所有记录。 如果 SQL_DESC_COUNT 中的值显式设置为 0,并且字段位于 ARD 中,则释放除绑定书签列以外的所有数据缓冲区。

ARD 的此字段中的记录计数不包括绑定书签列。 取消书签列绑定的唯一方法是将 SQL_DESC_DATA_PTR 字段设置为 null 指针。

SQL_DESC_ROWS_PROCESSED_PTR [实现描述符]
在 IRD 中,此 SQLULEN * 标头字段指向一个缓冲区,该缓冲区包含调用 SQLFetchSQLFetchScroll 后提取的行数,或调用 SQLBulkOperationsSQLSetPos 执行的批量操作中受影响的行数,包括错误行。

在 IPD 中,此 SQLUINTEGER * 标头字段指向包含已处理参数集数(包括错误集)的缓冲区。 如果这是空指针,则不会返回任何数字。

SQL_DESC_ROWS_PROCESSED_PTR仅在为 IPD) 字段调用 SQLFetch 或 SQLFetchScroll (或 SQLExecuteSQLExecDirectSQLParamData (后返回SQL_SUCCESS或) SQL_SUCCESS_WITH_INFO后有效。 如果填充此字段指向的缓冲区的调用未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则缓冲区的内容是未定义的,除非它返回SQL_NO_DATA,在这种情况下,缓冲区中的值设置为 0。

还可以通过使用 SQL_ATTR_ROWS_FETCHED_PTR 属性调用 SQLSetStmtAttr 来设置 ARD 中的此字段。 还可以通过使用 SQL_ATTR_PARAMS_PROCESSED_PTR 属性调用 SQLSetStmtAttr 来设置 APD 中的此字段。

此字段指向的缓冲区由应用程序分配。 它是驱动程序设置的延迟输出缓冲区。 默认情况下,它设置为 null 指针。

记录字段

每个描述符包含一个或多个记录,这些记录由定义列数据或动态参数的字段组成,具体取决于描述符的类型。 每条记录都是单个列或参数的完整定义。

SQL_DESC_AUTO_UNIQUE_VALUE [IRD]
如果列是自动递增列,则此只读 SQLINTEGER 记录字段包含SQL_TRUE;如果该列不是自动递增列,则SQL_FALSE。 此字段是只读的,但基础自动递增列不一定是只读的。

SQL_DESC_BASE_COLUMN_NAME [IRD]
此只读 SQLCHAR * 记录字段包含结果集列的基列名称。 如果基列名称不存在 (为表达式的列) ,则此变量包含一个空字符串。

SQL_DESC_BASE_TABLE_NAME [IRD]
此只读 SQLCHAR * 记录字段包含结果集列的基表名称。 如果基表名称无法定义或不适用,则此变量包含一个空字符串。

SQL_DESC_CASE_SENSITIVE [实现描述符]
如果列或参数被视为排序规则和比较区分大小写,则此只读 SQLINTEGER 记录字段包含SQL_TRUE;如果该列不被视为排序规则和比较区分大小写,或者如果它是非字符列,则SQL_FALSE。

SQL_DESC_CATALOG_NAME [IRD]
此只读 SQLCHAR * 记录字段包含包含该列的基表的目录。 如果列是表达式或列是视图的一部分,则返回值与驱动程序相关。 如果数据源不支持目录或无法确定目录,则此变量包含一个空字符串。

SQL_DESC_CONCISE_TYPE [全部]
此 SQLSMALLINT 标头字段指定所有数据类型(包括 datetime 和 interval 数据类型)的简明数据类型。

SQL_DESC_CONCISE_TYPE、SQL_DESC_TYPE和SQL_DESC_DATETIME_INTERVAL_CODE字段中的值相互依赖。 每次设置其中一个字段时,还必须设置另一个字段。 可以通过调用 SQLBindColSQLBindParameterSQLSetDescField 来设置SQL_DESC_CONCISE_TYPE。 可以通过调用 SQLSetDescFieldSQLSetDescRec 来设置SQL_DESC_TYPE。

如果SQL_DESC_CONCISE_TYPE设置为 interval 或 datetime 数据类型以外的简洁数据类型,则SQL_DESC_TYPE字段设置为相同的值,并将SQL_DESC_DATETIME_INTERVAL_CODE字段设置为 0。

如果SQL_DESC_CONCISE_TYPE设置为简洁的日期/时间或间隔数据类型,则SQL_DESC_TYPE字段设置为相应的详细类型 (SQL_DATETIME或SQL_INTERVAL) ,并将SQL_DESC_DATETIME_INTERVAL_CODE字段设置为相应的子代码。

SQL_DESC_DATA_PTR [应用程序描述符和 IPD]
此 SQLPOINTER 记录字段指向一个变量,该变量将包含 APD) 的参数值 (或 ARD) (列值。 此字段是 延迟的字段。 在设置它时不使用它,但驱动程序稍后会使用它来检索数据。

如果调用 SQLBindCol 中的 TargetValuePtr 参数为空指针,或者通过调用 SQLSetDescFieldSQLSetDescRec 将 ARD 中的SQL_DESC_DATA_PTR字段设置为 null 指针,则 ARD 的 SQL_DESC_DATA_PTR 字段指定的列是未绑定的。 如果SQL_DESC_DATA_PTR字段设置为 null 指针,则其他字段不受影响。

如果对填充此字段指向的缓冲区的 SQLFetchSQLFetchScroll 的调用未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则缓冲区的内容未定义。

每当设置 APD、ARD 或 IPD 的SQL_DESC_DATA_PTR字段时,驱动程序都会检查SQL_DESC_TYPE字段中的值是否包含有效的 ODBC C 数据类型之一或特定于驱动程序的数据类型,以及影响数据类型的所有其他字段是否一致。 提示一致性检查是 IPD SQL_DESC_DATA_PTR 字段的唯一使用。 具体而言,如果应用程序设置 IPD 的SQL_DESC_DATA_PTR字段,然后对此字段调用 SQLGetDescField ,则不一定返回它设置的值。 有关详细信息,请参阅 SQLSetDescRec 中的“一致性检查”。

SQL_DESC_DATETIME_INTERVAL_CODE [全部]
当SQL_DATETIME或 SQL_DESC_TYPE SQL_INTERVAL时,此 SQLSMALLINT 记录字段包含特定日期/时间或间隔数据类型的子代码。 这适用于 SQL 和 C 数据类型。 代码由数据类型名称组成,其中“CODE”替换为日期时间类型) 的“TYPE”或“C_TYPE” (,或“CODE”替换为“INTERVAL”或“C_INTERVAL” () 间隔类型。

如果应用程序描述符中的SQL_DESC_TYPE和SQL_DESC_CONCISE_TYPE设置为 SQL_C_DEFAULT 且描述符不与语句句柄关联,则SQL_DESC_DATETIME_INTERVAL_CODE的内容未定义。

可以为下表中列出的 datetime 数据类型设置此字段。

日期/时间类型 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

可以为下表中列出的间隔数据类型设置此字段。

间隔类型 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

有关数据间隔和此字段的详细信息,请参阅 数据类型标识符和描述符

SQL_DESC_DATETIME_INTERVAL_PRECISION [全部]
如果SQL_INTERVAL SQL_DESC_TYPE字段,此 SQLINTEGER 记录字段包含间隔前导精度。 当SQL_DESC_DATETIME_INTERVAL_CODE字段设置为 interval 数据类型时,此字段将设置为默认间隔前导精度。

SQL_DESC_DISPLAY_SIZE [IRD]
此只读 SQLINTEGER 记录字段包含显示列中的数据所需的最大字符数。

SQL_DESC_FIXED_PREC_SCALE [实现描述符]
如果此列是精确数值列且具有固定精度和非零刻度,则此只读 SQLSMALLINT 记录字段设置为SQL_TRUE;如果该列不是精度和小数位数的精确数值列,则设置为SQL_FALSE。

SQL_DESC_INDICATOR_PTR [应用程序描述符]
在 ARD 中,此 SQLLEN * 记录字段指向指示器变量。 如果列值为 NULL,则此变量包含SQL_NULL_DATA。 对于 APD,指示器变量设置为 SQL_NULL_DATA以指定 NULL 动态参数。 否则,变量 (为零,除非 SQL_DESC_INDICATOR_PTR 和 SQL_DESC_OCTET_LENGTH_PTR 中的值是同一指针) 。

如果 ARD 中的SQL_DESC_INDICATOR_PTR字段为空指针,则会阻止驱动程序返回有关列是否为 NULL 的信息。 如果列为 NULL 且SQL_DESC_INDICATOR_PTR为 null 指针,则当驱动程序在调用 SQLFetch 或 SQLFetchScroll 后尝试填充缓冲区时,将返回 SQLSTATE 22002 (Indicator 变量,但未) 提供该变量。 如果对 SQLFetchSQLFetchScroll 的调用未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则缓冲区的内容未定义。

SQL_DESC_INDICATOR_PTR字段确定是否设置了SQL_DESC_OCTET_LENGTH_PTR指向的字段。 如果列的数据值为 NULL,驱动程序会将指示器变量设置为SQL_NULL_DATA。 然后,不会设置SQL_DESC_OCTET_LENGTH_PTR指向的字段。 如果在提取过程中未遇到 NULL 值,则将SQL_DESC_INDICATOR_PTR指向的缓冲区设置为零,并将SQL_DESC_OCTET_LENGTH_PTR指向的缓冲区设置为数据的长度。

如果 APD 中的SQL_DESC_INDICATOR_PTR字段为空指针,则应用程序不能使用此描述符记录来指定 NULL 参数。

此字段是 一个延迟字段:在设置该字段时不使用它,但驱动程序稍后会使用它来指示 ARD) 的可为空性 (,或确定 APD) 的可为 null 性 (。

SQL_DESC_LABEL [IRD]
此只读 SQLCHAR * 记录字段包含列标签或标题。 如果列没有标签,则此变量包含列名。 如果列未命名且未标记,则此变量包含一个空字符串。

SQL_DESC_LENGTH [全部]
此 SQLULEN 记录字段是字符串的最大或实际长度(以字符为单位)或二进制数据类型(以字节为单位)。 它是固定长度数据类型的最大长度,或可变长度数据类型的实际长度。 其值始终排除结束字符串的 null 终止字符。 对于类型为 SQL_TYPE_DATE、SQL_TYPE_TIME、SQL_TYPE_TIMESTAMP 或 SQL 间隔数据类型之一的值,此字段具有 datetime 或 interval 值的字符串表示形式的长度(以字符为单位)。

此字段中的值可能与 ODBC 2*.x* 中定义的“length”值不同。 有关详细信息,请参阅 附录 D:数据类型

SQL_DESC_LITERAL_PREFIX [IRD]
此只读 SQLCHAR * 记录字段包含驱动程序识别为此数据类型文本前缀的一个或多个字符。 此变量包含文本前缀不适用的数据类型的空字符串。

SQL_DESC_LITERAL_SUFFIX [IRD]
此只读 SQLCHAR * 记录字段包含驱动程序识别为此数据类型文本的后缀的一个或多个字符。 此变量包含文本后缀不适用的数据类型的空字符串。

SQL_DESC_LOCAL_TYPE_NAME [实现描述符]
此只读 SQLCHAR * 记录字段包含任何本地化 (本机语言) 数据类型的名称,该名称可能与数据类型的常规名称不同。 如果没有本地化名称,则返回空字符串。 此字段仅用于显示目的。

SQL_DESC_NAME [实现描述符]
行描述符中的此 SQLCHAR * 记录字段包含列别名(如果适用)。 如果列别名不适用,则返回列名。 在任一情况下,驱动程序在设置SQL_DESC_NAME字段时将SQL_DESC_UNNAMED字段设置为SQL_NAMED。 如果没有列名或列别名,驱动程序将在SQL_DESC_NAME字段中返回空字符串,并将SQL_DESC_UNNAMED字段设置为SQL_UNNAMED。

应用程序可以将 IPD 的SQL_DESC_NAME字段设置为参数名称或别名,以按名称指定存储过程参数。 (有关详细信息,请参阅 按名称 (命名参数) 绑定参数 ) IRD 的SQL_DESC_NAME字段为只读字段;SQLSTATE HY091 (如果应用程序尝试设置,将返回无效的描述符字段标识符) 。

在 IPD 中,如果驱动程序不支持命名参数,则此字段未定义。 如果驱动程序支持命名参数并且能够描述参数,则参数名称将在此字段中返回。

SQL_DESC_NULLABLE [实现描述符]
在 IRD 中,如果列可以有 NULL 值,则SQL_NULLABLE此只读 SQLSMALLINT 记录字段;如果列没有 NULL 值,则SQL_NO_NULLS;如果不知道列是否接受 NULL 值,则SQL_NULLABLE_UNKNOWN。 此字段与结果集列有关,而不是基列。

在 IPD 中,此字段始终设置为 SQL_NULLABLE,因为动态参数始终可为 null 且不能由应用程序设置。

SQL_DESC_NUM_PREC_RADIX [全部]
如果SQL_DESC_TYPE字段中的数据类型是近似数值数据类型,则此 SQLINTEGER 字段包含值 2,因为SQL_DESC_PRECISION字段包含位数。 如果SQL_DESC_TYPE字段中的数据类型是精确的数值数据类型,则此字段包含值 10,因为SQL_DESC_PRECISION字段包含十进制数字。 对于所有非数字数据类型,此字段设置为 0。

SQL_DESC_OCTET_LENGTH [全部]
此 SQLLEN 记录字段包含字符串或二进制数据类型的长度(以字节为单位)。 对于固定长度字符或二进制类型,这是实际长度(以字节为单位)。 对于可变长度字符或二进制类型,这是最大长度(以字节为单位)。 此值始终排除实现描述符的 null 终止字符的空间,并始终包括应用程序描述符的 null 终止字符的空间。 对于应用程序数据,此字段包含缓冲区的大小。 对于 APD,此字段仅为输出或输入/输出参数定义。

SQL_DESC_OCTET_LENGTH_PTR [应用程序描述符]
此 SQLLEN * 记录字段指向一个变量,该变量包含参数描述符) 动态参数 (的总长度(以字节为单位)或行描述符) (绑定列值。

对于 APD,对于除字符串和二进制以外的所有参数,将忽略此值;如果此字段指向SQL_NTS,则动态参数必须以 null 结尾。 为了指示绑定参数将是执行时的数据参数,应用程序会将 APD 的相应记录中的此字段设置为在执行时将包含值SQL_DATA_AT_EXEC或SQL_LEN_DATA_AT_EXEC宏结果的变量。 如果有多个此类字段,可将SQL_DESC_DATA_PTR设置为唯一标识参数的值,以帮助应用程序确定正在请求的参数。

如果 ARD 的OCTET_LENGTH_PTR字段为空指针,则驱动程序不会返回列的长度信息。 如果 APD 的SQL_DESC_OCTET_LENGTH_PTR字段为空指针,则驱动程序假定字符串和二进制值以 null 结尾。 (二进制值不应以 null 结尾,但应提供一个长度以避免截断。)

如果对填充此字段指向的缓冲区的 SQLFetchSQLFetchScroll 的调用未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则缓冲区的内容未定义。 此字段是 延迟的字段。 它不会在设置时使用,但稍后由驱动程序用来确定或指示数据的八进制数长度。

SQL_DESC_PARAMETER_TYPE [IPD]
对于输入参数,此 SQLSMALLINT 记录字段设置为SQL_PARAM_INPUT、输入/输出参数SQL_PARAM_INPUT_OUTPUT、输出参数SQL_PARAM_OUTPUT、输入/输出流式处理参数SQL_PARAM_INPUT_OUTPUT_STREAM或流式处理输出参数的SQL_PARAM_OUTPUT_STREAM。 默认情况下,它设置为SQL_PARAM_INPUT。

对于 IPD,如果驱动程序未自动填充 IPD,则默认情况下, 字段设置为 SQL_PARAM_INPUT, (SQL_ATTR_ENABLE_AUTO_IPD 语句属性SQL_FALSE) 。 应用程序应在 IPD 中为不是输入参数的参数设置此字段。

SQL_DESC_PRECISION [全部]
此 SQLSMALLINT 记录字段包含精确数字类型的位数、近似数值类型的 mantissa (二进制精度) 位数,或SQL_TYPE_TIME、SQL_TYPE_TIMESTAMP或SQL_INTERVAL_SECOND数据类型的秒小数部分中的位数。 对于所有其他数据类型,此字段未定义。

此字段中的值可能与 ODBC 2*.x* 中定义的“精度”值不同。 有关详细信息,请参阅 附录 D:数据类型

SQL_DESC_ROWVER [实现描述符]
此 SQLSMALLINTrecord 字段指示当行更新时,DBMS 是否自动修改列 (例如,SQL Server) 中类型为“timestamp”的列。 如果此列是行版本控制列,则此记录字段的值设置为SQL_TRUE,否则设置为SQL_FALSE。 此列属性类似于调用 IDENTIFIERType 为 SQL_ROWVER 的 SQLSpecialColumns ,以确定列是否自动更新。

SQL_DESC_SCALE [全部]
此 SQLSMALLINT 记录字段包含十进制和数值数据类型的定义小数位数。 对于所有其他数据类型,字段未定义。

此字段中的值可能与 ODBC 2*.x* 中定义的“scale”值不同。 有关详细信息,请参阅 附录 D:数据类型

SQL_DESC_SCHEMA_NAME [IRD]
此只读 SQLCHAR * 记录字段包含包含列的基表的架构名称。 如果列是表达式或列是视图的一部分,则返回值与驱动程序相关。 如果数据源不支持架构或无法确定架构名称,则此变量包含一个空字符串。

SQL_DESC_SEARCHABLE [IRD]
此只读 SQLSMALLINT 记录字段设置为以下值之一:

  • 如果列不能在 WHERE 子句中使用,则SQL_PRED_NONE。 (这与 ODBC 2*.x*.) 中的SQL_UNSEARCHABLE值相同

  • 如果列可以在 WHERE 子句中使用,但只能与 LIKE 谓词一起使用,则SQL_PRED_CHAR。 (这与 ODBC 2*.x*.) 中的SQL_LIKE_ONLY值相同

  • SQL_PRED_BASIC列是否可以在 WHERE 子句中使用除 LIKE 以外的所有比较运算符。 (这与 ODBC 2*.x*.) 中的SQL_EXCEPT_LIKE值相同

  • SQL_PRED_SEARCHABLE列是否可以在 WHERE 子句中使用任何比较运算符。

SQL_DESC_TABLE_NAME [IRD]
此只读 SQLCHAR * 记录字段包含包含此列的基表的名称。 如果列是表达式或列是视图的一部分,则返回值与驱动程序相关。

SQL_DESC_TYPE [全部]
此 SQLSMALLINT 记录字段指定除 datetime 和 interval 数据类型之外的所有数据类型的简洁 SQL 或 C 数据类型。 对于 datetime 和 interval 数据类型,此字段指定SQL_DATETIME或SQL_INTERVAL的详细数据类型。

每当此字段包含SQL_DATETIME或SQL_INTERVAL时,SQL_DESC_DATETIME_INTERVAL_CODE字段都必须包含简洁类型的相应子代码。 对于 datetime 数据类型,SQL_DESC_TYPE 包含 SQL_DATETIME,SQL_DESC_DATETIME_INTERVAL_CODE 字段包含特定 datetime 数据类型的子代码。 对于间隔数据类型,SQL_DESC_TYPE包含SQL_INTERVAL,SQL_DESC_DATETIME_INTERVAL_CODE字段包含特定间隔数据类型的子代码。

SQL_DESC_TYPE和SQL_DESC_CONCISE_TYPE字段中的值是相互依赖的。 每次设置其中一个字段时,还必须设置另一个字段。 可以通过调用 SQLSetDescFieldSQLSetDescRec 来设置SQL_DESC_TYPE。 可以通过调用 SQLBindColSQLBindParameterSQLSetDescField 来设置SQL_DESC_CONCISE_TYPE。

如果SQL_DESC_TYPE设置为 interval 或 datetime 数据类型以外的简洁数据类型,则SQL_DESC_CONCISE_TYPE字段设置为相同的值,SQL_DESC_DATETIME_INTERVAL_CODE字段设置为 0。

如果SQL_DESC_TYPE设置为详细日期/时间或间隔数据类型 (SQL_DATETIME或SQL_INTERVAL) ,并将SQL_DESC_DATETIME_INTERVAL_CODE字段设置为相应的子代码,则SQL_DESC_CONCISE TYPE 字段将设置为相应的简洁类型。 尝试将SQL_DESC_TYPE设置为某个简洁的日期时间或间隔类型,将返回 SQLSTATE HY021 (描述符信息) 不一致。

通过调用 SQLBindColSQLBindParameterSQLSetDescField 设置SQL_DESC_TYPE字段时,以下字段将设置为以下默认值,如下表所示。 同一记录的其余字段的值未定义。

SQL_DESC_TYPE 的值 隐式设置的其他字段
SQL_CHAR、SQL_VARCHAR、SQL_C_CHAR、SQL_C_VARCHAR SQL_DESC_LENGTH设置为 1。 SQL_DESC_PRECISION设置为 0。
SQL_DATETIME 当SQL_DESC_DATETIME_INTERVAL_CODE设置为SQL_CODE_DATE或SQL_CODE_TIME时,SQL_DESC_PRECISION设置为 0。 当它设置为 SQL_DESC_TIMESTAMP 时,SQL_DESC_PRECISION 设置为 6。
SQL_DECIMAL、SQL_NUMERIC、SQL_C_NUMERIC SQL_DESC_SCALE设置为 0。 SQL_DESC_PRECISION设置为相应数据类型的实现定义的精度。

有关如何手动绑定SQL_C_NUMERIC值的信息,请参阅 SQL 到 C:数值
SQL_FLOAT、SQL_C_FLOAT SQL_DESC_PRECISION设置为SQL_FLOAT实现定义的默认精度。
SQL_INTERVAL 当SQL_DESC_DATETIME_INTERVAL_CODE设置为 interval 数据类型时,SQL_DESC_DATETIME_INTERVAL_PRECISION设置为 2 (默认间隔前导精度) 。 当间隔具有秒分量时,SQL_DESC_PRECISION设置为 6 (默认间隔秒精度) 。

当应用程序调用 SQLSetDescField 来设置描述符的字段而不是调用 SQLSetDescRec 时,应用程序必须首先声明数据类型。 这样做时,将隐式设置上表中指示的其他字段。 如果隐式设置的任何值都是不可接受的,则应用程序可以调用 SQLSetDescFieldSQLSetDescRec 来显式设置不可接受的值。

SQL_DESC_TYPE_NAME [实现描述符]
此只读 SQLCHAR * 记录字段包含数据源相关的类型名称 (例如“CHAR”、“VARCHAR”等) 。 如果数据类型名称未知,则此变量包含一个空字符串。

SQL_DESC_UNNAMED [实现描述符]
行描述符中的此 SQLSMALLINT 记录字段由驱动程序在设置SQL_DESC_NAME字段时设置为SQL_NAMED或SQL_UNNAMED。 如果SQL_DESC_NAME字段包含列别名,或者列别名不适用,驱动程序会将SQL_DESC_UNNAMED字段设置为SQL_NAMED。 如果应用程序将 IPD 的SQL_DESC_NAME字段设置为参数名称或别名,驱动程序会将 IPD 的SQL_DESC_UNNAMED字段设置为SQL_NAMED。 如果没有列名或列别名,驱动程序会将SQL_DESC_UNNAMED字段设置为SQL_UNNAMED。

应用程序可以将 IPD 的SQL_DESC_UNNAMED字段设置为SQL_UNNAMED。 如果应用程序尝试将 IPD 的SQL_DESC_UNNAMED字段设置为 SQL_NAMED,驱动程序) 返回 SQLSTATE HY091 (无效的描述符字段标识符。 IRD 的SQL_DESC_UNNAMED字段为只读;SQLSTATE HY091 (如果应用程序尝试设置,将返回无效的描述符字段标识符) 。

SQL_DESC_UNSIGNED [实现描述符]
如果列类型为无符号或非数值,则此只读 SQLSMALLINT 记录字段设置为SQL_TRUE;如果列类型为有符号,则SQL_FALSE。

SQL_DESC_UPDATABLE [IRD]
此只读 SQLSMALLINT 记录字段设置为以下值之一:

  • 如果结果集列为只读,则SQL_ATTR_READ_ONLY。

  • 如果结果集列是读写的,则SQL_ATTR_WRITE。

  • 如果不知道结果集列是否可更新,则SQL_ATTR_READWRITE_UNKNOWN。

SQL_DESC_UPDATABLE描述结果集中列的可更新性,而不是基表中的列。 此结果集列所基于的基表中列的可更新性可能不同于此字段中的值。 列是否可更新取决于数据类型、用户权限和结果集本身的定义。 如果不清楚列是否可更新,应返回SQL_ATTR_READWRITE_UNKNOWN。

一致性检查

每当应用程序传入 ARD、APD 或 IPD SQL_DESC_DATA_PTR 字段的值时,驱动程序都会自动执行一致性检查。 如果任何字段与其他字段不一致, SQLSetDescField 将返回 SQLSTATE HY021 (描述符信息不一致) 。 有关详细信息,请参阅 SQLSetDescRec 中的“一致性检查”。

有关以下方面的信息 请参阅
绑定列 SQLBindCol 函数
绑定参数 SQLBindParameter 函数
获取描述符字段 SQLGetDescField 函数
获取多个描述符字段 SQLGetDescRec 函数
设置多个描述符字段 SQLSetDescRec 函数

另请参阅

ODBC 头文件
ODBC API 参考