Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een sleutelsetgestuurde cursor ligt tussen een statische en een dynamische cursor in de mogelijkheid om wijzigingen te detecteren. Net als bij een statische cursor worden wijzigingen in het lidmaatschap en de volgorde van de resultatenset niet altijd gedetecteerd. Net als bij een dynamische cursor worden wijzigingen in de waarden van rijen in de resultatenset gedetecteerd (afhankelijk van het isolatieniveau van de transactie, zoals ingesteld door het SQL_ATTR_TXN_ISOLATION verbindingskenmerk).
Wanneer een sleutelsetgestuurde cursor wordt geopend, worden de sleutels voor de volledige resultatenset opgeslagen; hiermee wordt het schijnbare lidmaatschap en de volgorde van de resultatenset opgelost. Wanneer de cursor door de resultatenset bladert, worden de sleutels in deze sleutelset gebruikt om de huidige gegevenswaarden voor elke rij op te halen. Stel dat een sleutelsetgestuurde cursor een rij ophaalt en een andere toepassing vervolgens die rij bijwerkt. Als de cursor de rij opnieuw ophaalt, zijn de waarden die het ziet de nieuwe, omdat deze de rij opnieuw heeft opgehaald met behulp van de sleutel. Hierdoor detecteren de keysetgestuurde cursors altijd wijzigingen die door zichzelf en anderen zijn aangebracht.
Wanneer de cursor probeert een rij op te halen die is verwijderd, wordt deze rij weergegeven als een 'gat' in de resultatenset: De sleutel voor de rij bestaat in de sleutelset, maar de rij bestaat niet meer in de resultatenset. Als de sleutelwaarden in een rij worden bijgewerkt, wordt de rij beschouwd als verwijderd en vervolgens ingevoegd, zodat dergelijke rijen ook worden weergegeven als gaten in de resultatenset. Hoewel een sleutelsetgestuurde cursor altijd rijen kan detecteren die door anderen zijn verwijderd, kan deze desgewenst de sleutels voor rijen verwijderen die zelf uit de sleutelset worden verwijderd. Sleutelsetgestuurde cursors die dit doen, kunnen hun eigen verwijderingen niet detecteren. Of een bepaalde sleutelsetgestuurde cursor eigen verwijderingen detecteert, wordt gerapporteerd via de optie SQL_STATIC_SENSITIVITY in SQLGetInfo.
Rijen die door anderen zijn ingevoegd, zijn nooit zichtbaar voor een sleutelsetgestuurde cursor, omdat er geen sleutels voor deze rijen in de sleutelset bestaan. Een sleutelsetgestuurde cursor kan echter desgewenst de sleutels voor rijen toevoegen die deze zelf aan de sleutelset invoegt. Sleutelsetgestuurde cursors die dit doen, kunnen hun eigen invoegingen detecteren. Of een bepaalde sleutelsetgestuurde cursor eigen invoegingen detecteert, wordt gerapporteerd via de optie SQL_STATIC_SENSITIVITY in SQLGetInfo.
De rijstatusarray die is gespecificeerd door het statementattribuut SQL_ATTR_ROW_STATUS_PTR kan SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO of SQL_ROW_ERROR voor elke rij bevatten. Het retourneert SQL_ROW_UPDATED, SQL_ROW_DELETED of SQL_ROW_ADDED voor rijen die worden gedetecteerd als bijgewerkt, verwijderd of ingevoegd.
Sleutelsetgestuurde cursors worden meestal geïmplementeerd door een tijdelijke tabel te maken die de sleutels voor elke rij in de resultatenset bevat. Omdat de cursor ook moet bepalen of rijen zijn bijgewerkt, bevat deze tabel meestal ook een kolom met informatie over het versiebeheer van rijen.
Als u door de oorspronkelijke resultatenset wilt navigeren, opent de keyset-gestuurde cursor een statische cursor over de tijdelijke tabel. Als u een rij in de oorspronkelijke resultatenset wilt ophalen, haalt de cursor eerst de juiste sleutel op uit de tijdelijke tabel en haalt vervolgens de huidige waarden voor de rij op. Als blokcursors worden gebruikt, moet de cursor meerdere sleutels en rijen ophalen.