应用程序可以指定游标的特征,而不是指定游标类型(仅向前、静态、键集驱动或动态)。 为此,应用程序选择游标的可滚动性(通过设置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_CONCURRENCY不是SQL_CONCUR_READ_ONLY,则根据驱动程序定义的条件,将SQL_ATTR_SENSITIVITY设置为SQL_UNSPECIFIED或SQL_SENSITIVE。 |
| 将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)。 |