教你快速的掌握如何使用定位操作更改行
可更新游标支持通过游标更新行的数据修改语句。当定位在可更新游标中的某行上时,您可以执行更新或删除操作,这些操作针对用于在游标中建立当前行的基表行。这些就称为定位更新。
定位更新在打开游标的同一个连接上执行。这就允许数据修改共享与游标相同的事务空间,并且使游标保持的锁不会阻止更新。
有两种方法在游标中执行定位更新:
◆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 和 DB-Library API 函数和方法创建的游标没有名称,所以它们不能在 WHERE CURRENT OF 子句里使用。然而,ODBC 支持使用 SQLGetCursorName 函数为 API 服务器游标得到名称。在设置游标特性并通过执行 Transact-SQL 语句打开游标后,可使用 SQLGetCursorName 函数得到游标的名称。在游标中定位后,引用由 SQLGetCursorName 返回的名称执行带有 WHERE CURRENT OF 子句的 UPDATE 或 DELETE 语句。但不建议使用此方法。最好使用 ODBC API 中的定位更新函数。
数据库 API 支持两种不同的方法对API 服务器游标执行定位操作。ODBC 和 DB-Library 共享一个模型,OLE DB 和 ADO 共享另一个。
在 ODBC 和 DB-Library 中,将游标中的列与程序变量绑定,然后在游标中定位到特定行。如果执行定位更新,在程序变量中将数据值更改为新值。调用这些函数以执行定位操作:
◆ODBC:SQLSetPos 函数
◆DB-Library:dbcursor 函数
这些函数具有下列选项:
SQLSetPos(SQL_POSITION) |
仅用于 ODBC,将 ODBC 游标定位到当前行集中的特定行。
SQLSetPos(SQL_REFRESH)、dbcursor(CRS_REFRESH) |
使用游标当前所定位行的值刷新被绑定到结果集列上的程序变量。
SQLSetPos(SQL_UPDATE)、dbcursor(CRS_UPDATE) |
使用绑定到结果集列上的程序变量中所存储的值来更新游标中的当前行。
SQLSetPos(SQL_DELETE)、dbcursor(CRS_DELETE) |
删除游标中的当前行。
dbcursor(CRS_LOCKCC) |
仅用于 DB-Library,锁定当前行。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 方法所做的更改会立即完成。