共用方式為


利用定位操作變更資料列

可更新資料指標支援資料修改陳述式,會透過資料指標更新資料列。在可更新資料指標中定位於資料列時,您可以執行更新或刪除作業,目標則是用來在該資料指標中建立目前資料列的基底資料表資料列。這些稱為定位更新。

定位更新會在開啟資料指標的相同連接上執行。這允許資料修改共用與資料指標相同的交易空間,並防止從資料指標所保留之鎖定的封鎖進行更新。

於資料指標執行定位更新的方法有二:

  • 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 子句執行 UPDATE 或 DELETE 陳述式,來引用 SQLGetCursorName 傳回的名稱。但並不建議使用這個方法。使用 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::SetDataIRowsetChange::DeleteRows 方法以執行定位更新作業。如果 OLE DB provider 支援 IRowsetUpdate::Update,以 IRowsetChange 方法進行的變更會被快取直到您呼叫 IRowsetUpdate::Update 為止。但如果 OLE DB provider 不支援 IRowsetUpdate::Update,以 IRowsetChange 方法進行的變更會立刻生效。

在 ADO 中,定位資料錄集之中的資料列時,系統會呼叫 Recordset 物件的 UpdateDelete 方法以進行定位更新作業。如果 OLE DB provider 支援 IRowsetUpdate::Update,以 Recordset 物件的 UpdateDelete 方法進行的變更會被快取,直到您呼叫 Recordset 物件的 UpdateBatch 方法為止。如果 OLE DB provider 不支援 IRowsetUpdate::Update,以 Recordset 物件的 UpdateDelete 方法進行的變更會立即生效。

請參閱

參考

概念