定位更新 (ODBC)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

ODBC 支持通过两种方法在游标中执行定位更新:

  • SQLSetPos

  • WHERE CURRENT OF 子句

更常见的方法是使用 SQLSetPos。 它具有以下选项。

SQL_POSITION
将游标定位到当前行集中的特定行。

SQL_REFRESH
使用游标当前所定位行的值刷新被绑定到结果集列上的程序变量。

SQL_UPDATE
使用绑定到结果集列上的程序变量中所存储的值来更新游标中的当前行。

SQL_DELETE
删除游标中的当前行。

当语句句柄游标属性设置为使用服务器游标时,SQLSetPos 可与任何语句结果集一起使用。 结果集列必须绑定到程序变量。 应用程序提取行后,它会调用 SQLSetPos (SQL_POSTION) 将光标置于行上。 随后应用程序可以调用 SQLSetPos(SQL_DELETE) 删除当前行,或者可以将新数据值移入绑定程序变量并调用 SQLSetPos(SQL_UPDATE) 更新当前行。

应用程序可以使用 SQLSetPos 更新或删除行集中的任何行。 调用 SQLSetPos 是构造和执行 SQL 语句的便捷替代方法。 SQLSetPos 在当前行集上运行,只能在调用 SQLFetchScroll 后使用。

行集大小通过调用 SQLSetStmtAttr 设置,其特性参数为 SQL_ATTR_ROW_ARRAY_SIZE。 SQLSetPos 使用新的行集大小,但仅在调用 SQLFetchSQLFetchScroll 之后。 例如,如果更改行集大小,则调用 SQLSetPos ,然后调用 SQLFetchSQLFetchScroll 。 对 SQLSetPos 的调用使用旧的行集大小,但 SQLFetchSQLFetchScroll 使用新的行集大小。

行集中的第一行的行编号为 1。 SQLSetPos 中的 RowNumber 参数必须标识行集中的行;也就是说,其值必须介于 1 和最近提取的行数之间。 这可能小于行集大小。 如果 RowNumber 为 0,将对行集中的所有行应用操作。

SQLSetPos 的删除操作使数据源删除表的一个或多个选定行。 若要使用 SQLSetPos 删除行,应用程序调用操作设置为 SQL_DELETE 且 RowNumber 设置为要删除的行号的 SQLSetPos 。 如果 RowNumber 为 0,将删除行集中的所有行。

SQLSetPos 返回后,已删除的行是当前行,其状态为SQL_ROW_DELETED。 行不能用于任何其他定位操作,例如对 SQLGetDataSQLSetPos 的调用。

删除行集的所有行 (RowNumber 等于 0) 时,应用程序可以通过使用行操作数组来阻止驱动程序删除某些行,就像 SQLSetPos 的更新操作一样。

每个删除的行都应该是结果集中存在的行。 如果应用程序缓冲区已被提取操作填充,并且保持了行状态数组,则所有这些行位置处的行值都不应为 SQL_ROW_DELETED、SQL_ROW_ERROR 或 SQL_ROW_NOROW。

通过在 UPDATE、DELETE 和 INSERT 语句中使用 WHERE CURRENT OF 子句,也可以执行定位更新。 WHERE CURRENT OF 需要 ODBC 在调用 SQLGetCursorName 函数时生成的游标名称,或者可以通过调用 SQLSetCursorName 进行指定。 以下是用于在 ODBC 应用程序中执行 WHERE CURRENT OF 更新的一般步骤:

  • 调用 SQLSetCursorName 以建立语句句柄的游标名称。

  • 生成包含 FOR UPDATE OF 子句的 SELECT 语句,并执行该语句。

  • 调用 SQLFetchScroll 以检索行集,或 调用 SQLFetch 检索行。

  • 调用 SQLSetPos (SQL_POSITION) ,将光标定位在行上。

  • 使用 SQLSetCursorName 设置的游标名称生成和执行具有 WHERE CURRENT OF 子句的 UPDATE 语句。

或者,可以在执行 SELECT 语句后调用 SQLGetCursorName ,而不是在执行 SELECT 语句之前调用 SQLSetCursorName 。 如果未使用 SQLSetCursorName 设置游标名称,SQLGetCursorName 将返回 ODBC 分配的默认游标名称。

使用服务器游标时,SQLSetPos 优先于 WHERE CURRENT OF。 如果使用 ODBC 游标库中的静态、可更新游标,该游标库通过添加一个 WHERE 子句(带有基础表的键值)实现 WHERE CURRENT OF 更新。 如果表中的键不唯一,这可能导致意外更新。

另请参阅

使用游标 (ODBC)