SQLSetPos függvény

Megfelelőség
Bemutatott verzió: ODBC 1.0 Szabványoknak megfelelés: ODBC

Summary
Az SQLSetPos beállítja a kurzor pozícióját egy sorhalmazban, és lehetővé teszi az alkalmazás számára, hogy frissítse az adatokat a sorhalmazban, vagy frissítse vagy törölje az eredményhalmazt.

Syntax

  
SQLRETURN SQLSetPos(  
      SQLHSTMT        StatementHandle,  
      SQLSETPOSIROW   RowNumber,  
      SQLUSMALLINT    Operation,  
      SQLUSMALLINT    LockType);  

Arguments

StatementHandle
[Bemenet] Utasításkezelő.

RowNumber
[Bemenet] A sorhalmazban lévő sor helye, amelyen az Operation argumentummal meghatározott műveletet kell végrehajtani. Ha a RowNumber értéke 0, a művelet a sorhalmaz minden sorára érvényes.

További információért lásd: "Hozzászólások."

Művelet
[Bemenet] A végrehajtás művelete:

SQL_POSITION SQL_REFRESH SQL_UPDATE SQL_DELETE

Note

Az Operation argument SQL_ADD értéke az ODBC 3.x esetében lejáratotlanult. Az ODBC 3.x drivereknek támogatniuk kell a SQL_ADD-t a visszafelé kompatibilitás érdekében. Ezt a funkciót egy SQLBulkOperations hívás váltotta fel, amelynek művelete SQL_ADD. Amikor egy ODBC 3.x alkalmazás ODBC 2.x illevezetővel dolgozik, a Driver Manager egy SQL_ADD műveletű SQLBulkOperations hívást SQL_ADD művelettel rendelkező SQLBulkOperations hívást képez ki.

További információért lásd: "Hozzászólások".

Zártípus
[Bemenet] Megadja, hogyan lehet zárolni a sort az Operation argumentumban megadott művelet végrehajtása után.

SQL_LOCK_NO_CHANGE SQL_LOCK_EXCLUSIVE SQL_LOCK_UNLOCK

További információért lásd: "Hozzászólások".

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR vagy SQL_INVALID_HANDLE.

Diagnostics

Amikor az SQLSetPos SQL_ERROR vagy SQL_SUCCESS_WITH_INFO értéket ad, egy hozzárendelt SQLSTATE értéket lehet megszerezni azzal, hogy az SQLGetDiagRec hívása egy SQL_HANDLE_STMT HandleType és egy HandleType (StatementHandle) segítségével. Az alábbi táblázat felsorolja az SQLSetPos által gyakran visszaadott SQLSTATE értékeket, és mindegyiket elmagyarázza ezen függvény kontextusában; a "(DM)" jelölés megelőzi a Driver Manager által visszaadott SQLSTATE-leírásokat. Az egyes SQLSTATE-értékekhez társított visszatérési kód SQL_ERROR, kivéve, ha másként van feltüntetve.

Minden olyan SQLSTATE-nél, amely SQL_SUCCESS_WITH_INFO vagy SQL_ERROR vissza tud adni (kivéve a 01xxx SQLSTATE-eket), SQL_SUCCESS_WITH_INFO akkor jelenik meg, ha hiba egy vagy több, de nem az összes sorban történik egy többsoros műveletben, és SQL_ERROR akkor jelenik meg, ha hiba egysoros műveletnél is előfordul.

SQLSTATE Hiba Description
01000 Általános figyelmeztetés Illesztőprogram-specifikus tájékoztató üzenet. (A függvény SQL_SUCCESS_WITH_INFO ad vissza.)
01001 Kurzorművelet ütközése Az Operation érv SQL_DELETE vagy SQL_UPDATE volt, és egyetlen sort vagy több sort sem töröltek vagy frissítettek. (További információért több sor frissítéseiről lásd az SQLSetStmtAttr SQL_ATTR_SIMULATE_CURSOR attribútumának leírását.) (A függvény SQL_SUCCESS_WITH_INFO.)

Az Operation érv SQL_DELETE vagy SQL_UPDATE volt, és a művelet az optimista egyidejű működés miatt kudarcot vallott. (A függvény SQL_SUCCESS_WITH_INFO ad vissza.)
01004 String adat jobb vágatának levágása Az Operation érve SQL_REFRESH volt, és egy oszlop vagy oszlop esetén visszaadott string vagy bináris adat, amelynek adattípusa SQL_C_CHAR vagy SQL_C_BINARY, az nem üres karakter vagy nem NULL bináris adatok lerövidítését eredményezte.
01S01 Hiba a sorban A RowNumber argumentum 0 volt, és hiba történt egy vagy több sorban az Operation argumentussal meghatározott művelet végrehajtása során.

(SQL_SUCCESS_WITH_INFO akkor jelenik meg, ha hiba egy vagy több, de nem az összes sorban történik egy többsoros műveletben, és SQL_ERROR akkor jelenik meg, ha hiba egysoros műveletnél történik.)

(Ez az SQLSTATE csak akkor jelenik meg, ha az SQLExtendedFetch után hívják az SQLSetPos-t, ha az illesztőprogram egy ODBC 2.x illezőgép, és a kurzorkönyvtárat nem használják.)
01S07 Tört csonkolás Az Operation argumentum SQL_REFRESH volt, az alkalmazáspuffer adattípusa nem volt SQL_C_CHAR vagy SQL_C_BINARY, és az egy vagy több oszlop alkalmazáspuffereibe visszaküldött adatokat lerövidítették. Számos adattípusok esetén a szám törtrész része lerövidített. Az idő-, időbélyeg- és intervallum adattípusok esetében, amelyek időkomponenst tartalmaznak, az idő törtrész részét lerövidítették.

(A függvény SQL_SUCCESS_WITH_INFO ad vissza.)
07006 Korlátozott adattípus-attribútumok megsértése Az eredményhalmazban lévő oszlop adatértéke nem volt átalakítható a TargetType által az SQLBindCol hívásában megadott adattípusra.
07009 Érvénytelen descriptor index Az Operation argument SQL_REFRESH vagy SQL_UPDATE volt, és egy oszlopot olyan oszlopszám kötött, amely nagyobb, mint az eredményhalmaz oszlopainak száma.
21S02 A származtatott tábla mértéke nem egyezik az oszloplistával Az érvelés művelet SQL_UPDATE volt, és egyetlen oszlop sem volt frissíthető, mert minden oszlop vagy korlátlan volt, csak olvasható, vagy a határhossz/indikátor puffer értéke SQL_COLUMN_IGNORE.
22001 Karakterlánc, jobb oldali csonkítás Az Operation érv SQL_UPDATE volt, és egy karakter vagy bináris érték hozzárendelése egy oszlophoz a nem üres (karakterek esetén) vagy nem null (bináris esetén) karakterek vagy bájtok lerövidítését eredményezte.
22003 Numerikus érték a tartományon kívül Az Operation argument SQL_UPDATE volt, és egy numerikus érték hozzárendelése az eredményhalmazban egy oszlophoz az egész (nem a tört) rész lerövidítésére vezette.

