使用定位操作更改行
可更新游标支持通过游标更新行的数据修改语句。当定位在可更新游标中的某行上时,您可以执行更新或删除操作,这些操作是针对用于在游标中生成当前行的基表行的。称之为“定位更新”。
定位更新在打开游标的同一个连接上执行。这就允许数据修改操作共享与游标相同的事务空间,并且使游标持有的锁不会阻止更新。
在游标中执行定位更新的方法有两种:
- UPDATE 或 DELETE 语句中的 Transact-SQL WHERE CURRENT OF 子句。
- 数据库 API 定位更新函数或方法,如 ODBC SQLSetPos 函数。
使用 Transact-SQL 执行定位更新
Transact-SQL WHERE CURRENT OF 子句通常在需要根据游标中的特定行进行修改时用于 Transact-SQL 存储过程、触发器以及脚本。存储过程、触发器或脚本将:
- DECLARE 和 OPEN 游标。
- 使用 FETCH 语句定位到游标中的某一行。
- 用 WHERE CURRENT OF 子句执行 UPDATE 或 DELETE 语句。用 DECLARE 语句中的 cursor_name 作为 WHERE CURRENT OF 子句中的 cursor_name。
使用 API 执行定位更新
因为通过 OLE DB 和 ADO 函数和方法创建的游标没有名称,所以它们不能在 WHERE CURRENT OF 子句里使用。然而,ODBC 支持使用 SQLGetCursorName 函数为 API 服务器游标得到名称。在通过执行 Transact-SQL 语句设置游标属性并打开游标后,可使用 SQLGetCursorName 函数得到游标的名称。在游标中定位后,执行带有 WHERE CURRENT OF 子句(引用由 SQLGetCursorName 返回的名称)的 UPDATE 或 DELETE 语句。但不建议使用此方法。最好使用 ODBC API 中的定位更新函数。
数据库 API 支持两种不同的方法对 API 服务器游标执行定位操作。ODBC 支持一种模型,OLE DB 和 ADO 支持另一种。
在 ODBC 中,将游标中的列与程序变量绑定,然后在游标中定位到特定行。如果执行定位更新,在程序变量中将数据值更改为新值。调用 SQLSetPos 函数以执行定位操作。
此函数具有下列选项:
SQLSetPos(SQL_POSITION)
仅用于 ODBC,将 ODBC 游标定位到当前行集中的特定行。
SQLSetPos(SQL_REFRESH)
使用游标当前所定位行的值刷新被绑定到结果集列上的程序变量。
SQLSetPos(SQL_UPDATE)
使用绑定到结果集列上的程序变量中所存储的值来更新游标中的当前行。
SQLSetPos(SQL_DELETE)
删除游标中的当前行。
OLE DB 和 ADO 使用不同模型支持定位更新。
在 OLE DB 中,当定位于记录集里的某行时,调用 IRowsetChange::SetData 或 IRowsetChange::DeleteRows 方法进行定位更新。如果 OLE DB 访问接口支持 IRowsetUpdate::Update,则使用 IRowsetChange 方法所做的更改将被缓存,直到您调用 IRowsetUpdate::Update。如果 OLE DB 访问接口不支持 IRowsetUpdate::Update,则使用 IRowsetChange 方法所做的更改会立即完成。
在 ADO 中,当定位于行集里的某行时,调用 Recordset 对象的 Update 或 Delete 方法来执行定位更新。如果 OLE DB 访问接口支持 IRowsetUpdate::Update,则使用 Recordset 对象的 Update 或 Delete方法所做的更改将被缓存,直到您调用 Recordset 对象的 UpdateBatch 方法时。如果 OLE DB 访问接口不支持 IRowsetUpdate::Update,则使用 Recordset 对象的 Update 或 Delete 方法所做的更改会立即完成。
请参阅
其他资源
WHERE (Transact-SQL)
Positioned Updates (ODBC)