缓冲区

缓冲区是一种应用程序内存,用于在应用程序和驱动程序之间传递数据。 例如,可以使用 SQLBindCol 将应用程序缓冲区与结果集列关联或绑定到结果集列。 提取每一行时,会为这些缓冲区中的每个列返回数据。 输入缓冲区用于将数据从应用程序传递到驱动程序;输出缓冲区用于将数据从驱动程序返回到应用程序。

注意

如果 ODBC 函数返回 SQL_ERROR,则表示未定义该函数的任何输出参数的内容。

此讨论主要涉及不确定类型的缓冲区。 这些缓冲区的地址显示为 SQLPOINTER 类型的参数,例如 SQLBindCol 中的 TargetValuePtr 参数。 但是,此处讨论的某些项目,例如用于缓冲区的参数,也适用于用来将字符串传递给驱动程序的参数,例如 SQLTables 中的 TableName 参数。

这些缓冲区通常成对提供。 数据缓冲区用于传递数据本身,而长度/指示器缓冲区用于传递数据缓冲区中的数据长度或特殊值(如 SQL_NULL_DATA),指示数据为 NULL。 数据缓冲区中的数据长度与数据缓冲区本身的长度不同。 下图显示了数据缓冲区和长度/指示器缓冲区之间的关系。

Data buffer and length/indicator buffer

每当数据缓冲区包含可变长度数据(例如字符或二进制数据)时,都需要长度/指示器缓冲区。 如果数据缓冲区包含固定长度数据(例如整数或日期结构),由于已知数据长度,因此只需要长度/指示器缓冲区即可传递指示器值。 如果应用程序使用长度/指示器缓冲区和固定长度数据,驱动程序将忽略其中传递的任何长度。

数据缓冲区及其所包含数据的长度以字节为单位进行测量,而不是以字符为单位。 这种区别对于使用 ANSI 字符串的程序并不重要,因为字节和字符的长度相同。

当数据缓冲区表示驱动程序定义的描述符字段、诊断字段或属性时,应用程序应向驱动程序管理器指示函数参数的性质,该参数指示字段或属性的值。 应用程序通过在将字段或属性设置为下列值之一的任何函数调用中设置 length 参数来执行此操作。 (检索字段或属性值的函数也是如此,但参数指向其本身的设置函数的值时除外。)

  • 如果指示字段或属性值的函数参数是指向字符串的指针,则 length 参数表示字符串或 SQL_NTS 的长度。

  • 如果指示字段或属性值的函数参数是指向二进制缓冲区的指针,则应用程序会将 SQL_LEN_BINARY_ATTR (length) 宏的结果置于 length 参数中。 此操作会在 length 参数中放置负值。

  • 如果指示字段或属性值的函数参数是指向字符串或二进制字符串以外的值的指针,则 length 参数的值应为 SQL_IS_POINTER。

  • 如果指示字段或属性值的函数参数包含固定长度值,则 length 参数的值为 SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT 或 SQL_ISI_USMALLINT,具体视情况而定。

本部分包含以下主题。