Az Operation argument SQL_REFRESH volt, és egy vagy több kötött oszlop numerikus értékének visszaadása jelentős számjegyek elvesztését okozta.
22007 Érvénytelen dátum/idő formátum Az érv művelet SQL_UPDATE volt, és egy dátum- vagy időbélyeg érték hozzárendelése az eredményhalmazban egy oszlophoz az év, hónap vagy nap mező tartományon kívül volt.

Az Operation érv SQL_REFRESH volt, és ha visszaadták egy vagy több kötött oszlop dátum- vagy időbélyegértékét, az év, hónap vagy nap mező nem volt a hatótávolságon.
22008 Dátum/idő mező túlcsordulása Az Operáció érvelés SQL_UPDATE volt, és az adatok datetime aritmetika teljesítménye az eredményhalmaz egy oszlopába küldött adatokon azt eredményezte, hogy az eredmény egy dátumidőmező (az év, hónap, nap, óra, perc vagy második mező) kívül esik a mező megengedett értéktartományán, vagy érvénytelennek számított a gergely-naptár természetes dátumidő-szabályai alapján.

Az Operáció érve SQL_REFRESH volt, és az eredményhalmazból származó adatokon elért dátumidő aritmetika teljesítménye miatt egy dátumidő mező (év, hónap, nap, óra, perc vagy második mező) az eredmény megengedett értéktartományon kívül esik, vagy érvénytelen volt a Gergely-naptár természetes dátumidő-szabályai alapján.
22015 Intervallummező túlcsordult Az Operation argumentum SQL_UPDATE volt, és egy pontos numerikus vagy intervallum C típus hozzárendelése egy intervallum SQL adattípushoz jelentős számjegyek elvesztését okozta.

Az Operation érv SQL_UPDATE volt; amikor egy intervallum SQL típushoz rendeltek, nem volt ábrázolva a C típus értéke az intervallum SQL típusban.

Az Operation argumentum SQL_REFRESH volt, és egy pontos numerikus vagy intervallum SQL típus C intervallum típushoz való hozzárendelése jelentős számjegyek elvesztését okozta az élmezőben.

Az Operation érv SQL_ REFRESH volt; C intervallum típushoz való hozzárendeléskor nem volt az SQL típus értékének ábrázolása a C intervallum típusban.
22018 Érvénytelen karakterérték az öntött specifikációhoz Az Operation érv SQL_REFRESH volt; a C típus pontos vagy közelítő numerikus, dátumidő, vagy intervallum adattípus volt; az oszlop SQL típusa karakteradattípus volt; és az oszlopban lévő érték nem volt érvényes literális a kötött C típusból.

Az Operation érv SQL_UPDATE; az SQL típus pontos vagy közelítő numerikus, dátumidő, illetve intervallum adattípus volt; a C típus SQL_C_CHAR; és az oszlopban lévő érték nem volt a kötött SQL típus érvényes literálisa.
23000 Integritási kényszer megsértése Az érv, hogy a Művelet SQL_DELETE vagy SQL_UPDATE volt, és megsértették az integritási korlátot.
24000 Érvénytelen kurzorállapot A StatementHandle végrehajtott állapotban volt, de nem volt hozzá semmilyen eredményhalmaz.

(DM) A kurzor nyitva volt a StatementHandle-en, de az SQLFetch vagy SQLFetchScroll nem volt meghívva.

A kurzor nyitva volt a StatementHandle-en, és az SQLFetch vagy SQLFetchScroll is meghívták, de a kurzor az eredményhalmaz kezdete előtt vagy az eredményhalmaz vége után helyezkedett el.

Az argumentum művelet SQL_DELETE, SQL_REFRESH vagy SQL_UPDATE volt, és a kurzor az eredményhalmaz kezdete előtt vagy az eredményhalmaz vége után helyezkedett el.
40001 Szerializálási hiba A tranzakció egy erőforrás holtpontja miatt lett visszaállítva egy másik tranzakcióval.
40003 Az utasítás befejezése ismeretlen A társított kapcsolat a függvény végrehajtása során meghiúsult, és a tranzakció állapota nem határozható meg.
42000 Szintaxishiba vagy hozzáférés-megsértés Az illesztőprogram nem tudta a sort a szükséges módon zárolni az Operation argumentumban kért művelet végrehajtásához.

A meghajtó nem tudta lezárni a sort, ahogy azt a LockType argumentumban kérték.
44000 A CHECK OPTION megsértése Az Operation argumentum SQL_UPDATE, és a frissítést egy megtekintett táblán vagy a megtekintett táblából származtatott, amelyet WITH CHECK OPTION (WITH CHECK OPTION) jelöléssel hoztak létre, így egy vagy több sor már nem lesz jelen a megtekintett táblában.
HY000 Általános hiba Hiba történt, amely miatt nem volt konkrét SQLSTATE, és amelyhez nem definiáltak implementációspecifikus SQLSTATE-t. Az SQLGetDiagRec által a *MessageText pufferben visszaadott hibaüzenet leírja a hibát és annak okát.
HY001 Memóriafoglalási hiba Az illesztőprogram nem tudta lefoglalni a függvény végrehajtásának vagy befejezésének támogatásához szükséges memóriát.
HY008 A műveletet megszakították Az aszinkron feldolgozás engedélyezve lett a StatementHandle-ben. A függvényt hívták, és mielőtt befejezte volna a végrehajtást, az SQLCancel vagy SQLCancelHandle meghívása a StatementHandle-en, majd a függvényt ismét meghívták a StatementHandle-en.

A függvény meghívása megtörtént, és a végrehajtás befejezése előtt az SQLCancel vagy az SQLCancelHandle egy másik szálról lett meghívva a StatementHandle-ra egy többszálas alkalmazásból.
HY010 Függvényütemezési hiba (DM) A StatementHandle-hez társított kapcsolati leíróhoz aszinkron módon végrehajtó függvény lett meghívva. Ez az aszinkron függvény még akkor futott, amikor az SQLSetPos függvényt hívták.

(DM) A megadott StatementHandle nem volt végrehajtott állapotban. A függvényt anélkül hívták, hogy előbb az SQLExecDirect, SQLExecute vagy katalógus függvény hívták volna meg.

