缓冲区是用于在应用程序和驱动程序之间传递数据的任何应用程序内存片段。 例如,应用程序缓冲区可以与 SQLBindCol 的结果集列相关联,也可以绑定到结果集列。 提取每一行时,将为这些缓冲区中的每个列返回数据。 输入缓冲区 用于将数据从应用程序传递到驱动程序; 输出缓冲区 用于将数据从驱动程序返回到应用程序。
注释
如果 ODBC 函数返回SQL_ERROR,则未定义该函数的任何输出参数的内容。
此讨论主要涉及不确定类型的缓冲区。 这些缓冲区的地址显示为 SQLPOINTER 类型的参数,例如 SQLBindCol 中的 TargetValuePtr 参数。 但是,此处讨论的某些项(如用于缓冲区的参数)也适用于用于将字符串传递给驱动程序的参数,例如 SQLTables 中的 TableName 参数。
这些缓冲区通常成对。 数据缓冲区 用于传递数据本身,而 长度/指示器缓冲区 用于传递数据缓冲区中的数据长度或特殊值(如 SQL_NULL_DATA),指示数据为 NULL。 数据缓冲区中的数据长度与数据缓冲区本身的长度不同。 下图显示了数据缓冲区与长度/指示器缓冲区之间的关系。
每当数据缓冲区包含可变长度数据(如字符或二进制数据)时,都需要长度/指示器缓冲区。 如果数据缓冲区包含固定长度的数据(如整数或日期结构),则仅需要长度/指示器缓冲区才能传递指示器值,因为数据长度已已知。 如果应用程序使用长度/指示器缓冲区和固定长度数据,驱动程序将忽略传入它的任何长度。
数据缓冲区及其包含的数据的长度以字节为单位,而不是字符。 对于使用 ANSI 字符串的程序来说,这种区别并不重要,因为长度(以字节和字符为单位)是相同的。
当数据缓冲区表示驱动程序定义的描述符字段、诊断字段或属性时,应用程序应向驱动程序管理器指示函数参数的性质,该参数指示字段或属性的值。 应用程序通过在将字段或属性设置为下列值之一的任何函数调用中设置 length 参数来执行此作。 (对于检索字段或属性值的函数而言,情况相同,区别在于:对于设置函数而言,参数指向的是参数中自身的值)。
如果指示字段或属性的值的函数参数是指向字符串的指针,则 length 参数是字符串或SQL_NTS的长度。
如果指示字段或属性的值的函数参数是指向二进制缓冲区的指针,则应用程序会将 SQL_LEN_BINARY_ATTR(length) 宏的结果置于 长度 参数中。 这将在 长度 参数中放置负值。
如果指示字段或属性的值的函数参数是指向字符串或二进制字符串以外的值的指针,则 长度 参数应具有值SQL_IS_POINTER。
如果用于指示字段或属性值的函数参数包含固定长度的值,则 length 参数应设为 SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT 或 SQL_ISI_USMALLINT,具体情况视适用性而定。
本节包含以下主题。