共用方式為


定點更新 (ODBC)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

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 會使用新的資料列集大小,但只有在呼叫 SQLFetch SQLFetchScroll 之後。 例如,如果資料列集大小已變更, 則會呼叫 SQLSetPos ,然後 呼叫 SQLFetch SQLFetchScroll 。 對 SQLSetPos 的 呼叫會使用舊的資料列集大小,但 SQLFetch SQLFetchScroll 會使用新的資料列集 大小。

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

SQLSetPos 的刪除作業會讓資料來源刪除資料表的一或多個選定資料列。 若要使用 SQLSetPos 刪除資料列,應用程式會呼叫 SQLSetPos 並將 Operation 設定為 SQL_DELETE,並將 RowNumber 設定為要刪除的資料列數目。 如果 RowNumber 是 0,將會刪除資料列集內的所有資料列。

SQLSetPos 傳回之後,刪除的資料列就是目前的資料列,而且其狀態為 SQL_ROW_DELETED。 資料列不能用於任何其他定位作業,例如對 SQLGetData SQLSetPos 呼叫。

當您刪除資料列集的所有資料列時(RowNumber 等於 0),應用程式可以使用資料列作業陣列來防止驅動程式刪除特定資料列,就像 SQLSetPos 的更新作業一 樣。

刪除的每一個資料列都應該是存在於結果集內的資料列。 如果應用程式緩衝區是藉由擷取來填入,而且如果已維護資料列狀態陣列,則其每個資料列位置的值不應SQL_ROW_DELETED、SQL_ROW_ERROR或SQL_ROW_NOROW。

定點更新也可以使用 UPDATE、DELETE 和 INSERT 語句上的 WHERE CURRENT OF 子句來執行。 WHERE CURRENT OF 需要呼叫 SQLGetCursorName 函式時 ,ODBC 會產生的資料指標名稱,或者您可以藉由呼叫 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 子句來實作 WHERE CURRENT OF 更新。 如果資料表中的索引鍵不是唯一的,這可能會導致非預期的更新。

另請參閱

使用資料指標 (ODBC)