提取数据的行

要提取一行数据,应用程序会调用 SQLFetch。 可以使用任何类型的游标调用 SQLFetch,但它只会将行集游标沿仅向前方向移动。 SQLFetch 将游标前进到下一行,并返回与调用 SQLBindCol 绑定的任何列的数据。 当游标到达结果集的末尾时,SQLFetch 将返回 SQL_NO_DATA。 有关调用 SQLFetch 的示例,请参阅使用 SQLBindCol

确切地说,SQLFetch 的实现方式特定于驱动程序,但一般模式是驱动程序从数据源中检索任何绑定列的数据,根据绑定变量的类型对其进行转换,并将转换后的数据置于这些变量中。 如果驱动程序无法转换任何数据,SQLFetch 将返回错误。 应用程序可以继续提取行,但当前行的数据丢失。 未绑定列的数据会发生什么情况取决于驱动程序,但大多数驱动程序将检索并丢弃它,或者根本不检索它。

驱动程序还设置已绑定的任何长度/指示器缓冲区的值。 如果列的数据值为 NULL,驱动程序会将相应的长度/指示器缓冲区设置为 SQL_NULL_DATA。 如果数据值不为 NULL,驱动程序会在转换后将长度/指示器缓冲区设置为数据的字节长度。 如果无法确定此长度(有时会出现由多个函数调用检索长数据的情况),驱动程序会将长度/指示器缓冲区设置为 SQL_NO_TOTAL。 对于固定长度数据类型(如整数和日期结构),字节长度是数据类型的大小。

对于可变长度数据(如字符和二进制数据),驱动程序将根据绑定到列的缓冲区的字节长度检查转换后的数据的字节长度;缓冲区的长度在 SQLBindColBufferLength 参数中指定。 如果转换后的数据的字节长度大于缓冲区的字节长度,驱动程序会截断要容纳在缓冲区中的数据,在长度/指示器缓冲区中返回未截断的长度,返回 SQL_SUCCESS_WITH_INFO,并将 SQLSTATE 01004(截断的数据)置于诊断中。 唯一的例外是,SQLFetch 返回时截断可变长度书签,从而返回 SQLSTATE 22001(字符串数据,右截断)。

固定长度的数据永远不会截断,因为驱动程序假设绑定缓冲区的大小是数据类型的大小。 数据截断往往很少见,因为应用程序通常会绑定足够大的缓冲区来保存整个数据值;它从元数据中确定必要的大小。 但是,应用程序可能会显式绑定一个它知道太小的缓冲区。 例如,它可以检索并显示部分说明的前 20 个字符或长文本列的前 100 个字符。

字符数据在返回到应用程序之前必须由驱动程序以 null 结尾,即使它已被截断也是如此。 null 终止字符不包含在返回的字节长度中,但需要绑定缓冲区中的空间。 例如,假设应用程序使用由 ASCII 字符集中的字符数据组成的字符串,驱动程序有 50 个字符的数据要返回,并且应用程序的缓冲区长度为 25 个字节。 在应用程序的缓冲区中,驱动程序返回前 24 个字符,后跟 null 终止字符。 在长度/指示器缓冲区中,它还返回 50 的字节长度。

在执行创建结果集的语句之前,应用程序可以通过设置 SQL_ATTR_MAX_ROWS 语句属性来限制结果集中的行数。 例如,应用程序中用于设置表格格式的预览模式只需要足够的数据来显示报告的第一页。 通过限制结果集的大小,此类功能运行速度更快。 此语句属性旨在减少网络流量,可能不受所有驱动程序支持。