Gestione dei recordset ADO con SQL server

Home | SQL Server

La gestione dei dati tramite applicativo Visual Basic è fatta in modo agevole tramite l'oggetto ADO Recordset GRazie ad esso è possibile manipolare i dati quindi inserire nuove, righe modificare quelle esistenti restituite da una query, cancellare o semplicemente leggere un cursore restituito da una query T-SQL.

Un oggetto ADO Recordset (ADODB.REcordSet) viene generato a prtire dal comando Execute dell'oggetto Connection o dell'oggeto Command, oppure dall'apertura del cursore col metodo Open dell'oggetto RecordSet.

L'oggetto ADO Recordset equivale ad un Cursore SQL

L'apertura di un oggetto RecordSet equivale all'apertura di un cursore da parte di SQL Server, l'aggiornamento dei dati può essere fatto in modo automatico oppure in modalità batch a secodno di come viene aperto il cursore.

CursorLocation

Un attributo importante da definire è quello che indica dove deve risiedere il cursore, cioè se il recordset viene letto direttamente sul server o viene scaricato sul client per poi essere gestito il locale. I possibili valori che vengono dati alla proprietà CursorLocation sono:

  • adUseServer (con valore 2) - Questo è il valore di default, il Provider OLE DB provider o il database o entrambi gestiscono le modifiche dei dati
  • adUseClient (con valore 3) - ADO Cursor Engine gestisce i risultati delle query
  • CursorType

    Questo attributo permette di specificare se come poter gestire il cursore, ovvero permette di specificare se il cursore è di sola lettura oppure se è possibile scorrerlo sia verso il basso che verso l'alto, oppure se le modifiche fatte hanno effetto immediato agli occhi delle altre connessioni che agiscono sugli stessi dati. Di default l'attributo è sola lettura e scorrimento solo verso il basso.

    In ADO sono disponibili quattro diversi tipi di cursore:

  • adOpenForwardOnly (con valore 0 - Cursore a scorrimento in avanti) - Questo è il valore di default per i recordSet lato Server; apre un recordset non modificabile che si può scorrere solo in avanti. Le modifiche effettuate da altri utenti non saranno visibili.
  • adOpenKeyset (con valore 1 - Cursore direzionabile) - Questo valore supporta lo scrolling sia in avanti che indietro (permette quindi sia il metodo MoveNext che MovePrevious); le modifiche e le cancellazioni fatte da altri utenti sono immediatamente visibili.
  • adOpenDynamic (con valore 2 - Cursore dinamico ) - Come il precedente supporta lo scrolling sia in avanti che indietro; inoltre permette di visualizzare anche i reccord inseriti o da altri utenti.
  • adOpenStatic (con valore 3 - Cursore statico) - Utilizza un cursore statico. Le aggiunte, modifiche o eliminazioni eseguite da altri utenti non sono visibili ma permette una completa navigazione del recordset. E' l'unico tipo di cursore utilizzabile quando si specifica un tipo di cirsore lato client.
  • LockType

    Questo attributo permette di gestire la modalità con la quale i recrod devono essere bloccati durante la loro modifica.

  • adLockReadOnly (con valore 1) Indica record di sola lettura. È impossibile modificare i dati.
  • adLockPessimistic (con valore 2) Indica il blocco pessimistico, record per record. Ovvero il record viene bloccato dal momento in cui iniziano le modifiche, questo per garantire integrità dei dati nelle modifiche concorrenti.
  • adLockOptimistic (con valore 3) Indica il blocco ottimistico, record per record. Il record viene bloccato al richiamo del metodo Update.
  • adLockBatchOptimistic (con valore 4) Indica aggiornamenti ottimistici in modalità batch. Richiesta per la modalità di aggiornamento batch (Update Batch con cursore Lato Client).
  • Recordset Firehose

    In alcune circostanze il miglio tipo di cursore per ricevere dati da SQL Server usando un recordset ADO è utilizzare un cursore firehose. Di fatto la definizione di cursore è incorretta in quando è essenzialmente un metodo veloce per spostare dati dal server al client.

    Un cursore firehose richiede i record da una query direttamente ad un buffer di output su SQL server. Una volta che il buffer è pieno, SQL Server aspetta che il clinet legga tutti i record per poi riemnpirlo nuovamente. Questo processo si ripete fino a quando i dati non sono arrivati tutti al client.

    Un altro vantaggio di questo tipo di cursore è quello di mettere il lock ai record solo durante l'inserimento nel buffer diminuendo in tal modo problemi di concorrenza e performace.

    Le impostazioni per creare questo tipo di cursore sono

    CursorType = adForwardOnly
    CursorLocation = adUseServer
    LockType = adLockReadOnly
    CacheSize = 1 
    

    che poi sono le impostazioni di default quando si apre un recordset senza parametri o quando lo si apre tramite l'istruzione

    set rs = cn.execute(querysql)
    

    La gestione di questo recordset vuole, per quello che è stato detto prima, una connessione dedicata, e questo non può avvenire all'interno di una transazione (aperta con l'istruzione cn.BeginTrans) in quanto si richiede l'apertura implicita di una nuova connessione.


    Torna alla home page di SQL Server

    Home