定位更新 (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 之後使用。

資料列集大小是由具有屬性引數的 SQLSetStmtAttr 呼叫來設定SQL_ATTR_ROW_ARRAY_SIZE。 SQLSetPos 會使用新的資料列集大小,但只有在呼叫 SQLFetchSQLFetchScroll之後。 例如,如果資料列集大小變更,則會呼叫SQLSetPos,然後呼叫SQLFetch 或 SQLFetchScrollSQLSetPos 的呼叫會使用舊的資料列集大小,但 SQLFetchSQLFetchScroll 會使用新的資料列集大小。

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

SQLSetPos的刪除作業會使資料來源刪除資料表的一或多個選取的資料列。 若要使用 SQLSetPos刪除資料列,應用程式會呼叫將 Operation 設為 SQL_DELETE 的 SQLSetPos ,並將 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 子句。 如果資料表內的索引鍵不是唯一的,這樣會造成非預期的更新。

另請參閱

使用資料指標 (ODBC)