定位更新 (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 會使用新的數據列集大小,但只有在呼叫 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 更新。 如果數據表中的索引鍵不是唯一的,這可能會導致非預期的更新。