(DM) Egy aszinkron módon végrehajtó függvény (nem ez) lett meghívva az StatementHandle-hez , és a függvény meghívásakor továbbra is végrehajtó volt.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations vagy SQLSetPos lett meghívva az Utasításkezelőhöz , és SQL_NEED_DATA. Ezt a függvényt az összes adatvégrehajtási paraméter vagy oszlop adatküldése előtt hívták meg.

(DM) Az illezőprogram egy ODBC 2.x illezőgép volt, és az SQLSetPosStatementHandle miatt az SQLFetch hívása után lett meghívva.
HY011 Az attribútumot most nem lehet beállítani (DM) A sofőr ODBC 2.x illesztőgép volt; a SQL_ATTR_ROW_STATUS_PTR állítás attribútumot beállították; ekkor az SQLSetPos lett meghívva, mielőtt az SQLFetch, SQLFetchScroll vagy SQLExtendedFetch lett volna.
HY013 Memóriakezelési hiba A függvényhívás nem dolgozható fel, mert a mögöttes memóriaobjektumok nem érhetők el, esetleg a memóriahiány miatt.
HY090 Érvénytelen sztring vagy puffer hossza Az Operation argumentum SQL_UPDATE volt, az adatérték null mutató volt, és az oszlophossz nem volt 0, SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NULL_DATA, vagy nem volt kisebb vagy egyenlő SQL_LEN_DATA_AT_EXEC_OFFSET-vel.

Az Operation érv SQL_UPDATE volt; egy adatérték nem volt null mutató; a C adattípus SQL_C_BINARY vagy SQL_C_CHAR volt; és az oszlophossz értéke kevesebb volt, mint 0, de nem egyenlő SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NTS vagy SQL_NULL_DATA, vagy kevesebb vagy egyenlő SQL_LEN_DATA_AT_EXEC_OFFSET-vel.

A hossz/indikátor pufferben az érték SQL_DATA_AT_EXEC volt; az SQL típus SQL_LONGVARCHAR, SQL_LONGVARBINARY vagy egy hosszú, adatforrás-specifikus adattípus volt; és az SQLGetInfo SQL_NEED_LONG_DATA_LEN információs típusa "Y" volt.
HY092 Érvénytelen attribútumazonosító (DM) Az Operation argumentumhoz megadott érték érvénytelen volt.

(DM) A LockType argumentumhoz megadott érték érvénytelen volt.

Az Operation argument SQL_UPDATE vagy SQL_DELETE volt, és a SQL_ATTR_CONCURRENCY állítás attribútum SQL_ATTR_CONCUR_READ_ONLY volt.
HY107 Sor értéke a tartományon kívül A RowNumber argumentumhoz megadott érték nagyobb volt, mint a sorhalmazban lévő sorok száma.
HY109 Érvénytelen kurzorpozíció A StatementHandle kurzora csak előre irányul, így a kurzor nem volt a sorhalmazon belül helyezhető el. Lásd a SQL_ATTR_CURSOR_TYPE attribútum leírását az SQLSetStmtAttr adatbázisban.

Az Operation argumentum SQL_UPDATE, SQL_DELETE vagy SQL_REFRESH volt, és a RowNumber argumentummal azonosított sort törölték vagy nem hozták le.

(DM) A RowNumber érv 0 volt, az Operation érv pedig SQL_POSITION.

Az SQLSetPos az SQLBulkOperations és az SQLFetchScroll vagy SQLFetch hívása előtt lett meghívva.
HY117 A kapcsolat ismeretlen tranzakciós állapot miatt fel van függesztve. Csak a leválasztási és írásvédett függvények engedélyezettek. (DM) A felfüggesztett állapotról további információt az SQLEndTran függvényben talál.
HYC00 A választható funkció nem implementálva Az illesztőprogram vagy adatforrás nem támogatja az Operation argumentusban vagy a LockType argumentumban kért műveletet.
HYT00 Időtúllépés történt A lekérdezés időtúllépési időtartama lejárt, mielőtt az adatforrás visszaadta az eredményhalmazt. Az időtúli időszakot SQLSetStmtAttr segítségével állítják be SQL_ATTR_QUERY_TIMEOUT attribútummal .
HYT01 A kapcsolati időkorlát lejárt A kapcsolat időtúllépési időtartama lejárt, mielőtt az adatforrás válaszolt a kérésre. A kapcsolat időtúllépési időszaka az SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT keresztül van beállítva.
IM001 Az illesztőprogram nem támogatja ezt a függvényt (DM) Az StatementHandle-hez társított illesztőprogram nem támogatja a függvényt.
IM017 A lekérdezés aszinkron értesítési módban le van tiltva Az értesítési modell használata esetén a lekérdezés le van tiltva.
IM018 Az SQLCompleteAsync nem lett meghívva az előző aszinkron művelet végrehajtásához ezen a leírón. Ha a leíró előző függvényhívása SQL_STILL_EXECUTING ad vissza, és ha az értesítési mód engedélyezve van, az SQLCompleteAsync-et a leírón kell meghívni a művelet utófeldolgozásához és befejezéséhez.

Comments

Caution

Az utasítás részletéért, amely kimondja, hogy az SQLSetPos behívható, és arról, mit kell tennie az ODBC 2.x alkalmazások kompatibilitásához, lásd a Block Cursors, Scrollable Cursors és Backward Compatibility (Blokk kurzorok), Görgethető kurzorok és Visszafelé kompatibilitás.

RowNumber érv

A RowNumber argumentum megadja annak a sorszámnak a számát a sorhalmazban, amelyen az Operation argumentum által meghatározott műveletet kell végrehajtani. Ha a RowNumber értéke 0, a művelet a sorhalmaz minden sorára érvényes. A RowNumber értéknek 0-tól a sorhalmazban lévő sorszámig kell lennie.

Note

A C nyelvben a tömbök 0-alapúak, a RowNumber érve pedig 1-es. Például a sorhalmaz ötödik sorának frissítéséhez egy alkalmazás módosítja a sorhalmaz pufferét a tömbindexen 4, de megadja az 5-ös sorszámot .

Minden művelet a kurzort a RowNumber által megadott sorra helyezi. Az alábbi műveletekhez kurzor pozíció szükséges:

  • Pozícionáltam, frissítem és töröld az utasításokat.

  • Hívások SQLGetData-hoz.

  • SQLSetPos hívások az SQL_DELETE, SQL_REFRESH és SQL_UPDATE opciókkal.

