Dela via


Keyset-Driven markörer

En tangentuppsättningsdriven markör ligger mellan en statisk och en dynamisk markör i dess förmåga att identifiera ändringar. Precis som en statisk markör identifierar den inte alltid ändringar i medlemskapet och ordningen på resultatuppsättningen. Precis som med en dynamisk markör identifierar den ändringar av värdena för rader i resultatuppsättningen (beroende på transaktionens isoleringsnivå, enligt SQL_ATTR_TXN_ISOLATION anslutningsattribut).

När en tangentuppsättningsdriven markör öppnas sparar den nycklarna för hela resultatuppsättningen. detta korrigerar det uppenbara medlemskapet och ordningen på resultatuppsättningen. När markören bläddrar igenom resultatuppsättningen använder den nycklarna i den här nyckeluppsättningen för att hämta de aktuella datavärdena för varje rad. Anta till exempel att en tangentuppsättningsdriven markör hämtar en rad och att ett annat program sedan uppdaterar raden. Om markören hämtar om raden, är de värden som markören ser de nya eftersom den hämtade om raden med hjälp av sin nyckel. På grund av detta identifierar de tangentuppsättningsdrivna markörer alltid ändringar som görs av sig själva och andra.

När markören försöker hämta en rad som har tagits bort visas den här raden som ett "hål" i resultatuppsättningen: Nyckeln för raden finns i nyckeluppsättningen, men raden finns inte längre i resultatuppsättningen. Om nyckelvärdena i en rad uppdateras anses raden ha tagits bort och infogats, så sådana rader visas också som hål i resultatuppsättningen. Även om en tangentuppsättningsdriven markör alltid kan identifiera rader som tagits bort av andra, kan den välja att ta bort nycklarna för rader som den själv tar bort från nyckeluppsättningen. Tangentuppsättningsdrivna markörer som gör detta kan inte identifiera sina egna borttagningar. Om en viss tangentdriven markör identifierar sina egna raderingar rapporteras detta via alternativet SQL_STATIC_SENSITIVITY i SQLGetInfo.

Rader som infogas av andra är aldrig synliga för en tangentuppsättningsdriven markör eftersom det inte finns några nycklar för dessa rader i nyckeluppsättningen. En tangentuppsättningsdriven markör kan dock valfritt lägga till nycklarna för rader som den infogar i nyckeluppsättningen. Tangentuppsättningsdrivna markörer som gör detta kan identifiera sina egna infogningar. Om en viss tangentuppsättningsdriven markör identifierar sina egna infogningar rapporteras via alternativet SQL_STATIC_SENSITIVITY i SQLGetInfo.

Radstatusmatrisen som anges av SQL_ATTR_ROW_STATUS_PTR-instruktionsattributet kan innehålla SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO eller SQL_ROW_ERROR för valfri rad. Den returnerar SQL_ROW_UPDATED, SQL_ROW_DELETED eller SQL_ROW_ADDED för rader som identifieras som uppdaterade, borttagna eller infogade.

Tangentuppsättningsdrivna markörer implementeras ofta genom att skapa en tillfällig tabell som innehåller nycklarna för varje rad i resultatuppsättningen. Eftersom markören också måste avgöra om rader har uppdaterats innehåller den här tabellen också ofta en kolumn med information om radversion.

Om du vill rulla över den ursprungliga resultatuppsättningen öppnar den nyckeluppsättningsdrivna markören en statisk markör över den tillfälliga tabellen. Om du vill hämta en rad i den ursprungliga resultatuppsättningen hämtar markören först rätt nyckel från den temporära tabellen och hämtar sedan de aktuella värdena för raden. Om blockmarkörer används måste markören hämta flera nycklar och rader.