Condividi tramite


Cursori keyset

Il cursore keyset offre funzionalità intermedie di cursore statico e cursore dinamico, per quanto riguarda la facoltà di quest'ultimo di rilevare le modifiche. Come un cursore statico, non sempre rileva le modifiche all'appartenenza e all'ordine del set di risultati. Come un cursore dinamico, rileva le modifiche ai valori delle righe nel set di risultati.

I cursori gestiti da keyset vengono controllati da un set di identificatori univoci (chiavi), noti come keyset. Le chiavi sono costituite da un set di colonne che identificano in modo univoco le righe del set di risultati. Il keyset corrisponde al set di valori di chiave di tutte le righe restituite dall'istruzione della query.

Con i cursori gestiti da keyset viene generata e salvata una chiave per ogni riga nel cursore e tale chiave viene archiviata nella workstation client o nel server. Quando si accede a ogni riga, la chiave archiviata viene usata per recuperare i valori correnti dei dati dall'origine dati. In un cursore gestito da keyset, quando il set di chiavi è completamente popolato, l'appartenenza del set di risultati è bloccata. Le aggiunte o gli aggiornamenti successivi che interessano l'appartenenza faranno parte del set di risultati solo quando verrà riaperto.

Le modifiche ai valori dei dati, apportate dal proprietario del keyset o da altri processi, sono visibili mentre l'utente scorre il set di risultati. Gli inserimenti eseguiti all'esterno del cursore da altri processi sono visibili solo se il cursore viene chiuso e riaperto. Gli inserimenti eseguiti dall'interno del cursore sono visibili alla fine del set di risultati.

Quando un cursore gestito da keyset tenta di recuperare una riga eliminata, la riga viene visualizzata come "hole" nel set di risultati. La chiave per la riga è presente nel keyset, ma la riga non esiste più nel set di risultati. Se i valori della chiave in una riga vengono aggiornati, la riga viene considerata eliminata e quindi inserita, pertanto anche tali righe vengono visualizzate come hole nel set di risultati. Anche se un cursore gestito da keyset può sempre rilevare le righe eliminate da altri processi, può facoltativamente rimuovere le chiavi per le righe che elimina. I cursori gestiti da keyset che eseguono questa operazione non possono rilevare le proprie eliminazioni perché l'evidenza è stata rimossa.

L'aggiornamento di una colonna chiave equivale all'eliminazione della chiave esistente tramite inserimento della nuova chiave. Il nuovo valore della chiave non è visibile se l'aggiornamento non è stato eseguito tramite il cursore. Se l'aggiornamento è stato eseguito tramite il cursore, il nuovo valore della chiave è visibile alla fine del set di risultati.

Esiste una variate dei cursori gestiti da keyset denominata cursori standard gestiti da keyset. In un cursore standard gestito da keyset, l'appartenenza delle righe nel set di risultati e l'ordine delle righe sono fissati al momento dell'apertura del cursore, ma sono visibili le modifiche ai valori apportate dal proprietario del cursore e le modifiche di cui è stato eseguito il commit apportate da altri processi. Se una modifica esclude una riga per l'appartenenza o influisce sull'ordine di una riga, la riga non scompare o si sposta a meno che il cursore non venga chiuso e riaperto. I dati inseriti non vengono visualizzati, ma le modifiche ai dati esistenti vengono visualizzate quando le righe vengono recuperate.

Il cursore gestito da keyset è difficile da usare correttamente perché la sensibilità alle modifiche dei dati dipende da molte circostanze diverse, come descritto in precedenza. Tuttavia, se l'applicazione non è interessata da aggiornamenti simultanei, può gestire a livello di codice chiavi non corrette e deve accedere direttamente a determinate righe con chiave, il cursore gestito da keyset potrebbe essere adatto alle proprie esigenze. Usare adOpenKeyset CursorTypeEnum per indicare che si vuole usare un cursore keyset in ADO.

Vedi anche

Cursori forward-only
Cursori statici
Cursori dinamici