Például, ha a RowNumber 2 egy SQLSetPos hívás esetén, amelynek művelete SQL_DELETE, akkor a kurzor a sorhalmaz második sorára kerül, és az a sor törlődik. A megvalósítás sor állapot tömbjében (amelyet a SQL_ATTR_ROW_STATUS_PTR mondattribútuma mutat) bejegyzése a második sorhoz SQL_ROW_DELETED-re változik.

Egy alkalmazás megadhat kurzor pozíciót, amikor az SQLSetPos-t hívja. Általában az SQLSetPos-t hívja a SQL_POSITION vagy SQL_REFRESH művelettel, hogy a kurzort pozícionálja egy pozicionált frissítési vagy törlési utasítás végrehajtása vagy az SQLGetData meghívása előtt.

Műveleti érv

Az Operation argument a következő műveleteket támogatja. Annak meghatározására, hogy mely opciókat támogatja egy adatforrás, egy alkalmazás az SQLGetInfo-t hívja a SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 vagy SQL_STATIC_CURSOR_ATTRIBUTES1 információtípussal (a kurzor típusától függően).

Művelet

argumentum
Operation
SQL_POSITION Az illesztővezető a kurzort a RowNumber által megadott sorra helyezi el.

A SQL_ATTR_ROW_OPERATION_PTR állítás attribútumával jelölt sorállapot tömbjének tartalmát figyelmen kívül hagyják a SQL_POSITION művelet esetén.
SQL_REFRESH Az illesztőprogram a kurzort a RowNumber által megadott sorra helyezi, és frissíti az adatokat a sorhalmaz puffereiben az adott sorban. További információért arról, hogyan ad vissza az illesztőprogram adatokat a sorhalmaz puffereiben, tekintse meg az SQLBindCol soronkénti és oszloponkénti kötésének leírásait.

Az SQLSetPos SQL_REFRESH művelettel frissíti a sorok állapotát és tartalmát a jelenlegi lehozott sorhalmazban. Ez magában foglalja a könyvjelzők frissítését is. Mivel a pufferekben lévő adatok frissülnek, de nem újrahasznosítanak, a sorhalmazban lévő tagság fix. Ez eltér attól a frissítéstől, amit az SQLFetchScroll hívása hajt végre, amelynek FetchOrientationje SQL_FETCH_RELATIVE és a RowNumber 0-nak felel meg, és amely visszaalakítja a sorhalmazt az eredményhalmazból, hogy megjelenítse a hozzáadott adatokat és eltávolíthassa a törölt adatokat, ha ezeket a műveleteket támogatja az illesztőgép és a kurzor.

Egy sikeres frissítés SQLSetPos-szal nem változtat SQL_ROW_DELETED sor státuszon. A sorhalmazon belül törölt sorok továbbra is töröltként lesznek jelölve a következő felhívásig. A sorok eltűnnek a következő felhívásnál, ha a kurzor támogatja a csomagolást (amikor egy következő SQLFetch vagy SQLFetchScroll nem adja vissza a törölt sorokat).

A hozzáadott sorok nem jelennek meg, amikor SQLSetPos-szal frissítik. Ez a viselkedés eltér az SQLFetchScroll-től , ahol a FetchType SQL_FETCH_RELATIVE és a RowNumber 0-nak felel meg, ami szintén frissíti a jelenlegi sorhalmazt, de hozzáadott rekordokat vagy törölt példányokat jelenít meg, ha ezeket a műveleteket a kurzor támogatja.

Egy sikeres frissítés SQLSetPos-szal megváltoztatja a SQL_ROW_ADDED sor státuszát SQL_ROW_SUCCESS-re (ha létezik a sorállapot tömb).

Egy sikeres frissítés az SQLSetPos-szal megváltoztatja a SQL_ROW_UPDATED sor státuszát a sor új státuszává (ha létezik a sorállapot tömbje).

Ha egy SQLSetPos műveletben hiba jelentkezik egy soron, a sor státusza SQL_ROW_ERROR-re van állítva (ha létezik a sorállapot tömb).

Egy kurzort SQL_CONCUR_ROWVER vagy SQL_CONCUR_VALUES SQL_ATTR_CONCURRENCY utasítás attribútummal nyitott meg, az SQLSetPos frissítése frissítheti az adatforrás által használt optimista párhuzamértékeket, hogy felismerje, hogy a sor megváltozott. Ha ez megtörténik, a sorverziók vagy értékek, amelyeket a kurzor egyszínűségének biztosítására használnak, frissülnek a sorhalmaz pufferei frissítése a szerverről. Ez minden frissített sornál történik.

A SQL_ATTR_ROW_OPERATION_PTR utasítás attribútumával jelölt sorállapot tömb tartalmát a SQL_REFRESH művelet esetében figyelmen kívül hagyjuk.
SQL_UPDATE Az illeszőr a kurzort a RowNumber által megadott sorra helyezi, és frissíti az alapul szolgáló adatsort a sorhalmaz puffereinek értékeivel (az SQLBindColTargetValuePtr argumentusával). Az adatok hosszát a hosszúság/indikátor pufferekből (az SQLBindColStrLen_or_IndPtr argumentusából) kéri le. Ha bármely oszlop hossza SQL_COLUMN_IGNORE, az oszlop nem frissül. A sor frissítése után az illesztőprogram megváltoztatja a sorállapot tömbjének megfelelő elemét SQL_ROW_UPDATED-re vagy SQL_ROW_SUCCESS_WITH_INFO-re (ha létezik a sor státusz tömb).

Driver-definiálva van a viselkedés, ha SQLSetPos-t SQL_UPDATE műveleti argumentummal egy olyan kurzoron hívnak, amely duplikált oszlopokat tartalmaz. Az illeszvezető visszavezethet egy driver-definiált SQLSTATE-et, frissítheti az eredményhalmazban megjelenő első oszlopot, vagy más illesztőprogram-definiált viselkedést végezhet.

A sorműveleti tömb, amelyet a SQL_ATTR_ROW_OPERATION_PTR utasítás attribútuma mutat, arra utalhat, hogy jelezze, hogy a jelenlegi sorhalmaz egy sorát figyelmen kívül kell hagyni egy tömeges frissítés során. További információért lásd a "Állapot és műveleti tömbök" (Állapot és műveleti tömbök) későbbi részében ebben a függvényhivatkozásban.
SQL_DELETE Az illesztőprogram a kurzort a RowNumber által megadott sorra helyezi, és törli az alatta lévő adatsort. A sorállapot tömbjének megfelelő elemét SQL_ROW_DELETED-re változtatja. A sor törlése után a következő nem érvényesek a sorban: pozitívált frissítés és törlés utasítások, SQLGetData hívások, valamint az SQLSetPos hívások, amelyekben az Operation csak SQL_POSITION-re van beállítva. A csomagolást támogató illesztőprogramok esetén a sor törlődik a kurzorról, amikor új adatot szereznek le az adatforrásból.

