Sdílet prostřednictvím


Umístěné aktualizace (ODBC)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed InstanceAzure Synapse AnalyticsPlatform Platform System (PDW)

Rozhraní ODBC podporuje dvě metody pro provádění umístěných aktualizací kurzorem:

  • SQLSetPos

  • KLAUZULE WHERE CURRENT OF

Častějším přístupem je použití SQLSetPos. Má následující možnosti.

SQL_POSITION
Umístí kurzor na konkrétní řádek v aktuální sadě řádků.

SQL_REFRESH
Aktualizuje proměnné programu vázané na sloupce sady výsledků s hodnotami z řádku, na který je kurzor aktuálně umístěn.

SQL_UPDATE
Aktualizuje aktuální řádek kurzoru hodnotami uloženými v proměnných programu vázanými na sloupce sady výsledků.

SQL_DELETE
Odstraní aktuální řádek v kurzoru.

sqlSetPos lze použít s libovolnou sadou výsledků příkazu, pokud jsou atributy kurzoru příkazu nastaveny tak, aby používaly kurzory serveru. Sloupce sady výsledků musí být vázané na proměnné programu. Jakmile aplikace načte řádek, volá SQLSetPos(SQL_POSITION) pro umístění kurzoru na řádek. Aplikace pak může volat SQLSetPos(SQL_DELETE), aby odstranila aktuální řádek, nebo může přesunout nové datové hodnoty do vázaných programových proměnných a volat SQLSetPos(SQL_UPDATE) pro aktualizaci aktuálního řádku.

Aplikace mohou aktualizovat nebo odstranit libovolný řádek v sadě řádků pomocí SQLSetPos. Volání SQLSetPos je praktickou alternativou k vytvoření a spuštění příkazu SQL. SQLSetPos pracuje s aktuální sadou řádků a lze ji použít až po volání SQLFetchScroll.

Velikost sady řádků je nastavena voláním SQLSetStmtAttr s argumentem atributu SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos používá novou velikost sady řádků, ale pouze po volání SQLFetch nebo SQLFetchScroll. Pokud se například změní velikost sady řádků, volá se sqlSetPos a pak se volá SQLFetch nebo SQLFetchScroll. Volání SQLSetPos používá starou velikost sady řádků, ale SQLFetch nebo SQLFetchScroll používá novou velikost sady řádků.

První řádek v sadě řádků je číslo řádku 1. Argument RowNumber v SQLSetPos musí identifikovat řádek v sadě řádků; to znamená, že jeho hodnota musí být v rozsahu od 1 do počtu řádků, které byly naposledy načteny. Může to být menší než velikost sady řádků. Pokud je argument RowNumber 0, operace se vztahuje na každý řádek v sadě řádků.

Operace odstranění SQLSetPos způsobí, že zdroj dat odstraní jeden nebo více vybraných řádků tabulky. Chcete-li odstranit řádky s SQLSetPos, aplikace volá SQLSetPos s operací nastavenou na SQL_DELETE a RowNumber nastavený na počet řádků k odstranění. Pokud je argument RowNumber 0, odstraní se všechny řádky v sadě řádků.

Po sqlSetPos vrátí odstraněný řádek aktuální řádek a jeho stav je SQL_ROW_DELETED. Řádek nelze použít v žádných dalších pozičních operacích, jako jsou volání SQLGetData nebo SQLSetPos.

Při odstranění všech řádků sady řádků (RowNumber je rovno 0), může aplikace zabránit ovladači odstranit určité řádky pomocí pole operace řádku stejně jako pro operaci aktualizace SQLSetPos.

Každý odstraněný řádek by měl být řádek, který existuje v sadě výsledků. Pokud byly vyrovnávací paměti aplikace vyplněny načtením a pokud bylo zachováno pole stavu řádku, neměly by se jeho hodnoty na každé z těchto pozic řádků SQL_ROW_DELETED, SQL_ROW_ERROR ani SQL_ROW_NOROW.

Umístěné aktualizace lze provést také pomocí klauzule WHERE CURRENT OF v příkazech UPDATE, DELETE a INSERT. WHERE CURRENT OF vyžaduje název kurzoru, který ODBC vygeneruje při volání SQLGetCursorName funkce, nebo který můžete určit voláním SQLSetCursorName. Následující obecné kroky slouží k provedení aktualizace WHERE CURRENT OF v aplikaci ODBC:

  • Volání SQLSetCursorName k vytvoření názvu kurzoru pro popisovač příkazu.

  • Sestavte příkaz SELECT s klauzulí FOR UPDATE OF a spusťte ho.

  • Volání SQLFetchScroll načtení řádku nebo načtení řádku SQLFetch.

  • Voláním SQLSetPos (SQL_POSITION) umístěte kurzor na řádek.

  • Sestavte a spusťte příkaz UPDATE s klauzulí WHERE CURRENT OF pomocí sady názvů kurzoru s SQLSetCursorName.

Alternativně můžete volat SQLGetCursorName po spuštění příkazu SELECT místo volání SQLSetCursorName před spuštěním příkazu SELECT. SQLGetCursorName vrátí výchozí název kurzoru přiřazený rozhraním ODBC, pokud nenastavíte název kurzoru pomocí SQLSetCursorName.

SQLSetPos se upřednostňuje před umístěním WHERE CURRENT OF, pokud používáte kurzory serveru. Pokud používáte statický, aktualizovatelný kurzor s knihovnou kurzorů ODBC, knihovna kurzorů implementuje where CURRENT OF aktualizace přidáním klauzule WHERE s klíčovými hodnotami podkladové tabulky. To může způsobit nezamýšlené aktualizace, pokud klíče v tabulce nejsou jedinečné.

Viz také

použití kurzorů (ODBC)