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'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.
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:
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:
Questo attributo permette di gestire la modalità con la quale i recrod devono essere bloccati durante la loro modifica.
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.