Hogy a sor látható marad-e, a kurzor típusától függ. Például a törölt sorok láthatóak a statikus és billentyűalapú kurzorok számára, de a dinamikus kurzorok számára láthatatlanok.

A sorművelet tömb, amelyet a SQL_ATTR_ROW_OPERATION_PTR utasítás attribútuma mutat, arra utalhat, hogy a jelenlegi sorhalmaz egy sorát tömeges törlés során figyelmen kívül kell hagyni. További információért lásd a "Állapot és műveleti tömbök" (Állapot és műveleti tömbök) későbbi részében ebben a függvényhivatkozásban.

LockType érv

A LockType érve lehetőséget ad az alkalmazások számára az egyidejű szabályozásra. A legtöbb esetben azok az adatforrások, amelyek támogatják a párhuzamos szinteket és tranzakciókat, csak a LockType érv SQL_LOCK_NO_CHANGE értékét támogatják. A LockType érvet általában csak fájlalapú támogatásra használják.

A LockType érve megadja a sor zárolásának állapotát az SQLSetPos végrehajtása után. Ha az illesztervezető nem tudja lezárni a sort sem a kért művelet végrehajtásához, sem a LockType argumentumhoz képest, akkor a SQL_ERROR és SQLSTATE 42000-et (szintaxishiba vagy hozzáférési sértés) adja vissza.

Bár a LockType argument egyetlen állításra van megadva, a zár ugyanazokat a jogosultságokat adja az összes állításra a kapcsolaton. Különösen egy zár, amelyet egy állítás szerez meg egy kapcsolaton, feloldható egy másik állítással ugyanazon a kapcsolaton.

Az SQLSetPos-on keresztül lezárt sor zárva marad, amíg az alkalmazás meg nem hívja az SQLSetPos-t a LockType SQL_LOCK_UNLOCK-re beállított sorra, vagy amíg az alkalmazás az SQLFreeHandle-t az utasításhoz, vagy az SQLFreeStmt-t a SQL_CLOSE opcióval. Egy tranzakciókat támogató illesztőprogramnál az SQLSetPos-on keresztül lezárt sor feloldódik, amikor az alkalmazás az SQLEndTran-t hívja, hogy megkötelezze vagy visszafordítson egy tranzakciót a kapcsolaton (ha egy kurzor zárva van, amikor egy tranzakciót elköteleznek vagy visszafordítanak, ahogy azt az SQLGetInfo által visszaadott SQL_CURSOR_COMMIT_BEHAVIOR és SQL_CURSOR_ROLLBACK_BEHAVIOR adattípusok jelzi).

A LockType érv a következő típusú zárokat támogatja. Annak meghatározására, hogy mely zárakat támogat egy adatforrás, egy alkalmazás az SQLGetInfo-t hívja a SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 vagy SQL_STATIC_CURSOR_ATTRIBUTES1 információtípussal (a kurzor típusától függően).

LockType érv Zárolás típusa
SQL_LOCK_NO_CHANGE Az illesztőprogram vagy adatforrás biztosítja, hogy a sor ugyanabban a zárt vagy feloldott állapotban legyen, mint az SQLSetPos hívása előtt. Ez a LockType érték lehetővé teszi, hogy azok az adatforrások, amelyek nem támogatják az explicit sorszintű zárolást, hogy a jelenlegi egyidejű és tranzakciós izolációs szintek által szükséges zárolást használják.
SQL_LOCK_EXCLUSIVE Az illesztőprogram vagy az adatforrás kizárólag a sort zárolja. Egy másik kapcsolaton vagy más alkalmazásban található utasítás nem használható zárok megszerzésére a soron.
SQL_LOCK_UNLOCK Az illesztőprogram vagy az adatforrás feloldja a sort.

Ha egy illesztőprogram támogatja SQL_LOCK_EXCLUSIVE-et, de nem támogatja az SQL_LOCK_UNLOCK-t, egy zárolt sor zárva marad, amíg az előző bekezdésben leírt függvényhívások egyike be nem történik.

Ha egy illesztőprogram támogatja a SQL_LOCK_EXCLUSIVE-et, de nem támogatja az SQL_LOCK_UNLOCK-t, akkor egy zárolt sor zárva marad, amíg az alkalmazás meg nem hívja SQLFreeHandle-t az utasításhoz, vagy SQLFreeStmt-t a SQL_CLOSE opcióval. Ha az illesztőprogram támogatja a tranzakciókat, és bezárja a kurzort a tranzakció kötése vagy visszafordításakor bezárja, az alkalmazás SQLEndTran-t hív.

Az SQLSetPos frissítési és törlési műveleteihez az alkalmazás a LockType argumentumot használja az alábbiakban:

  • Annak érdekében, hogy egy sor ne változik meg a lekérés után, egy alkalmazás az SQLSetPos-t hívja az Operation SQL_REFRESH-re, a LockType pedig SQL_LOCK_EXCLUSIVE-re.

  • Ha az alkalmazás a LockType-ot SQL_LOCK_NO_CHANGE-re állítja, az illezser garantálja, hogy egy frissítési vagy törlési művelet csak akkor sikeres, ha az alkalmazás SQL_CONCUR_LOCK megadja a SQL_ATTR_CONCURRENCY utasítás attribútumot.

  • Ha az alkalmazás megadja a SQL_ATTR_CONCURRENCY utasítás attribútumának SQL_CONCUR_ROWVER vagy SQL_CONCUR_VALUES használatát, az illesztőprogram összehasonlítja a sorverziókat vagy értékeket, és elutasítja a műveletet, ha a sor megváltozott azóta, hogy az alkalmazás lehozta a sort.

  • Ha az alkalmazás SQL_CONCUR_READ_ONLY megadja az SQL_ATTR_CONCURRENCY utasítás attribútumot, az illesztőprogram elutasítja a frissítési vagy törlési műveletet.

További információért a SQL_ATTR_CONCURRENCY mondattútumról lásd: SQLSetStmtAttr.

Állapot és Műveleti Tömbök

