相对和绝对滚动
SQLFetchScroll 中的大多数滚动选项将光标相对于当前位置或绝对位置定位。 SQLFetchScroll 支持提取下一个、前一个、第一个和最后一个行集,以及相对提取(从当前行集的开头提取行集 n 行)和绝对提取(从第 n 行开始提取行集)。 如果 n 在绝对提取中为负值,则从结果集末尾对行进行计数。 因此,绝对提取行 -1 表示提取从结果集中最后一行开始的行集。
动态游标检测插入到结果集中和从结果集中删除的行,因此,对于动态游标来说,除了从结果集的开头读取之外,没有简单的方法来检索特定编号的行,该方法可能很慢。 此外,绝对提取在动态游标中并不十分有用,因为行号会随着行插入和删除而改变;因此,连续获取相同的行号可能会产生不同的行。
仅将 SQLFetchScroll 用于其块游标功能(例如报告)的应用程序可能会一次传递结果集,仅使用用于提取下一行集的选项。 另一方面,基于屏幕的应用程序可以利用 SQLFetchScroll 的所有功能。 如果应用程序将行集大小设置为屏幕上显示的行数并将屏幕缓冲区绑定到结果集,则可以将滚动条操作直接转换为对 SQLFetchScroll 的调用。
滚动条操作 | SQLFetchScroll 滚动选项 |
---|---|
Page Up | SQL_FETCH_PRIOR |
Page Down | SQL_FETCH_NEXT |
向上移动一行 | SQL_FETCH_RELATIVE,FetchOffset 等于 -1 |
向下移动一行 | SQL_FETCH_RELATIVE,FetchOffset 等于 1 |
顶部滚动框 | SQL_FETCH_FIRST |
底部滚动框 | SQL_FETCH_LAST |
滚动框位于随机位置 | SQL_FETCH_ABSOLUTE |
此类应用程序还需要在滚动操作之后放置滚动框,这需要当前行号和行数。 对于当前行号,应用程序可以跟踪当前行号,也可以使用 SQL_ATTR_ROW_NUMBER 属性调用 SQLGetStmtAttr 来检索它。
游标中的行数(即结果集的大小)可用作诊断标头的 SQL_DIAG_CURSOR_ROW_COUNT 字段。 仅当调用 SQLExecute、SQLExecDirect 或 SQLMoreResult 后,才会定义此字段中的值。 此计数可以是近似计数,也可以是确切计数,具体取决于驱动程序的功能。 可以通过使用游标属性信息类型调用 SQLGetInfo 并检查是为游标类型返回 SQL_CA2_CRC_APPROXIMATE 还是 SQL_CA2_CRC_EXACT 位来确定驱动程序的支持。
动态游标从不支持确切的行计数。 对于其他类型的游标,驱动程序可以支持确切的行计数或近似的行计数,但不能同时支持这两者。 如果驱动程序不支持特定游标类型的确切行计数和近似行计数,则 SQL_DIAG_CURSOR_ROW_COUNT 字段包含到目前为止已提取的行数。 无论驱动程序支持什么,Operation 为 SQL_FETCH_LAST 的 SQLFetchScroll 都会导致 SQL_DIAG_CURSOR_ROW_COUNT 字段包含确切的行计数。