游标特征和游标类型

应用程序可以指定游标的特征,而非指定游标类型(只进、静态、键集驱动或动态)。 为此,应用程序会选择游标的可滚动性(通过设置 SQL_ATTR_CURSOR_SCROLLABLE 语句属性)和敏感度(通过在语句句柄上打开游标之前设置 SQL_ATTR_CURSOR_SENSITIVITY 语句属性)。 然后,驱动程序选择可最有效提供应用程序所请求之特征的游标类型。

每当应用程序设置语句属性 SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_SCROLLABLE、SQL_ATTR_CURSOR_SENSITIVITY 或 SQL_ATTR_CURSOR_TYPE 中的任何一个时,驱动程序都会对这四个属性组中的其他语句属性进行任何必需的更改,以便其值保持一致。 因此,当应用程序指定游标特征时,驱动程序可以更改基于此隐式选择指示游标类型的属性;当应用程序指定类型时,驱动程序可以更改任何其他属性,以便与所选类型的特征一致。 有关这些语句属性的详细信息,请参阅 SQLSetStmtAttr 函数的说明。

设置语句属性以同时指定游标类型和游标特征的应用程序可能会获得游标,但是该游标不是满足应用程序需求之驱动程序中最有效的方法。

语句属性的隐式设置由驱动程序定义,只不过它必须遵循以下规则:

  • 只进游标永远不可滚动;请参阅 SQLSetStmtAttr 中 SQL_ATTR_CURSOR_SCROLLABLE 的定义。

  • 不感知游标永远不可更新(因此其并发为只读);这基于它们在 ISO SQL 标准中不感知游标的定义。

因此,语句属性的隐式设置发生在下表所述的情况中。

应用程序将属性设置为 其他属性进行隐式设置
SQL_ATTR_CONCURRENCY 设为 SQL_CONCUR_READ_ONLY SQL_ATTR_CURSOR_SENSITIVITY 设为 SQL_INSENSITIVE。
SQL_ATTR_CONCURRENCY 设为 SQL_CONCUR_LOCK、SQL_CONCUR_ROWVER 或 SQL_CONCUR_VALUES 根据驱动程序的定义,将 SQL_ATTR_CURSOR_SENSITIVITY 设为 SQL_UNSPECIFIED 或 SQL_SENSITIVE。 它永远不能设置为 SQL_INSENSITIVE,因为不感知游标始终为只读。
SQL_ATTR_CURSOR_SCROLLABLE 设为 SQL_NONSCROLLABLE SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_FORWARD_ONLY
SQL_ATTR_CURSOR_SCROLLABLE 设为 SQL_SCROLLABLE 根据驱动程序的指定,将 SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_STATIC、SQL_CURSOR_KEYSET_DRIVEN 或 SQL_CURSOR_DYNAMIC。 它永远不能设置为 SQL_CURSOR_FORWARD_ONLY。
SQL_ATTR_CURSOR_SENSITIVITY 设为 SQL_INSENSITIVE SQL_ATTR_CONCURRENCY 设为 SQL_CONCUR_READ_ONLY。

SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_STATIC。
SQL_ATTR_CURSOR_SENSITIVITY 设为 SQL_SENSITIVE 根据驱动程序的指定,将 SQL_ATTR_CONCURRENCY 设为 SQL_CONCUR_LOCK、SQL_CONCUR_ROWVER 或 SQL_CONCUR_VALUES。 它永远不能设置为 SQL_CONCUR_READ_ONLY。

根据驱动程序的指定,将 SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_FORWARD_ONLY、SQL_CURSOR_STATIC、SQL_CURSOR_KEYSET_DRIVEN 或 SQL_CURSOR_DYNAMIC。
SQL_ATTR_CURSOR_SENSITIVITY 设为 SQL_UNSPECIFIED 根据驱动程序的指定,将 SQL_ATTR_CONCURRENCY 设为 SQL_CONCUR_READ_ONLY、SQL_CONCUR_LOCK、SQL_CONCUR_ROWVER 或 SQL_CONCUR_VALUES。

根据驱动程序的指定,将 SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_FORWARD_ONLY、SQL_CURSOR_STATIC、SQL_CURSOR_KEYSET_DRIVEN 或 SQL_CURSOR_DYNAMIC。
SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_DYNAMIC SQL_ATTR_SCROLLABLE 设为 SQL_SCROLLABLE。

SQL_ATTR_CURSOR_SENSITIVITY 设为 SQL_SENSITIVE。 (但前提是 SQL_ATTR_CONCURRENCY 不等于 SQL_CONCUR_READ_ONLY。可更新的动态游标始终对其自身事务中所做的更改敏感。)
SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_FORWARD_ONLY SQL_ATTR_CURSOR_SCROLLABLE 设为 SQL_NONSCROLLABLE。
SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_KEYSET_DRIVEN SQL_ATTR_SCROLLABLE 设为 SQL_SCROLLABLE。

SQL_ATTR_SENSITIVITY 设为 SQL_UNSPECIFIED 或 SQL_SENSITIVE(依据驱动程序定义的条件,如果 SQL_ATTR_CONCURRENCY 不是 SQL_CONCUR_READ_ONLY)。
SQL_ATTR_CURSOR_TYPE 设为 SQL_CURSOR_STATIC SQL_ATTR_SCROLLABLE 设为 SQL_SCROLLABLE。

SQL_ATTR_SENSITIVITY 设为 SQL_INSENSITIVE(如果 SQL_ATTR_CONCURRENCY 为 SQL_CONCUR_READ_ONLY)。

SQL_ATTR_SENSITIVITY 设为 SQL_UNSPECIFIED 或 SQL_SENSITIVE(如果 SQL_ATTR_CONCURRENCY 不是 SQL_CONCUR_READ_ONLY)。