提取一行数据

若要提取一行数据,应用程序会调用 SQLFetch。 可以使用任何类型的游标调用 SQLFetch,但它只会将行集游标移动到仅向前方向。 SQLFetch 将游标前进到下一行,并返回与调用 SQLBindCol 绑定的任何列的数据。 当游标到达结果集的末尾时, SQLFetch 将返回SQL_NO_DATA。 有关调用 SQLFetch 的示例,请参阅 Using 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 个字符,后跟空终止字符。 在长度/指示器缓冲区中,它返回的字节长度为 50。

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