Az alábbi státusz- és műveleti tömböket használják SQLSetPos hívásakor:

  • A sor státusztömb (ahogy az IRD SQL_DESC_ARRAY_STATUS_PTR mező és az SQL_ATTR_ROW_STATUS_ARRAY utasítás attribútuma mutatja) tartalmazza az összes adatsorhoz tartozó állapotértékeket. Az illegamód a tömbben az állapotértékeket állítja be egy SQLFetch, SQLFetchScroll, SQLBulkOperations vagy SQLSetPos hívása után. Ezt a tömböt a SQL_ATTR_ROW_STATUS_PTR állítás attribútuma mutatja be.

  • A sorművelet tömbje (ahogy az ARD SQL_DESC_ARRAY_STATUS_PTR mezője és az SQL_ATTR_ROW_OPERATION_ARRAY utasítás attribútuma mutat) tartalmaz egy értéket minden sorhoz a sorhalmazban, amely jelzi, hogy az SQLSetPos hívását egy tömeges műveletre figyelmen kívül hagyják-e vagy végrehajtják. A tömb minden eleme vagy SQL_ROW_PROCEED-re (az alapértelmezett) vagy SQL_ROW_IGNORE-ra van beállítva. Ezt a tömböt a SQL_ATTR_ROW_OPERATION_PTR állítás attribútuma mutatja be.

Az állapot- és műveleti tömbökben lévő elemek számának egyenlőnek kell lennie a sorhalmazban lévő sorok számával (ahogy az SQL_ATTR_ROW_ARRAY_SIZE állítás attribútuma definiálja).

A sorállapot tömbjéről információért lásd: SQLFetch. A sorműveleti tömbről további információért lásd a "Ignoring a Row in a Bulk Operation" című részt, amely később ebben a szakaszban található.

SQLSetPos használata

Mielőtt egy alkalmazás meghívja az SQLSetPos-t, a következő lépéssorozatot kell végrehajtania:

  1. Ha az alkalmazás az SQLSetPos-tSQL_UPDATE-ra állítva hívja az SQLBindCol-t (vagy SQLSetDescRec-et), hogy megadja az adattípust, és a puffereket az oszlop adataihoz és hosszához köti meg.

  2. Ha az alkalmazás az SQLSetPos-t hívja SQL_DELETE vagy SQL_UPDATE művelettel , hívja az SQLColAttribute-t , hogy megbizonyosodjon arról, hogy a törölendő vagy frissítendő oszlopok frissíthetők-e.

  3. Hívd az SQLExecDirect, SQLExecute vagy egy katalógus függvényt az eredményhalmaz létrehozásához.

  4. Hívd az SQLFetch-et vagy SQLFetchScroll-t az adatok lekéréséhez.

További információért az SQLSetPos használatáról lásd: Adatok frissítése SQLSetPos-szal.

Adatok törlése SQLSetPos használatával

Az adatok törléséhez SQLSetPos-szal egy alkalmazás az SQLSetPos-t hívja, ahol a RowNumber a törlésre kerülő sor száma, az Operation pedig SQL_DELETE-re állítva áll.

