共用方式為


定位更新 (ODBC)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

ODBC 支援兩種方法,在數據指標中執行定位更新:

  • SQLSetPos

  • WHERE CURRENT OF 子句

較常見的方法是使用 SQLSetPos。 它有下列選項。

SQL_POSITION
將游標放在目前數據列集中的特定數據列上。

SQL_REFRESH
使用數據指標目前所在的數據列值,重新整理系結至結果集數據行的程式變數。

SQL_UPDATE
使用系結至結果集數據行的程式變數中儲存的值,更新數據指標中的目前數據列。

SQL_DELETE
刪除資料指標中的目前數據列。

當語句句柄數據指標屬性設定為使用伺服器數據指標時,SQLSetPos 可以與任何語句結果集搭配使用。 結果集數據行必須系結至程式變數。 一旦應用程式擷取數據列,就會呼叫 SQLSetPos(SQL_POSITION) 來將游標放在數據列上。 然後,應用程式可以呼叫 SQLSetPos(SQL_DELETE)來刪除目前的數據列,也可以將新的數據值移至系結的程式變數,並呼叫 SQLSetPos(SQL_UPDATE)來更新目前的數據列。

應用程式可以在資料列集中使用 SQLSetPos 更新或刪除任何資料列。 呼叫 SQLSetPos 是建構和執行 SQL 語句的便利替代方案。 SQLSetPos 會在目前的資料列集上運作,而且只能在呼叫 SQLFetchScroll 之後使用。

數據列集大小是由對 SQLSetStmtAttr 的呼叫所設定,其屬性自變數為 SQL_ATTR_ROW_ARRAY_SIZE。 SQLSetPos 會使用新的數據列集大小,但只有在呼叫 SQLFetchSQLFetchScroll 之後。 例如,如果數據列集大小已變更, 則會呼叫 SQLSetPos ,然後 呼叫 SQLFetchSQLFetchScroll 。 對 SQLSetPos 的呼叫會使用舊的數據列集大小,但 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 需要呼叫 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)