共用方式為


定位更新 (ODBC)

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 之後使用。

若要設定資料列集大小,請使用具有屬性引數 SQL_ATTR_ROW_ARRAY_SIZE 的 SQLSetStmtAttr 呼叫。SQLSetPos 會使用新的資料列集大小,但是只能在呼叫 SQLFetchSQLFetchScroll 之後使用。例如,如果資料列集大小變更了,就會呼叫 SQLSetPos,然後再呼叫 SQLFetchSQLFetchScrollSQLSetPos 的呼叫會使用舊的資料列集大小,但是 SQLFetchSQLFetchScroll 會使用新的資料列集大小。

資料列集中的第一個資料列是資料列號碼 1。SQLSetPos 中的 RowNumber 引數必須識別此資料列集中的資料列;也就是說,它的值必須在 1 與最近提取之資料列數之間的範圍內。這可能會小於資料列集大小。如果 RowNumber 是 0,此作業會套用到資料列集內的每一個資料列。

SQLSetPos 的刪除作業會讓資料來源刪除資料表的一或多個選定資料列。若要使用 SQLSetPos 刪除資料列,應用程式在呼叫 SQLSetPos 時,會將 Operation 設定為 SQL_DELETE 並將 RowNumber 設定為要刪除的資料列數。如果 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 CURRENT OF 更新,其方式是針對基礎資料表加入具有索引鍵值的 WHERE 子句。如果資料表內的索引鍵不是唯一的,這樣會造成非預期的更新。