Az adatok törlése után az illesztőprogram megváltoztatja a megfelelő sor megvalósítási sor állapottömbjében az értéket SQL_ROW_DELETED-re (vagy SQL_ROW_ERROR-re.

Adatok frissítése SQLSetPos használatával

Egy alkalmazás továbbíthatja az oszlop értékét akár a bound data bufferben, akár egy vagy több SQLPutData hívással. Az olyan oszlopokat, amelyek adatait SQLPutData segítségével továbbítják, adat-végrehajtásioszlopoknak nevezik. Ezeket gyakran használják SQL_LONGVARBINARY és SQL_LONGVARCHAR oszlopok adatainak továbbítására, és más oszlopokkal is össze lehet keverni.

Az adatok SQLSetPos-szal történő frissítéséhez egy alkalmazás:

  1. Az adatokban és a hosszúság/indikátor pufferekben értékeket helyez el, amelyek az SQLBindCol-hoz kötöttek:

    • Normál oszlopok esetén az alkalmazás az új oszlopértéket a *TargetValuePtr pufferbe, az érték hosszát pedig a *StrLen_or_IndPtr pufferbe helyezi. Ha a sort nem frissítik, az alkalmazás SQL_ROW_IGNORE az adott sor műveleti tömbjének elemébe helyezi el.

    • Adat-végrehajtáskor lévő oszlopok esetén az alkalmazás egy alkalmazás-definiált értéket, például az oszlopszámot, helyez el a *TargetValuePtr pufferbe. Az érték később felhasználható az oszlop azonosítására.

      Az alkalmazás a SQL_LEN_DATA_AT_EXEC(hosszúság) makró eredményét a *StrLen_or_IndPtr pufferbe helyezi. Ha az oszlop SQL adattípusa SQL_LONGVARBINARY, SQL_LONGVARCHAR vagy egy hosszú adatforrás-specifikus adattípus, és az illezser "Y"-t ad vissza az SQLGetInfo-ban a SQL_NEED_LONG_DATA_LEN információtípusra, akkor a hossz a paraméterhez küldendő bájtok száma; egyébként nem negatív értéknek kell lennie, és figyelmen kívül hagyják.

  2. Az SQLSetPos-t hívja az Operation argumentummal SQL_UPDATE-re, hogy frissítse az adatsort.

    • Ha nincsenek adat-végrehajtáskor oszlopok, a folyamat befejezett.

    • Ha vannak adat-végrehajtáskor oszlopok, a függvény SQL_NEED_DATA-et ad, és továbblép a 3. lépéshez.

  3. Az SQLParamData hívását hívja, hogy lekérje az *TargetValuePtr puffer címét az első feldolgozás adat-végrehajtási oszlopához. SQLParamData SQL_NEED_DATA visszaad. Az alkalmazás a *TargetValuePtr pufferből kéri az alkalmazás által definiált értéket.

    Note

    Bár a data-at-execution paraméterek hasonlóak a data-at-execution oszlopokhoz, az SQLParamData által visszaadott érték mindegyiknél eltérő.

    Note

    Az adat-végrehajtás paraméterei olyan paraméterek az SQL utasításban, amelyekhez az adatokat SQLPutData segítségével küldik, amikor az utasítást SQLExecDirect vagy SQLExecute futtatják. Ezeket SQLBindParameter vagy az SQLSetDescRec descriptorok beállításával kötik össze. Az SQLParamData által visszaadott érték egy 32 bites érték, amelyet a ParameterValuePtr argumentumban továbbítanak az SQLBindParaméternek.

    Note

    Az adat-végrehajtásnál lévő oszlopok olyan oszlopok, amelyekhez az SQLPutData segítségével adatokat küldenek, amikor egy sort frissítenek SQLSetPos-szal. Kötöttek az SQLBindCol-hoz. Az SQLParamData által visszaadott érték a *TargetValuePtr pufferben feldolgozott sor címe.

  4. Az SQLPutData-t egyszer vagy többször hívja, hogy adatokat küldjön az oszlophoz. Ha az SQLPutDataáltal megadott *TargetValuePtr pufferben, az összes adatérték nem tér vissza egynél több hívásra; ugyanazon oszlophoz több hívás az SQLPutData-ra csak akkor engedélyezett, ha C karakter adatot küldenek egy oszlopba, ahol karakter, bináris vagy adatforrás-specifikus adattípus van, vagy ha bináris C adatot küldünk egy karakter-, bináris vagy adatforrás-specifikus adattípusú oszlopba.

  5. Ismét az SQLParamData-t hívja, hogy jelezze, minden adat elküldődött az oszlophoz.

    • Ha több adat-végrehajtásnál lévő oszlop van, az SQLParamData SQL_NEED_DATA-ot és a következő adat-végrehajtási adat-futtatási oszlop TargetValuePtr pufferének címét adja vissza. A kérelem megismétli a 4. és 5. lépést.

    • Ha nincs több adat-végrehajtásnál oszlop, a folyamat befejezett. Ha az utasítást sikeresen végrehajtották, az SQLParamData SQL_SUCCESS vagy SQL_SUCCESS_WITH_INFO értéket ad vissza; ha a végrehajtás sikertelen volt, SQL_ERROR visszaad. Ebben a helyzetben az SQLParamData bármilyen SQLSetPos által vissza tud adott SQLSTATE-et visszaadni.

Ha az adatokat frissítették, az illesztőprogram megváltoztatja a megfelelő sor megvalósítási sor státusz tömbjében az értéket SQL_ROW_UPDATED-re.

Ha a műveletet törölik vagy hiba adódik az SQLParamData vagy SQLPutData esetében, miután az SQLSetPos SQL_NEED_DATA-ot ad vissza, és mielőtt az összes adat-végrehajtásnál lévő oszlop adatait elküldik, az alkalmazás csak az utasításhoz vagy az adott hozzáálláshoz tartozó kapcsolathoz az SQLCancel, SQLGetDiagField, SQLGetDiagRec, SQLGetFunctions, SQLParamData vagy SQLPutData fájlokat hívhatja. Ha bármilyen más függvényt hív az állításhoz vagy az ahhoz kapcsolódó kapcsolathoz, a függvény SQL_ERROR és SQLSTATE HY010-et (Függvénysorozat hiba) ad.

Ha az alkalmazás SQLCancel-t hív, miközben az illezőprogramnak még adatra van szüksége adat-végrehajtáskor lévő oszlopokhoz, az illesztőprogram megszünteti a műveletet. Az alkalmazás ezután ismét hívhatja az SQLSetPos-t ; A törlés nem befolyásolja a kurzor állapotát vagy a jelenlegi kurzor pozícióját.

Ha a kurzorhoz tartozó lekérdezésspecifikáció SELECT-listája több hivatkozást tartalmaz ugyanarra az oszlopra, akkor az illesztőgép által definiált, hogy hiba keletkezik-e, vagy az illezőprogram figyelmen kívül hagyja a duplikált hivatkozásokat, és végrehajtja a kért műveleteket.

Tömeges műveletek végrehajtása

Ha a RowNumber argumentum 0, az illesztőr végrehajtja az Operation argumentumban megadott műveletet minden sorra a sorhalmazban, amelynek mezőjében SQL_ROW_PROCEED érték van a soroperációs tömbben, amelyet SQL_ATTR_ROW_OPERATION_PTR utasítás attribútumával mutat meg. Ez érvényes értéke a RowNumber argumentumnak egy SQL_DELETE, SQL_REFRESH vagy SQL_UPDATE műveleti argumentumhoz, de nem SQL_POSITION. Az SQLSetPos SQL_POSITION művelettel és 0-val egyenlő sorszámmal SQLSTATE HY109-et (Invalid kurzor pozíció) adja vissza.

Ha egy hiba történik, ami az egész sorhalmazra vonatkozik, például SQLSTATE HYT00 (időtúlzás lejárt), az illesztőprogram SQL_ERROR-t és a megfelelő SQLSTATE-t adja vissza. A sorhalmaz puffereinek tartalma nem meghatározott, és a kurzor pozíciója változatlan.

Ha egy sorra vonatkozó hiba történik, a meghajtó:

  • A sor állapottömbjében lévő elemet a SQL_ATTR_ROW_STATUS_PTR állítás attribútumával jelöl SQL_ROW_ERROR-re.

  • Egy vagy több további SQLSTATE-t tesz közzé a hibasorban lévő hibához, és beállítja a SQL_DIAG_ROW_NUMBER mezőt a diagnosztikai adatstruktúrában.

Miután feldolgozta a hibát vagy a figyelmeztetést, ha az illesztőprogram befejezi a sorhalmaz többi sorának műveletét, visszaadja a SQL_SUCCESS_WITH_INFO. Így minden hibát visszaadó sornál a hibasorban nulla vagy több további SQLSTATE található. Ha az illesztőprogram leállítja a műveletet, miután feldolgozta a hibát vagy a figyelmeztetést, visszaadja a SQL_ERROR.

Ha az illezőprogram bármilyen figyelmeztetést ad vissza, például SQLSTATE 01004 (Data cutcuted), akkor figyelmeztetéseket küld, amelyek az egész sorhalmazra vagy az ismeretlen sorokra vonatkoznak, mielőtt visszaadja a hibás adatokat, amelyek konkrét sorokra vonatkoznak. Figyelmeztetést ad vissza bizonyos sorokra, valamint minden egyéb hibainformációt az adott sorokról.

Ha a RowNumber 0, és az Operation SQL_UPDATE, SQL_REFRESH vagy SQL_DELETE, akkor az SQLSetPos által használt sorok számát a SQL_ATTR_ROWS_FETCHED_PTR állítás attribútuma jelzi.

Ha a sorszám 0, és a művelet SQL_DELETE, SQL_REFRESH vagy SQL_UPDATE, akkor a művelet utáni aktuális sor megegyezik az operációt megelőző sorral.

Egy sor figyelmen kívül hagyása egy tömeges műveletben

A sorműveleti tömb arra is jelezhet, hogy az aktuális sorhalmazban egy sor figyelmen kívül hagyható egy tömeges művelet során SQLSetPos használatával. Ahhoz, hogy az illesztőprogramot egy vagy több sor figyelmen kívül hagyására irányítsa egy tömeges művelet során, az alkalmazásnak a következő lépéseket kell végrehajtania:

  1. Hívjuk az SQLSetStmtAttr-t , hogy a SQL_ATTR_ROW_OPERATION_PTR utasítás attribútumot egy SQLUSMALLINT tömbre mutass. Ez a mező beállítható, ha az SQLSetDescField hívása az ARD SQL_DESC_ARRAY_STATUS_PTR fejléc-mezőjének beállítására, ami megköveteli, hogy az alkalmazás megszerezze a leíró fogantyút.

  2. Állítsuk be a sorművelet tömbjének minden elemét két érték egyikére:

    • SQL_ROW_IGNORE, hogy jelezze, hogy a sor kizárva van a tömeges művelethez.

    • SQL_ROW_PROCEED, hogy jelezze, hogy a sor bele van foglalva a tömeges műveletbe. (Ez az alapértelmezett érték.)

  3. Hívd az SQLSetPos-t a tömeges művelet végrehajtásához.

A következő szabályok érvényesek a sorműveleti tömbökre:

  • SQL_ROW_IGNORE és SQL_ROW_PROCEED csak SQLSetPos használatával SQL_DELETE vagy SQL_UPDATE művelettel rendelkező tömeges műveleteket érintenek. Nem befolyásolják azSQLSetPos hívásait, amelyek SQL_REFRESH vagy SQL_POSITION művelettel rendelkeznek.

  • A mutató alapértelmezés szerint nullra van állítva.

  • Ha a mutató null, minden sor frissül, mintha minden elem SQL_ROW_PROCEED-re lett volna beállítva.

  • Egy elem SQL_ROW_PROCEED-re beállítása nem garantálja, hogy a művelet azon a soron történik. Például, ha egy adott sor a sorhalmazban SQL_ROW_ERROR státuszú, az illesztőprogram nem feltétlenül tudja frissíteni azt a sort, függetlenül attól, hogy az alkalmazás megadja-e SQL_ROW_PROCEED. Az alkalmazásnak mindig ellenőriznie kell a sorállapot tömbjét, hogy megnézze, sikeres volt-e a művelet.

  • SQL_ROW_PROCEED a fejlécfájlban 0-ként van definiálva. Egy alkalmazás inicializálhatja a sorművelet tömbjét 0-ra, hogy minden sort feldolgozhasson.

  • Ha a soroperációs tömbben az "n" elem száma SQL_ROW_IGNORE-re van állítva, és az SQLSetPos-t tömeges frissítés vagy törlés műveletére hívják, akkor a sorhalmaz n-edik sor változatlan marad az SQLSetPos hívása után.

  • Egy alkalmazásnak automatikusan be kell állítania egy csak olvasható oszlopot SQL_ROW_IGNORE-re.

Egy oszlop figyelmen kívül hagyása tömeges műveletben

Annak érdekében, hogy elkerüljék a felesleges feldolgozási diagnosztikat, amelyet egy vagy több csak olvasható oszlop frissítési kísérletei generálnak, az alkalmazás beállíthatja a határhossz/indikátor pufferében az értéket SQL_COLUMN_IGNORE-re. További információért lásd: SQLBindCol.

Kódpélda

A következő példában egy alkalmazás lehetővé teszi a felhasználó számára, hogy böngészze a ORDERS táblát és frissítse a rendelés státuszát. A kurzor kulcskészlet-vezéreléssel rendelkezik, sorkészlet mérete 20, és optimista egyidejű vezérlést alkalmaz a sorverziók összehasonlítására. Minden sorkészlet letöltése után az alkalmazás kinyomtatja azt, és lehetővé teszi a felhasználó számára, hogy kiválassza és frissítse a rendelés státuszát. Az alkalmazás SQLSetPos segítségével a kurzort a kiválasztott sorra helyezi, és a sorban pozícionált frissítést hajt végre. (A hibakezelést a tisztaság kedvéért kihagyták.)

#define ROWS 20  
#define STATUS_LEN 6  
  
SQLCHAR        szStatus[ROWS][STATUS_LEN], szReply[3];  
SQLINTEGER     cbStatus[ROWS], cbOrderID;  
SQLUSMALLINT   rgfRowStatus[ROWS];  
SQLUINTEGER    sOrderID, crow = ROWS, irow;  
SQLHSTMT       hstmtS, hstmtU;  
  
SQLSetStmtAttr(hstmtS, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) ROWS, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) rgfRowStatus, 0);  
SQLSetCursorName(hstmtS, "C1", SQL_NTS);  
SQLExecDirect(hstmtS, "SELECT ORDERID, STATUS FROM ORDERS ", SQL_NTS);  
  
