Positioned Updates (ODBC)
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
ODBC ondersteunt twee methoden voor het uitvoeren van positioned updates in een cursor:
SQLSetPos-
WHERE CURRENT OF component
De meest voorkomende benadering is het gebruik van SQLSetPos. Het heeft de volgende opties.
SQL_POSITION
Hiermee plaatst u de cursor op een specifieke rij in de huidige rijenset.
SQL_REFRESH
Vernieuwt programmavariabelen die zijn gebonden aan de kolommen van de resultatenset met de waarden uit de rij waarop de cursor momenteel is geplaatst.
SQL_UPDATE
Hiermee werkt u de huidige rij in de cursor bij met de waarden die zijn opgeslagen in de programmavariabelen die zijn gebonden aan de kolommen van de resultatenset.
SQL_DELETE
Hiermee verwijdert u de huidige rij in de cursor.
SQLSetPos- kan worden gebruikt met elke instructieresultatenset wanneer de instructie cursorkenmerken instelt op het gebruik van servercursors. De kolommen van de resultatenset moeten zijn gebonden aan programmavariabelen. Zodra de toepassing een rij heeft opgehaald, wordt SQLSetPos(SQL_POSITION) aanroepen om de cursor op de rij te plaatsen. De toepassing kan vervolgens SQLSetPos(SQL_DELETE) aanroepen om de huidige rij te verwijderen, of nieuwe gegevenswaarden naar de afhankelijke programmavariabelen verplaatsen en SQLSetPos(SQL_UPDATE) aanroepen om de huidige rij bij te werken.
Toepassingen kunnen een rij in de rijenset bijwerken of verwijderen met SQLSetPos. Het aanroepen van SQLSetPos is een handig alternatief voor het maken en uitvoeren van een SQL-instructie. SQLSetPos werkt op de huidige rijenset en kan alleen worden gebruikt na een aanroep van SQLFetchScroll-.
De rijsetgrootte wordt ingesteld door een aanroep naar SQLSetStmtAttr- met een kenmerkargument van SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos maakt gebruik van een nieuwe rijsetgrootte, maar pas na een aanroep naar SQLFetch of SQLFetchScroll. Als de grootte van de rijenset bijvoorbeeld wordt gewijzigd, wordt SQLSetPos- aangeroepen en wordt SQLFetch of SQLFetchScroll- aangeroepen. De aanroep van SQLSetPos maakt gebruik van de oude rijsetgrootte, maar SQLFetch of SQLFetchScroll maakt gebruik van de nieuwe rijsetgrootte.
De eerste rij in de rijset is rijnummer 1. Het argument RowNumber in SQLSetPos moet een rij in de rijenset identificeren; Dat wil gezegd: de waarde moet zich in het bereik tussen 1 en het aantal rijen bevinden dat het laatst is opgehaald. Dit kan kleiner zijn dan de grootte van de rijenset. Als RowNumber 0 is, is de bewerking van toepassing op elke rij in de rijenset.
De verwijderbewerking van SQLSetPos maakt dat de gegevensbron een of meer geselecteerde rijen van een tabel verwijdert. Als u rijen wilt verwijderen met SQLSetPos, roept de toepassing SQLSetPos- aan met Bewerking ingesteld op SQL_DELETE en RowNumber ingesteld op het nummer van de rij die moet worden verwijderd. Als RowNumber 0 is, worden alle rijen in de rijenset verwijderd.
Nadat SQLSetPos retourneert, is de verwijderde rij de huidige rij en de status ervan SQL_ROW_DELETED. De rij kan niet worden gebruikt in aanvullende bewerkingen, zoals aanroepen naar SQLGetData- of SQLSetPos.
Wanneer u alle rijen van de rijenset verwijdert (RowNumber is gelijk aan 0), kan de toepassing voorkomen dat het stuurprogramma bepaalde rijen verwijdert met behulp van de rijbewerkingmatrix, net zoals voor de updatebewerking van SQLSetPos.
Elke rij die wordt verwijderd, moet een rij zijn die bestaat in de resultatenset. Als de toepassingsbuffers zijn gevuld door op te halen en als een rijstatusmatrix is behouden, mogen de waarden op elk van deze rijposities niet worden SQL_ROW_DELETED, SQL_ROW_ERROR of SQL_ROW_NOROW.
Positioned updates kunnen ook worden uitgevoerd met behulp van de WHERE CURRENT OF-component over UPDATE-, DELETE- en INSERT-instructies. WHERE CURRENT OF vereist een cursornaam die ODBC genereert wanneer de functie SQLGetCursorName wordt aangeroepen, of die u kunt opgeven door SQLSetCursorName aan te roepen. Hier volgen algemene stappen voor het uitvoeren van een WHERE CURRENT OF-update in een ODBC-toepassing:
Roep SQLSetCursorName aan om een cursornaam voor de instructiehandgreep tot stand te brengen.
Bouw een SELECT-instructie met een FOR UPDATE OF-component en voer deze uit.
Roep SQLFetchScroll- aan om een rijset of SQLFetch- op te halen om een rij op te halen.
Roep SQLSetPos (SQL_POSITION) aan om de cursor op de rij te plaatsen.
Bouw en voer een UPDATE-instructie uit met een WHERE CURRENT OF-component met behulp van de cursornaamset met SQLSetCursorName.
U kunt ook SQLGetCursorName aanroepen nadat u de SELECT-instructie hebt uitgevoerd in plaats van SQLSetCursorName- aan te roepen voordat u de SELECT-instructie uitvoert. SQLGetCursorName retourneert een standaardcursornaam die is toegewezen door ODBC als u geen cursornaam instelt met SQLSetCursorName-.
SQLSetPos heeft de voorkeur boven WHERE CURRENT OF wanneer u servercursors gebruikt. Als u een statische, updatable cursor gebruikt met de ODBC-cursorbibliotheek, implementeert de cursorbibliotheek WHERE CURRENT OF updates door een WHERE-component toe te voegen met de sleutelwaarden voor de onderliggende tabel. Dit kan onbedoelde updates veroorzaken als de sleutels in de tabel niet uniek zijn.
Zie ook
ODBC- (Cursors) gebruiken