数据长度是数据的字节长度,因为它存储在应用程序的数据缓冲区中,而不是存储在数据源中。 这种区别很重要,因为数据通常存储在数据缓冲区中的不同类型的数据中,而不是存储在数据源中。 因此,对于要发送到数据源的数据,在转换为数据源类型之前,这是数据的字节长度。 对于从数据源检索的数据,这是转换到数据缓冲区类型之后以及完成任何截断之前的数据的字节长度。
对于固定长度的数据(如整数或日期结构),数据的字节长度始终为数据类型的大小。 通常,应用程序会根据数据类型的大小分配数据缓冲区。 如果应用程序分配较小的缓冲区,则后果是未定义的,因为驱动程序假定数据缓冲区是数据类型的大小,并且不会截断数据以适应较小的缓冲区。 如果应用程序分配更大的缓冲区,则永远不会使用额外的空间。
对于可变长度数据(如字符或二进制数据),必须认识到数据的字节长度与缓冲区的字节长度不同,并且通常不同于缓冲区的字节长度。 缓冲区部分描述了这两个长度的关系。 如果数据的字节长度大于缓冲区的字节长度,驱动程序会将提取的数据截断到缓冲区的字节长度,并使用 SQLSTATE 01004(数据截断)返回SQL_SUCCESS_WITH_INFO。 但是,返回的字节长度是未构造数据的长度。
例如,假设应用程序为二进制数据缓冲区分配 50 字节。 如果驱动程序有 10 字节的二进制数据要返回,则会在缓冲区中返回这 10 个字节。 数据的字节长度为 10,缓冲区的字节长度为 50。 如果驱动程序有 60 字节的二进制数据要返回,它将数据截断为 50 字节,在缓冲区中返回这些字节,并返回SQL_SUCCESS_WITH_INFO。 数据的字节长度为 60(截断之前的长度),缓冲区的字节长度仍为 50。
将为截断的每个列创建诊断记录。 由于驱动程序创建这些记录和应用程序处理这些记录所需的时间,因此截断可能会降低性能。 通常,应用程序可以通过分配足够大的缓冲区来避免此问题,尽管使用长数据时可能无法执行此作。 发生数据截断时,应用程序有时可以分配更大的缓冲区并重新引用数据;在所有情况下,这都不属实。 如果在获取调用 SQLGetData 的数据时发生截断,应用程序不需要为已返回的数据调用 SQLGetData ;有关详细信息,请参阅 “获取长数据”。