SQLBindCol(hstmtS, 1, SQL_C_ULONG, &sOrderID, 0, &cbOrderID);  
SQLBindCol(hstmtS, 2, SQL_C_CHAR, szStatus, STATUS_LEN, &cbStatus);  
  
while ((retcode == SQLFetchScroll(hstmtS, SQL_FETCH_NEXT, 0)) != SQL_ERROR) {  
   if (retcode == SQL_NO_DATA_FOUND)  
      break;  
   for (irow = 0; irow < crow; irow++) {  
      if (rgfRowStatus[irow] != SQL_ROW_DELETED)  
         printf("%2d %5d %*s\n", irow+1, sOrderID, NAME_LEN-1, szStatus[irow]);  
   }  
   while (TRUE) {  
      printf("\nRow number to update?");  
      gets_s(szReply, 3);  
      irow = atoi(szReply);  
      if (irow > 0 && irow <= crow) {  
         printf("\nNew status?");  
         gets_s(szStatus[irow-1], (ROWS * STATUS_LEN));  
         SQLSetPos(hstmtS, irow, SQL_POSITION, SQL_LOCK_NO_CHANGE);  
         SQLPrepare(hstmtU,  
          "UPDATE ORDERS SET STATUS=? WHERE CURRENT OF C1", SQL_NTS);  
         SQLBindParameter(hstmtU, 1, SQL_PARAM_INPUT,  
            SQL_C_CHAR, SQL_CHAR,  
            STATUS_LEN, 0, szStatus[irow], 0, NULL);  
         SQLExecute(hstmtU);  
      } else if (irow == 0) {  
         break;  
      }  
   }  
}  

További példákért lásd: Pozicionált frissítés és törlés utasítások és Frissítések sorok a sorhalmazban SQLSetPos-szal.

Információ erről: Nézze
Puffer kötése egy eredményhalmaz oszlopához SQLBindCol függvény
Tömeges műveletek végrehajtása, amelyek nem kapcsolódnak a blokk kurzor pozíciójához SQLBulkOperations Function
Utasításfeldolgozás megszakítása SQLCancel függvény
Adatblokk beolvasása vagy egy eredményhalmaz görgetése SQLFetchScroll függvény
Egyetlen mező megszerzése egy leíró SQLGetDescField függvény
Több mező megszerzése egy leíróból SQLGetDescRec Function
Egyetlen mező beállítása egy leíró SQLSetDescField függvény
Több mező beállítása egy leíró SQLSetDescRec Function
Utasításattribútum beállítása SQLSetStmtAttr függvény