Il Modello ad Oggetti di ADO - Il Recordset

Home Page Commento dell'autore Articoli Le FAQ I documenti La ricerca Contribuire

A cura di:
Davide Bianchi
ADO è l'interfaccia più usata per accedere ai database sotto Windows, non solo mediante ASP, ma anche mediante Visual Basic, C/C++ ed altri ambienti di sviluppo.

Il Recordset

Proprietà:
AbsolutePage, AbsolutePosition, ActiveConnection, BOF ed EOF, Bookmark, CacheSize, CursorLocation, CursorType, EditMode, Filter, LockType, MarshalOptions, MaxRecords, PageCount, PageSize, RecordCount, Sort, Source, State, Status

Metodi:
Open, MoveFirst, MoveLast, MoveNext e MovePrevious , Move, Resync, Requery, Save, Delete, UpdateBatch, CancelBatch, CancelUpdate, Update, AddNew, Supports, Clone, GetRows.

Il RecordSet fornisce dei metodi per manipolare ed accedere ai risultati di una query o di una Stored Procedure. L'oggetto fornisce i metodi necessari per aggiungere, aggiornare, cancellare e scorrere i records che compongono il recordset stesso.
Ogni record può essere reperito ed aggiornato utilizzando la collection Fields ed i corrispondenti oggetti Field che essa contiene. Ogni Field fornisce informazioni ed il contenuto del singolo campo.
Quando un RecordSet è creato, un cursore è automaticamente aperto per permettere l'accesso ai dati.

Il Recordset consente di specificare il tipo di cursore e la locazione per il reperimento dei dati. Con la proprietà CursorType è possibile specificare il tipo di cursore da utilizzare. Un cursore può essere Forward-Only, Static, Keyset-Driven o Dynamic. Il tipo di cursore determina se il Recordset può essere "scorso" in avanti e all'indietro o aggiornato.
Il tipo di cursore influisce anche sulla visibilità dei cambiamenti sui singoli record.

Per default, il cursore è di tipo Read-Only e Forward-Only, cioè è di sola lettura (non si possono modificare i dati) e può essere "scorso" solo in avanti.

Si può specificare l'utilizzo di un cursore Client-Side o Server-Side usando la prorpietà CursorLocation. La "locazione" del cursore gioca un ruolo molto importante nei Recordset Disconnessi.

Un Recordset può essere creato tramite il metodo Connection.Execute o Command.Execute, oppure può essere creato a sè stante e quindi "aperto" mediante Open.

Questo esempio usa una Connection per creare e reperire un Recordset:


Dim rs As New ADODB.Recordset
rs.Open "select * from titles", "DSN=pubs;UID=sa"
While (Not rs.EOF)
  Debug.Print rs(0)
  rs.MoveNext
Wend
rs.Close

Torna alla mappa

Proprietà

AbsolutePage

Imposta o restituisce un valore compreso tra 1 e il numero di "pagine" contenute nel Recordset, oppure restituisce una delle seguenti costanti:

  • adPosUnknown
    Il Recordset è vuoto, la posizione corrente è sconosciuta o il provider non supporta questa proprietà.
  • adPosBOF
    Il puntatore del record corrente si trova in corrispondenza dell'inizio del file, vale a dire BOF è True.
  • adPosEOF
    Il puntatore del record corrente si trova in corrispondenza della fine del file, vale a dire EOF è True.

Osservazioni
Utilizzare questa proprietà per leggere o impostare la pagina attuale. Se si imposta la pagina attuale il Recordset si posizionerà automaticamente sul primo record della "pagina" selezionata.
Per ottenere il numero totale di pagine, utilizzare PageCount.
Utilizzare PageSize per impostare il numero di record che costituiscono ogni pagina.

Nota: la possibilità di gestire le "pagine" è fornita dal driver di database che si stà utilizzando. Non è detto che tutti i driver forniscano questa possibiltà.

AbsolutePosition

Consente di specificare la posizione ordinale del record corrente.

Imposta o restituisce un valore compreso tra 1 e il numero di record totali contenuti nel Recordset (RecordCount) oppure restituisce una delle seguenti costanti:

  • adPosUnknown
    Il Recordset è vuoto, la posizione corrente è sconosciuta oppure il driver non supporta il posizionamento assoluto.
  • adPosBOF
    Il puntatore del record corrente si trova in corrispondenza dell'inizio del recordset.
  • adPosEOF
    Il puntatore del record corrente si trova in corrispondenza della fine del recordset.

Osservazioni
Utilizzare questa proprietà per posizionarsi su di un record in base alla sua posizione all'interno del Recordset, oppure per determinare la posizione del record corrente. Il driver deve supportare il posizionamento assoluto.

Per ottenere il numero totale di record interrgoare RecordCount.

Quando si imposta AbsolutePosition, anche se su un record della cache corrente, ADO carica di nuovo nella cache un nuovo gruppo di record a partire dal record specificato. CacheSize determina le dimensioni del gruppo.

Nota La posizione di un record può cambiare se altri record vengono aggiunti o eliminati dal Recordset, inoltre la posizione varia in funzione dell'ordinamento che viene impostato. Non utilizzare pertanto AbsolutePosition come identificativo di un record. Utilizzare invece i Bookmark per questo scopo.

ActiveConnection

Ritorna o imposta la Connection a cui è collegato il Recordset.

Osservazioni
Per Recordset aperti o per Recordset la cui proprietà Source è impostata su un Command valido, questa proprietà è di sola lettura, in tutti gli altri casi può essere modificata.

è possibile impostare questa proprietà su una Connection esistente o su una stringa di connessione valida. In questo caso il provider creerà una nuova connessione utilizzando questa definizione. Il provider potrà inoltre impostare questa proprietà alla nuova Connection in modo da ottenere informazioni più complete sull'errore o eseguire altri comandi.

Se si utilizza conn di Open per aprire il Recordset, ActiveConnection ne erediterà il valore.

Se si imposta Source su un Command valido, questa proprietà erediterà l'impostazione della equivalente proprietà del Command usato.

Utilizzo di Remote Data Service
Se utilizzata su un Recordset del client (ADOR), questa proprietà può essere impostata solo su una stringa di connessione o su Nothing in Microsoft Visual Basic o VBScript.

BOF ed EOF

  • BOF indica che il record corrente si trova prima del primo record del Recordset
  • EOF indica che il record corrente si trova dopo l'ultimo record del Recordset

Le proprietà BOF ed EOF restituiscono TRUE o FALSE

Osservazioni
Utilizzare queste proprieta per stabilire se il Recodset contiene dei dati oppure se sono stati superati i limiti durante lo spostamento nell'insieme dei record.

BOF restituisce True se il record corrente si trova prima del primo record e False in qualunque altro caso.

EOF restituisce True se il record corrente si trova dopo l'ultimo record e False in qualunque altro caso.

Se il Recordset è vuoto (non contiene nessun record), entrambe le proprietà ritornano True.

Nota:
Se si elimina l'ultimo record del Recordset, è possibile che BOF ed EOF ritornino False, fino a che non si prova a spostare il record corrente.

Bookmark

Restituisce un "segnalibro" che identifica in modo univoco il record corrente, oppure imposta il record corrente sul record identificato da un segnalibro valido.

Osservazioni
Utilizzare questa proprietà per salvare la posizione attuale all'interno del Recordset e per ritornare al record in qualsiasi momento. I segnalibri sono disponibili solo se il Driver supporta la funzionalità e se il Recordset è stato aperto con le opzioni di posizionamento assoluto (vedere Open).

Quando si accede ad un Recordset, ciascuno dei record dispone di un segnalibro univoco. Per memorizzare il segnalibro del record corrente, leggere il valore di Bookmark e memorizzarlo in una variabile, per ritornare a quel record in qualunque momento, impostare Bookmark al valore precedentemente letto.

Il valore letto da Bookmark potrebbe non essere visualizzabile.

Se si utilizza Clone per creare una copia del Recordset, i Bookmark dei due Recordset saranno perfettamente identici.

La proprietà Bookmark è sempre disponibile quando è utilizzata sui Recordset del client (ADOR).

CacheSize

Indica il numero di record memorizzati nella cache locale.

Osservazioni
Utilizzare questa proprietà per controllare il numero di record mantenuti dal driver nel buffer e il numero di record da recuperare contemporaneamente nella memoria locale. Se ad esempio il valore è 10, dopo aver aperto il Recordset, il driver recupererà i primi 10 record nella memoria locale.
Durante gli spostamenti all'interno del Recordset, il driver restituirà i dati presenti nel buffer finchè non si cerca di superare i limiti della cache, a questo punto il driver recupererà un altro gruppo di record dal database.

Il valore di CacheSize può essere modificato anche se il Recordset è aperto, la modifica del valore tuttavia ha effetto solo sul numero di record contenuti nella cache dopo l'esecuzione di più letture successive.

Se sono disponibili meno record di quelli specificati in CacheSize, il provider restituirà i record restanti senza generare alcun errore.

Il valore di CacheSize deve essere >=1.

I record memorizzati nella cache non riflettono le modifiche contemporanee apportate da altri utenti sul database. Per eseguire un aggiornamento di tutti i dati nella cache, utilizzare Resync.

CursorLocation

Imposta o restituisce la posizione del motore del cursore.

Osservazioni
Consente di scegliere tra varie librerie di cursori accessibili da parte del driver. è in genere possibile scegliere se utilizzare una libreria di cursori del client oppure una presente sul server. L'impostazione della proprietà non ha effetto sulle connessioni già aperte. Inoltre non è possibile modificarla se la connessione è già aperta.
I cursori ottenuti usando la Connection.Execute erediteranno quest'impostazione. I Recordset erediteranno automaticamente quest'impostazione dalle relative connessioni.

Valori possibili:

  • adUseNone
    Non sono utilizzati servizi del cursore. Questa costante non è aggiornata ed è disponibile solo per garantire la compatibilità con le versioni precedenti.
  • adUseClient
    Utilizza i cursori del client forniti da una libreria di cursori locale.
    I motori di cursore locale consentono in genere di eseguire molte funzioni non supportate dai cursori forniti da driver. Utilizzando quindi tale impostazione sarà possibile usufruire dei vantaggi offerti dalle funzioni che verranno abilitate. Per garantire la compatibilità con le versioni precedenti, è supportato anche il sinonimo adUseClientBatch.
  • adUseServer
    Predefinita. Utilizza cursori forniti da driver o dal provider di dati. Si tratta a volte di cursori molto flessibili che garantiscono una riservatezza supplementare per le modifiche apportate da altri utenti alla fonte dati. Alcune funzioni del Microsoft Client Cursor Provider, quali i recordset non associati, non possono essere simulate con i cursori del server, rendendo quindi tali funzioni non disponibili con questa impostazione.

Utilizzo di Remote Data Service
Quando viene utilizzata su un Recordset o Connection del client (ADOR), questa proprietà può essere impostata solo su adUseClient.

CursorType

Indica il tipo di cursore utilizzato.

Valori possibili:

  • adOpenForwardOnly
    Valore predefinito. Cursore a scorrimento in avanti. Si comporta come un cursore statico tranne per il fatto che consente di scorrere i record solo in avanti. In questo modo è possibile ottenere un miglioramento delle prestazioni quando è necessario effettuare un unico passaggio all'interno di un recordset.
  • adOpenKeyset
    Cursore direzionale. Si comporta in modo simile a un cursore dinamico ad eccezione del fatto che non consente di visualizzare record aggiunti da altri utenti, anche se i record eliminati da altri utenti non sono accessibili dal proprio recordset. I dati modificati da altri utenti sono ancora visibili.
  • adOpenDynamic
    Cursore dinamico. Consente di visualizzare aggiunte, modifiche ed eliminazioni eseguite da altri utenti e di effettuare tutti i tipi di movimento tramite il recordset, ad eccezione dei segnalibri se non supportati dal provider.
  • adOpenStatic
    Cursore statico. Copia statica di un set di record da utilizzare per la ricerca di dati o la generazione di relazioni. Le aggiunte, modifiche o eliminazioni eseguite da altri utenti non sono visibili.

Osservazioni
Utilizzare questa proprietà per specificare il tipo di cursore da utilizzare quando viene aperto il Recordset. La proprietà è di lettura/scrittura quando il Recordset è chiuso e di sola lettura quando è aperto.

Se viene impostato un valore non supportato, non verrà generato alcun errore e verrà utilizzato il tipo di cursore supportato più vicino.

Se il driver non supporta il tipo di cursore richiesto, è possibile che ne venga restituito un tipo diverso. CursorType verrà modificata in modo da corrispondere al tipo di cursore attualmente in uso quando il Recordset è aperto. Per verificare la funzionalità specifica del cursore restituito, utilizzare Supports.

Nella tabella che segue viene illustrata la funzionalità del driver (identificata dalle costanti di Supports) necessaria per ciascun tipo di cursore.

Per un Recordset del tipo indicato, Supports dovrà restituire True per tutte le costanti indicate di seguito:

Tipo cursore Costanti
adOpenForwardOnly nessuna
adOpenKeyset adBookmark, adHoldRecords, adMovePrevious, adResync
adOpenDynamic adMovePrevious
adOpenStatic adBookmark, adHoldRecords, adMovePrevious, adResync

Nota Anche se Supports (adUpdateBatch) può risultare valida per cursori dinamici e a scorrimento in avanti, si consiglia di utilizzare un cursore statico o direzionale per gli aggiornamenti batch. Impostare LockType su adLockBatchOptimistic e CursorLocation su adUseClient per abilitare il Microsoft Client Cursor Engine, necessario per gli aggiornamenti batch.

Utilizzo di Remote Data Service
Quando CursorType viene utilizzata su un Recordset del client (ADOR), può essere impostata solo su adOpenStatic.

EditMode Indica se il record corrente è in fase di modifica oppure no.

Questa proprietà è di sola lettura, il suo valore può essere:

  • adEditNone
    Indica che non è in esecuzione alcuna operazione di modifica.
  • adEditInProgress
    Indica che i dati nel record corrente sono stati modificati ma non salvati.
  • adEditAdd
    Indica che è stato chiamato AddNew e che il record corrente è un nuovo record non salvato nel database.
  • adEditDelete
    Indica che il record corrente è stato eliminato.

Osservazioni
ADO gestisce un buffer di modifica associato al record corrente. Questa proprietà indica se sono state apportate modifiche al buffer o se è stato creato un nuovo record. È possibile verificare le modifiche in sospeso qualora sia stato interrotto un processo di modifica e determinare se sia necessario utilizzare Update o CancelUpdate.

Vedere anche AddNew per una descrizione più dettagliata di EditMode in condizioni di modifica diverse.

Filter Consente di specificare un filtro sui dati del Recordset.

Impostazioni e valori restituiti
Imposta o restituisce un valore che contiene uno degli elementi seguenti:

  • Stringa di criterio
    una stringa costituita da uno o più proposizioni concatenate con gli operatori AND o OR.
  • Serie di segnalibri
    una serie di valori di segnalibro univoci che si riferiscono ai record dell'oggetto Recordset.
  • Una delle seguenti costanti:
    • adFilterNone
      Rimuove il filtro corrente e ripristina tutti i record da visualizzare.
    • adFilterPendingRecords
      Consente di visulizzare solo i record modificati ma non inviati al server. Applicabile solo per la modalità di aggiornamento batch.
    • adFilterAffectedRecords
      Consente di visualizzare solo i record interessati dall'ultima chiamata Delete, Resync, UpdateBatch, o CancelBatch.
    • adFilterFetchedRecords
      Consente di visualizzare i record della cache corrente, vale a dire i risultati dell'ultima chiamata, per recuperare record dal database.
    • adFilterConflictingRecords
      Consente di visualizzare i record che non sono stati aggiornati in modalità batch nel corso dell'ultimo tentativo.

Osservazioni
Utilizzare questa proprietà per scegliere in modo selettivo i record del Recordset. Questa operazione ha effetto su altre proprietà quali AbsolutePosition, AbsolutePage, RecordCount e PageCount che restituiscono valori basati sul cursore corrente, poichè l'impostazione di Filter su un valore specifico sposterà il record corrente sul primo record che soddisfa il criterio indicato.

La stringa di criteri è costituita da proposizioni del tipo NomeCampo-Operatore-Valore, ad esempio


"LastName = 'Smith'"
È possibile creare proposizioni composte concatenando proposizioni singole con AND o OR:

"LastName = 'Smith' AND FirstName = 'John'"
"LastName = 'Smith' OR LastName = 'Jones'"
NomeCampo deve corrispondere a un nome di campo valido dal Recordset. Se il nome di campo contiene spazi, è necessario racchiudere il nome tra parentesi quadre.

Operatore deve corrispondere a uno degli elementi: <, >, <=, >=, <>, = oppure LIKE.

Valore corrisponde al valore con cui verranno confrontati i valori di campo, ad esempio 'Smith', #8/24/95#, 12,345 o L. 50.000. Utilizzare le virgolette singole con le stringhe e diesis (#) con le date. È possibile ad esempio utilizzare le virgole decimali, i segni di dollaro e la notazione scientifica. Se Operatore corrisponde a LIKE, in Valore potranno essere utilizzati caratteri jolly. Sono consentiti solo l'asterisco (*) e il segno percentuale (%) purchè siano l'ultimo carattere della stringa. Valore non può essere Null.

Non c'è precedenza tra AND e OR. È possibile raggruppare le proposizioni tra parentesi. Non è tuttavia possibile raggruppare le proposizioni unite da OR e quindi unire il gruppo a un'altra proposizione con AND:


(LastName = 'Smith' OR LastName = 'Jones') AND _
  FirstName = 'John'
(LastName = 'Smith' AND FirstName = 'John') OR _
  (LastName = 'Jones' AND FirstName = 'John')
Le costanti del filtro facilitano la risoluzione dei conflitti tra record singoli durante l'aggiornamento in modalità batch, consentendo di visualizzare ad esempio solo i record modificati durante l'ultima chiamata del metodo UpdateBatch.

È possibile che Filter non possa essere impostata a causa di un conflitto con i dati del livello inferiore, quando ad esempio un record sia già stato eliminato da un altro utente. In tal caso il provider restituirà degli avvisi all'insieme Errors ma non interromperà l'esecuzione del programma. Si verificherà un errore in fase di esecuzione solo se esistono conflitti su tutti i record richiesti. Utilizzare Status per individuare i record che presentano conflitti.

Impostando Filter su una stringa di lunghezza zero ("") si otterrà lo stesso risultato ottenuto utilizzando la costante adFilterNone.

Quando viene impostato Filter, la posizione del record corrente viene spostata sul primo record all'interno del sottogruppo filtrato di record del Recordset. Quando il filtro viene eliminato, la posizione del record corrente viene spostata sul primo record del Recordset.

Vedere la proprietà Bookmark per una descrizione dei valori di segnalibro da cui è possibile creare una serie da utilizzare con Filter.

LockType Indica il tipo di Lock utilizzato durante la fase di modifica dei dati.

Valori possibili:

  • adLockReadOnly
    Valore predefinito. Di sola lettura: non è possibile modificare i dati.
  • adLockPessimistic
    Blocco pessimistico, record per record: il provider esegue le operazioni necessarie per completare la modifica dei record, in genere bloccando i record nella fonte dati subito dopo la modifica.
  • adLockOptimistic
    Blocco ottimistico, record per record: il provider blocca i record solo quando viene chiamato il metodo Update.
  • adLockBatchOptimistic
    Aggiornamenti batch ottimistici: necessari per la modalità di aggiornamento batch rispetto a quella di aggiornamento immediato.

Osservazioni
Utilizzare questa proprietà prima di aprire il Recordset per specificare il tipo di lock da utilizzare durante le modifiche. Leggere il valore per conoscere il tipo di lock in uso da un Recordset già aperto. La proprietà è di lettura/scrittura quando il Recordset è chiuso e di sola lettura quando è aperto.

È possibile che il driver non supporti tutti i tipi di lock. Se il tipo di lock richiesto non è supportato verrà sostituito con un altro supportato. Per determinare la funzionalità di lock disponibili utilizzare Supports con adUpdate e adUpdateBatch.

Se CursorLocation è impostata su adUseClient, l'impostazione adLockPessimistic non sarà supportata.
Utilizzo di Remote Data Service
Quando si usa un Recordset del client (ADOR), l'unico valore valido di lock è adLockOptimisticBatch.

MarshalOptions Quando si utilizza un Recordset del client (ADOR), i record modificati sul client vengono riscritti sul livello intermedio o sul server Web utilizzando una tecnica denominata marshaling. Con questo termine si indica il processo di assemblaggio e invio dei parametri di metodo dell'interfaccia attraverso limiti di thread o processo.
L'impostazione di MarshalOptions consente di ottenere un sensibile miglioramento delle prestazioni quando i dati remoti modificati vengono inviati di nuovo al livello intermedio o al server Web per l'aggiornamento.

I valori possibili sono:

  • adMarshalAll
    Valore predefinito. Indica che tutte le righe verranno restituite al server.
  • adMarshalModifiedOnly
    Indica che solo le righe modificate verranno restituite al server.

MaxRecords Utilizzare questa proprietà per limitare il numero di record che il driver restituirà dalla fonte dati. L'impostazione predefinita di questa proprietà è zero, vale a dire che il provider restituirà tutti i record richiesti.
La proprietà è di lettura/scrittura quando il Recordset è chiuso e di sola lettura quando è aperto.

PageCount Utilizzare questa proprietà per determinare il numero di "pagine" di dati contenute nel Recordset.

Le pagine sono gruppi di record le cui dimensioni sono pari all'impostazione di PageSize. Anche se l'ultima pagina è incompleta, poichè è disponibile un numero minore di record rispetto al valore di PageSize, verrà contata come pagina supplementare nel valore di PageCount.

Se il Recordset non supporta questa proprietà, verrà restituito -1 a indicare che non è possibile determinarne il valore.

Per ulteriori informazioni sulla funzionalità delle pagine, vedere anche PageSize e AbsolutePage.

PageSize Indica il numero di record che costituiscono una "pagina" del Recordset.
Il valore predefinito è 10.

Osservazioni
Utilizzare questa proprietà per determinare il numero di record che costituiscono una pagina logica di dati. L'impostazione delle dimensioni di una pagina consente di utilizzare AbsolutePage per spostarsi sul primo record di una pagina specifica. Si tratta di una funzione utile in ambienti basati su server Web, quando si desidera consentire all'utente di scorrere i dati visualizzando ogni volta solo un numero limitato di record.

Questa proprietà può essere impostata in qualsiasi momento e il valore ottenuto verrà utilizzato per calcolare la posizione del primo record di una pagina specifica.

RecordCount Indica il numero corrente di record contenuti nel Recordset.

Osservazioni
Questa proprietà ritorna il numero di record contenuti nel Recordset.
La proprietà restituirà -1 se il driver non è in grado di determinare il numero di record. Se la viene letta in un Recordset chiuso, verrà restituito un errore.

Se il Recordset supporta il posizionamento approssimativo o i segnalibri, vale a dire Supports(adApproxPosition) o Supports(adBookmark), RecordCount restituirà il numero esatto di record presenti indipendentemente dal fatto che il RecordSet sia stato completamente compilato oppure no.
In caso contrario è possibile che il driver tenti il recupero ed il conteggio di tutti i record in modo da restituire un valore preciso.

Sort Permette di specificare uno o più nomi di campo in base ai quali viene effettuato l'ordinamento del Recordset, nonchè il tipo di ordinamento, crescente o decrescente.

Il valore deve essere una stringa di nomi di campo separati da virgole, se il nome del campo è preceduto dalla parola chiave ASCENDING verrà usato un ordinamento crescente, se viene usata la parola chiave DESCENDING verrà usato l'ordinamento decrescente.

I dati non vengono riordinati fisicamente, ma l'accesso viene eseguito in base alla sequenza di ordinamento.

Se CursorLocation è impostata su adUseClient e non è ancora disponibile alcun indice, per ciascun campo specificato verrà creato un indice temporaneo.

Impostando questa proprietà su una stringa vuota verrà ripristinato l'ordinamento originale delle righe e verranno eliminati gli indici temporanei, mentre gli indici esistenti non verranno cancellati.

Source Indica l'origine dei dati del Recordset, cioè una istruzione SQL, il nome di una tabella, un oggetto Command o il nome di una Stored Procedure.

Osservazioni
Questa proprietà viene utilizzata per specificare una fonte dati per il Recordset utilizzando un'oggetto Command oppure un'istruzione SQL o una stored procedure o un nome di tabella. La proprietà è di lettura/scrittura se il Recordset è chiuso e di sola lettura quando il Recordset è aperto.

Se la Source viene impostata su un oggetto Command, la proprietà ActiveConnection del Recordset erediterà il valore della stessa proprietà dell'oggetto Command specificato. La lettura della proprietà tuttavia non restituirà un oggetto Command bensì la proprietà CommandText dell'oggetto Command.

Se Source è un'istruzione SQL, una stored procedure o un nome di tabella, sarà possibile ottimizzare le prestazioni richiamando l'argomento opz appropriato tramite Open.

State Indica lo stato corrente del Recordset che esegue un metodo asincrono ovvero se è in fase di connessione, di esecuzione o se sta eseguendo un'operazione di fetch.

Il valore restituito può essere una o una combinazione delle seguenti costanti:

  • adStateClosed
    Predefinita. L'oggetto è chiuso.
  • adStateOpen
    L'oggetto è aperto.
  • adStateConnecting
    L'oggetto Recordset è in fase di connessione.
  • adStateExecuting
    L'oggetto Recordset sta eseguendo un comando.
  • adStateFetching
    È in corso un'operazione di fetch per le righe dell'oggetto Recordset.

Osservazioni
Questa proprietà può essere utilizzata per determinare lo stato corrente di un determinato oggetto in qualsiasi momento. Si tratta di una proprietà di sola lettura.

Status Indica lo stato del record corrente in relazione agli aggiornamenti in modalità batch o ad altre operazioni di gruppo.

Restituisce la somma di uno o più dei seguenti valori:

  • adRecOK
    L'aggiornamento del record è riuscito.
  • adRecNew
    Il record è nuovo.
  • adRecModified
    Il record è stato modificato.
  • adRecDeleted
    Il record è stato eliminato.
  • adRecUnmodified
    Il record non è stato modificato.
  • adRecInvalid
    Il record non è stato salvato perchè il segnalibro non è valido.
  • adRecMultipleChanges
    Il salvataggio del record non è stato eseguito poichè avrebbe riguardato più record.
  • adRecPendingChanges
    Il record non è stato salvato poichè si riferisce a un inserimento in sospeso.
  • adRecCanceled
    Il record non è stato salvato poichè l'operazione è stata annullata.
  • adRecCantRelease
    Il nuovo record non è stato salvato a causa del blocco dei record esistenti.
  • adRecConcurrencyViolation
    Il record non è stato salvato poichè era attiva la concorrenza ottimistica.
  • adRecIntegrityViolation
    Il record non è stato salvato a causa della violazione dei vincoli di integrità da parte dell'utente.
  • adRecMaxChangesExceeded
    Il record non è stato salvato a causa di un numero eccessivo di modifiche in sospeso.
  • adRecObjectOpen
    Il record non è stato salvato a causa di un conflitto con un oggetto di memorizzazione aperto.
  • adRecOutOfMemory
    Il record non è stato salvato poichè la memoria necessaria non è sufficiente.
  • adRecPermissionDenied
    Il record non è stato salvato poichè l'utente non dispone delle autorizzazioni sufficienti.
  • adRecSchemaViolation
    Il record non è stato salvato poichè viola la struttura del database di origine.
  • adRecDBDeleted
    Il record è già stato eliminato dalla fonte dati.

Osservazioni
Questa proprietà viene utilizzata per visualizzare le modifiche in sospeso per i record modificati durante l'aggiornamento in modalità batch.
È possibile utilizzarla anche per visualizzare lo stato dei record che presentano problemi durante l'esecuzione di operazioni di gruppo come ad esempio quando vengono richiamati i metodi Resync, UpdateBatch o CancelBatch oppure quando la proprietà Filter viene impostata su una matrice di segnalibri.>br> Questa proprietà consente di stabilire la causa dell'errore di un determinato record e correggerlo di conseguenza.

Metodi

Open Apre un recordset.

Sintassi


recordset.Open src, conn, tipo, lock, opz
  • src
    oggetto Command, un'istruzione SQL, un nome di tabella, una chiamata di una Stored Procedure oppure il nome del file di un recordset precedentemente salvato.
  • conn
    oggetto Connection valido o stringa contenente i parametri ConnectionString
  • tipo
    valore che determina il tipo di cursore che il provider deve utilizzare quando apre il Recordset (opzionale).
    Tale valore può essere una seguenti costanti:
    • adOpenForwardOnly
      Apre un cursore a scorrimento in avanti (impostazione predefinita).
    • adOpenKeyset
      Apre un cursore direzionabile.
    • adOpenDynamic
      Apre un cursore dinamico.
    • adOpenStatic
      Apre un cursore statico.
    Vedere anche CursorType
  • lock
    Valore che determina il tipo di blocco o concorrenza che il provider deve utilizzare quando apre il recordset (opzionale). Tale valore può essere una delle seguenti costanti:
    • adLockReadOnly
      Sola lettura: è Impossibile modificare i dati (impostazione predefinita).
    • adLockPessimistic
      Blocco pessimistico record per record - Il provider esegue le operazioni necessarie per assicurare la corretta modifica dei record, in genere vincolando i record nella fonte dati in fase di modifica.
    • adLockOptimistic
      Blocco ottimistico record per record - Il provider utilizza il blocco ottimistico, vincolando i record solo quando viene chiamato il metodo Update.
    • adLockBatchOptimistic
      Aggiornamento batch ottimistico - Richiesto per la modalità di aggiornamento batch in contrapposizione con la modalità di aggiornamento immediato.
    Vedere anche LockType
  • opz
    Valore che indica come il provider deve valutare l'argomento src se questo non rappresenta un oggetto Command o che il recordset deve essere ripristinato da un file in cui era stato precedentemente salvato (opzionale). Tale valore può essere una delle seguenti costanti:
    • adCmdText
      Indica che il provider dovrà valutare src come una definizione in formato testo di un comando.
    • adCmdTable
      Indica che ADO dovrà generare una query SQL per restituire tutte le righe della tabella indicata nell'argomento src.
    • adCmdTableDirect
      Indica che il provider dovrà restituire tutte le righe della tabella indicata nell'argomento src.
    • adCmdStoredProc
      Indica che il provider dovrà valutare src come una stored procedure.
    • adCmdUnknown
      Indica che il tipo di comando nell'argomento src non è conosciuto.
    • adCommandFile
      Indica che il Recordset fissato o salvato dovrà essere ripristinato dal file indicato nell'argomento src.
    • adExecuteAsync
      Indica che src dovrà essere eseguito in modalità asincrona.
    • adFetchAsync
      Indica che dopo il fetch della quantità iniziale specificata nella proprietà CacheSize deve essere eseguito il fetch asincrono sulle righe rimanenti.

Osservazioni
Utilizzando il metodo Open su un Recordset, si apre un cursore che rappresenta record di una tabella di base, i risultati di una query o un recordset salvato in precedenza.

Utilizzare l'argomento src opzionale per specificare una fonte dati con un oggetto Command, un'istruzione SQL, una stored procedure, un nome di tabella o il percorso completo di un file. L'argomento conn corrisponde alla proprietà ActiveConnection e specifica durante quale connessione aprire il Recordset. Se si passa una definizione di connessione per questo argomento, verrà aperta una nuova connessione utilizzando i parametri specificati. È possibile modificare il valore di questa proprietà dopo avere aperto il recordset per inviare aggiornamenti a un altro provider.

In Microsoft Visual Basic è anche possibile impostare questa proprietà su Nothing per disconnettere il recordset da qualsiasi provider.

Per gli altri argomenti che corrispondono direttamente alle proprietà del Recordset, ovvero src, tipo e lock, la relazione tra gli argomenti e le proprietà è la seguente:

  • La proprietà è di lettura/scrittura prima che il Recordset venga aperto.
  • Le impostazioni delle proprietà vengono utilizzate a meno che non si passino gli argomenti corrispondenti durante l'esecuzione di Open. Se si passa un argomento, questo avrà la priorità sull'impostazione della proprietà corrispondente e l'impostazione verrà aggiornata con il valore dell'argomento.
  • Dopo l'apertura del Recordset queste proprietà diventano di sola lettura.
Nota Nel caso di Recordset di cui Source è impostata su un oggetto Command valido la proprietà ActiveConnection è di sola lettura anche se il Recordset non è stato aperto.

Se si passa un oggetto Command nell'argomento src insieme a un argomento conn, si verificherà un errore.

La proprietà ActiveConnection dell'oggetto Command deve essere già impostata su una Connection o su una stringa di connessione.

Se non si passa un oggetto Command nell'argomento src, sarà possibile utilizzare l'argomento opz per ottimizzare la valutazione dell'argomento src. Se l'argomento opz non è definito, le prestazioni potranno risultare ridotte dal momento che è necessario effettuare chiamate al provider per determinare se l'argomento è un'istruzione SQL, una stored procedure o un nome di tabella. Se si conosce il tipo di src in uso, impostando l'argomento opz si indicherà ad ADO di andare direttamente al codice che interessa. Se l'argomento opz non corrisponde al tipo src, si verificherà un errore.

Il valore predefinito per l'argomento opz sarà adCommandFile se non vi è alcuna connessione associata al recordset. Questo è il caso tipico per i Recordset salvati.

Se la fonte dati non restituisce alcun record, il provider imposterà le proprietà BOF e EOF su True e la posizione del record corrente non verrà definita. È ancora possibile aggiungere nuovi dati a questo oggetto Recordset vuoto se il tipo di cursore lo consente.

Una volta concluse le operazioni su un oggetto Recordset aperto, utilizzare il metodo Close per rendere disponibili le risorse di sistema associate. Se si chiude un oggetto, questo non verrà rimosso dalla memoria. Sarà infatti possibile modificarne le impostazioni delle proprietà e utilizzare il metodo Open per riaprirlo in un secondo momento. Per eliminare completamente un oggetto dalla memoria impostare la variabile oggetto su Nothing.

MoveFirst, MoveLast, MoveNext e MovePrevious Spostano la posizione del record corrente rispettivamente sul primo, sull'ultimo, sul successivo o sul precedente record.

Sintassi


recordset.MoveFirst
recordset.MoveLast
recordset.MoveNext
recordset.MovePrevious
Osservazioni
Un Recordset ha un record definito come "corrente", questo record è quello a cui è possibile accedere tramite la collection Fields, e che è possibile manipolare con i metodi Edit e Delete, i metodi MoveX, consentono di spostarsi all'interno del Recordset, rendendo un altro record come "corrente".
MoveFirst imposta il primo record come corrente, MoveLast imposta l'ultimo, questi sono spostamenti di tipo "assoluto", MoveNext e MovePrevious si basano invece sul record corrente per impostare il successivo o il precedente.

Se l'ultimo record è il record corrente e si chiama il metodo MoveNext, il record corrente verrà impostato sulla posizione successiva all'ultimo record del recordset, ed EOF sarà impostata a True. Se si tenta di spostare in avanti la posizione del record quando EOF è True, si genererà un errore.

Allo stesso modo, se il primo record è il record corrente e si chiama MovePrevious, il record corrente verrà impostato sulla posizione precedente al primo record e BOF verrà impostata a True. Cercare di spostare all'indietro il Recordset quando BOF è True genererà un errore.

Se il recordset è a scorrimento in avanti e si desidera uno scorrimento sia in avanti che all'indietro, sarà possibile utilizzare la proprietà CacheSize per creare una cache di record che supporti lo spostamento all'indietro del cursore con i metodi MoveX. Dal momento che i record nella cache vengono caricati in memoria, si consiglia di non inserire nella cache più record di quelli necessari. È possibile chiamare il metodo MoveFirst in un oggetto Recordset a scorrimento in avanti, anche se in questo caso il provider potrebbe rieseguire il comando che ha generato l'oggetto Recordset.

Move Sposta la posizione del record corrente in un oggetto Recordset.

Sintassi


recordset.Move record, start
Parametri
  • record
    numero che specifica di quanti record deve essere spostata la posizione del record corrente. Se si specifica un numero negativo, la posizione viene spostata verso l'inizio del Recordset, specificando un numero positivo la posizione viene spostata verso la fine del Recordset.
  • start
    Specifica da dove partire per applicare lo spostamento, è possibile utilizzare un Bookmark oppure uno dei seguenti valori:
    • adBookmarkCurrent
      Inizia dal record corrente (impostazione predefinita).
    • adBookmarkFirst
      Inizia dal primo record.
    • adBookmarkLast
      Inizia dall'ultimo record.

Osservazioni
Se utilizzando Move si supera l'inizio o la fine del Recordset, la corrispondente proprietà EOF o BOF verrà impostata a True, ed il record corrente verrà posizionato appena oltre il primo o ultimo record.

Utilizzare Move su un Recordset vuoto genera un errore.

Utilizzando start, è possibile controllare da che punto iniziare il movimento, a condizione che il Recordset supporti i segnalibri. Se non è specificato, lo spostamento sarà relativo al record corrente.

Se si sta utilizzando la proprietà CacheSize per inserire localmente nella cache i record del provider, il passaggio di un argomento record che comporta lo spostamento del record corrente al di fuori del gruppo corrente di record presenti nella cache forzerà il recupero di un nuovo gruppo di record a partire da quello di destinazione. CacheSize determina la dimensione del gruppo recuperato e il record di destinazione corrisponde al primo record recuperato.

Se il Recordset è a solo scorrimento in avanti, sarà comunque possibile passare un argomento record minore di zero purchè la destinazione sia nell'ambito del gruppo corrente di record nella cache. Se dopo che è stato chiamato il metodo Move la posizione del record corrente si sposta oltre il primo record presente nella cache, si verificherà un errore. È pertanto possibile utilizzare una cache di record che supporti lo scorrimento in entrambe le direzioni anzichè un provider che supporta solo lo scorrimento in avanti. Dal momento che i record della cache vengono caricati in memoria, si consiglia di evitare di inserire nella cache più record di quelli necessari. Anche se in questo modo un oggetto Recordset a scorrimento in avanti supporta lo scorrimento all'indietro, se si chiama il metodo MovePrevious su un qualsiasi oggetto Recordset a scorrimento in avanti si genererà un errore.

Resync Aggiorna i dati del Recordset corrente in base al database corrispondente.

Sintassi


recordset.Resync records, valori
Parametri
  • records
    numero di record che saranno interessati dal metodo Resync (opzionale). Può essere una delle seguenti costanti:
    • adAffectCurrent
      Aggiorna solo il record corrente.
    • adAffectGroup
      Aggiorna i record che soddisfano l'impostazione corrente della proprietà Filter. È necessario che Filter sia valida per potere utilizzare questa opzione.
    • adAffectAll
      Aggiorna tutti i record inclusi quelli nascosti in base all'impostazione corrente di Filter (impostazione predefinita).
  • valori
    specifica se i valori corrispondenti devono essere sovrascritti (opzionale). Può essere una delle seguenti costanti:
    • adResyncAllValues
      I dati vengono sovrascritti e gli aggiornamenti in sospeso vengono annullati (impostazione predefinita).
    • adResyncUnderlyingValues
      I dati non vengono sovrascritti e gli aggiornamenti in sospeso non vengono annullati.

Osservazioni
Utilizzare questo metodo per risincronizzare i record del recordset corrente in base al database corrispondente. Questa funzionalità è utile se si sta utilizzando un cursore statico o a scorrimento in avanti, ma si desidera vedere le modifiche nel database corrispondente.

A differenza di Requery, Resync non riesegue il comando corrispondente dell'oggetto Recordset. I nuovi record del database corrispondente non saranno pertanto visibili.

Se non è possibile risincronizzare i record a causa di un conflitto con i dati corrispondente, ad esempio perchè un record è già stato eliminato da un altro utente, il provider restituirà una serie di avvisi all'insieme Errors e si verificherà un errore in fase di esecuzione. Utilizzare la proprietà Filter. (adFilterConflictingRecords) e la proprietà Status per individuare i record con conflitti.

Utilizzo di Remote Data Service
Resync non è disponibile su un Recordset sul lato client.

Requery Aggiorna i dati del Recordset rieseguendo la query

Sintassi


recordset.Requery opz
opz: Maschera di bit che indica le opzioni che interessano l'operazione (opzionale). Se questo parametro è impostato su adExecuteAsync, l'operazione verrà eseguita in modalità asincrona e al termine verrà inoltrato un evento RecordsetChangeComplete.

Osservazioni
Utilizzare questo metodo per aggiornare l'intero contenuto del Recordset in base alla fonte dati inoltrando di nuovo il comando originale e recuperando i dati una seconda volta. La chiamata di questo metodo equivale alla chiamata dei metodi Close e Open in successione. Se si modifica il record corrente o si aggiunge un nuovo record, si verificherà un errore.

Mentre il Recordset è aperto, le proprietà che definiscono la natura del cursore, ovvero CursorType, LockType, MaxRecords e così via, sono di sola lettura. Requery consente pertanto di aggiornare solo il cursore corrente. Per modificare una delle proprietà del cursore e vedere i risultati, è necessario utilizzare il metodo Close in modo che le proprietà diventino nuovamente di lettura/scrittura. È quindi possibile modificare le impostazioni delle proprietà e chiamare il metodo Open per riaprire il cursore.

Save Salva o fissa il Recordset in un file.

Sintassi


recordset.Save nomefile, formato
Parametri
  • nomefile
    Path completo del file in cui deve essere salvato il recordset.
  • formato
    Formato in cui deve essere salvato il recordset (opzionale). adPersistADTG è attualmente il valore predefinito e l'unico valore valido.

Osservazioni
Save può essere chiamato solo su un Recordset aperto. Utilizzare Open per ripristinare in un secondo tempo il recordset dal file creato.

Se la proprietà Filter è attiva, verranno salvate solo le righe accessibili dopo l'applicazione del filtro. Se il recordset è gerarchico, verranno salvati il recordset secondario e le relative righe secondarie associate, ma non il recordset principale.

Se il Recordset viene salvato per la prima volta, specificare nomefile. Se in seguito viene richiamato nuovamente Save, omettere nomefile altrimenti si verificherà un errore in fase di esecuzione. Se in seguito viene richiamato il Save con un nuovo nomefile, il Recordset verrà salvato nel nuovo file. Ambedue i file verranno tuttavia aperti.

Chiamando Save il Recordset non si chiude. È quindi possibile continuare a lavorare e salvare le ultime modifiche apportate. Il file di salvataggio rimane aperto finchè non viene chiuso il Recordset e in questo arco di tempo è possibile leggere lo stesso file con altre applicazioni, ma non scrivere su di esso.

Per motivi di protezione, Save non può essere utilizzato da uno script eseguito in Internet Explorer.

Durante un fetch, un'esecuzione o un aggiornamento asincrono Save viene sospeso fino al termine dell'operazione.

Al termine del salvataggio dei dati, la prima riga del Recordset sarà quella corrente.

Delete Elimina il record corrente o un gruppo di record.

Sintassi


recordset.Delete records
records numero di record che saranno interessati dalla cancellazione, può essere una delle seguenti costanti:
  • adAffectCurrent
    Elimina solo il record corrente (impostazione predefinita).
  • adAffectGroup
    Elimina i record che soddisfano l'impostazione corrente della proprietà Filter . Per potere utilizzare questa opzione, è necessario impostare la proprietà Filter su un valore valido.

Osservazioni

Utilizzando Delete si contrassegna per l'eliminazione il record corrente o un gruppo di record. Se il Recordset non consente l'eliminazione dei record, si verificherà un errore. Nella modalità di aggiornamento immediato le eliminazioni verranno eseguite immediatamente nel database. In caso contrario, i record verranno contrassegnati per l'eliminazione dalla cache e l'effettiva eliminazione verrà eseguita quando si chiamerà UpdateBatch. Per visualizzare i record eliminati, utilizzare la proprietà Filter.

Il recupero dei valori dei campi dal record eliminato genera un errore. Dopo l'eliminazione, il record corrente rimane tale fin quando non ci si sposta su un record differente. Una volta che ci si è spostati dal record eliminato, non sarà più possibile accedere al record eliminato.

Se in una transazione le eliminazioni vengono nidificate, è possibile recuperare i record eliminati richiamando RollbackTrans. Nella modalità di aggiornamento batch è possibile annullare un'eliminazione o un gruppo di eliminazioni in sospeso richiamando CancelBatch.

Se non è possibile eliminare i record a causa di un conflitto con i dati corrispondenti, ad esempio perchè un record è già stato eliminato da un altro utente, il provider restituirà una serie di avvisi all'insieme Errors ma l'esecuzione del programma non verrà interrotta. Si verificherà un errore in fase di elaborazione solo se vi sono conflitti su tutti i record richiesti.

Per individuare i record che presentano conflitti, utilizzare la proprietà Filter (adFilterAffectedRecords) e la proprietà Status.

UpdateBatch Scrive sul disco tutti gli aggiornamenti batch in sospeso.

Sintassi


recordset.UpdateBatch records
records numero di records che saranno interessati dall'aggiornamento (opzionale). Può essere una delle seguenti costanti:
  • adAffectCurrent
    Scrive le modifiche in sospeso solo per il record corrente.
  • adAffectGroup
    Scrive le modifiche in sospeso per i record che soddisfano l'impostazione corrente della proprietà Filter se questa è impostata su un valore valido.
  • adAffectAll
    Scrive le modifiche in sospeso per tutti i record, inclusi quelli nascosti in base all'impostazione corrente di Filter (impostazione predefinita).

Osservazioni
Usare questo metodo quando si modifica un Recordset nella modalità di aggiornamento batch per trasmettere tutte le modifiche apportate al database corrispondente.

Se il Recordset supporta l'aggiornamento batch, sarà possibile memorizzare localmente nella cache diverse modifiche per uno o più record finchè non verrà chiamato UpdateBatch. Se si modifica il record corrente o si aggiunge un nuovo record quando si chiama UpdateBatch, verrà automaticamente chiamato Update per salvare le modifiche in sospeso per il record corrente prima di trasmettere al provider le modifiche in gruppi.

Nota utilizzare l'aggiornamento batch solo con un cursore direzionabile o statico.

Se non è possibile eliminare i record a causa di un conflitto con i dati corrispondenti, ad esempio perchè un record è già stato eliminato da un altro utente, il provider restituirà una serie di avvisi all'insieme Errors ma l'esecuzione del programma non verrà interrotta. Si verificherà un errore in fase di elaborazione solo se vi sono conflitti su tutti i record richiesti.

Per individuare i record che presentano conflitti, utilizzare la proprietà Filter (adFilterAffectedRecords) e la proprietà Status. Per annullare tutti gli aggiornamenti batch in sospeso, utilizzare CancelBatch.

CancelBatch Annulla un aggiornamento batch in sospeso.

Sintassi


recordset.CancelBatch records
records numero di records che verranno interessati (opzionale). Può essere una delle seguenti costanti:
  • adAffectCurrent
    solo il record corrente.
  • adAffectGroup
    tutti i record che soddisfano l'impostazione corrente della proprietà Filter se questa è impostata su un valore valido
  • adAffectAll
    tutti i record del Recordset, inclusi quelli nascosti in base all'impostazione corrente di Filter (impostazione predefinita).

Osservazioni
Utilizzare CancelBatch per annullare qualsiasi aggiornamento in sospeso nella modalità di aggiornamento batch. Se il recordset è nella modalità di aggiornamento immediato, chiamando CancelBatch senza adAffectCurrent si genererà un errore.

Se si sta modificando il record corrente o si sta aggiungendo un nuovo record quando si chiama CancelBatch, verrà innanzitutto chiamato il metodo CancelUpdate per annullare le modifiche nella cache, quindi annullerà tutte le modifiche in sospeso nel recordset.

Talvolta non è possibile determinare il record corrente dopo una chiamata del metodo CancelBatch, soprattutto in caso di aggiunta di un nuovo record. Si consiglia quindi di impostare la posizione del record corrente su una posizione conosciuta all'interno del recordset dopo la chiamata a CancelBatch. Chiamare ad esempio il metodo MoveFirst.

Se non è possibile annullare gli aggiornamenti in sospeso a causa di un conflitto con i dati corrispondenti, ad esempio perchè un record è già stato eliminato da un altro utente, il provider restituirà una serie di avvisi all'insieme Errors ma l'esecuzione del programma non verrà interrotta. Si verificherà un errore in fase di elaborazione solo se vi sono conflitti su tutti i record richiesti.

Per individuare i record che presentano conflitti, utilizzare la proprietà Filter (adFilterAffectedRecords) e la proprietà Status.

CancelUpdate Annulla qualsiasi modifica apportata al record corrente o a un nuovo record prima di chiamare il metodo Update.

Sintassi


recordset.CancelUpdate
Osservazioni
Utilizzare CancelUpdate per annullare qualsiasi modifica apportata al record corrente o per eliminare un record appena aggiunto. Non è possibile annullare le modifiche nel record corrente o in un nuovo record dopo avere chiamato Update, a meno che queste non facciano parte di una transazione che è possibile annullare con RollbackTrans o di un aggiornamento batch che è possibile annullare con CancelBatch.

Se si sta aggiungendo un nuovo record quando si chiama CancelUpdate, il record che costituiva il record corrente prima della chiamata AddNew sarà ancora tale.

Se non sono state apportate modifiche al record corrente o non è stato aggiunto un nuovo record, chiamando CancelUpdate si genererà un errore.

Update Salva le modifiche apportate al record corrente.

Sintassi


recordset.Update fields, values
Parametri
  • fields
    Elemento che rappresenta un singolo nome o elenco di valori che rappresenta i nomi o le posizioni ordinali del campo o dei campi che si desidera modificare (opzionale).
  • values
    Elemento che rappresenta un singolo valore o elenco di valori che rappresenta i valori del campo o dei campi nel nuovo record (opzionale).

Osservazioni
Utilizzare Update per salvare le modifiche apportate al record corrente a partire dalla chiamata del metodo AddNew o dalla modifica di un valore qualsiasi di un campo in un record esistente. Il Recordset deve supportare gli aggiornamenti.

Per impostare i valori dei campi, effettuare una delle seguenti operazioni:

  • Assegnare valori alla proprietà Value di un oggetto Field e chiamare Update.
  • Passare un nome di campo e un valore come argomenti chiamando Update.
  • Passare una matrice di nomi di campo e una matrice di valori chiamando Update.

Quando si utilizzano elenchi di campi e di valori, deve essere presente lo stesso numero di elementi in entrambe gli elenchi. L'ordine dei nomi dei campi deve inoltre corrispondere all'ordine dei valori dei campi. Se il numero e l'ordine dei campi e dei valori non corrispondono, si verificherà un errore.

Se il Recordset supporta l'aggiornamento batch, sarà possibile memorizzare localmente nella cache diverse modifiche per uno o più record ed utilizzare poi UpdateBatch.
Se si modifica il record corrente o si aggiunge un nuovo record quando si chiama UpdateBatch, verrà chiamato automaticamente Update per salvare le modifiche in sospeso per il record corrente prima di trasmettere al provider le modifiche in gruppi.

Se ci si sposta dal record che si sta aggiungendo o modificando prima di chiamare Update, questi verrà automaticamente richiamato per salvare le modifiche. Se si desidera annullare le modifiche apportate al record corrente o eliminare un record appena aggiunto, è necessario chiamare CancelUpdate. Il record corrente rimane tale anche dopo che è stato chiamato il metodo Update.

AddNew Crea un nuovo record per un Recordset aggiornabile.

Sintassi


recordset.AddNew fields, values
Parametri
  • fields
    Nome o elenco di nomi o di posizioni ordinali per i campi nel nuovo record (opzionale).
  • values
    Valore o elenco di valori per i campi nel nuovo record (opzionale). Se fields è un elenco, anche values dovrà essere un elenco con lo stesso numero di elementi, altrimenti si verificherà un errore. L'ordine dei nomi dei campi deve corrispondere all'ordine dei valori dei campi in ciascun elenco.

Osservazioni
Utilizzare AddNew per creare e inizializzare un nuovo record. Utilizzare il metodo Supports con adAddNew per verificare se è possibile aggiungere record al Recordset corrente.

Dopo che è stato chiamato AddNew, il nuovo record diventa il record corrente e rimane tale finchè non viene richiamato Update. Se il Recordset non supporta segnalibri, potrebbe non essere possibile accedere al nuovo record dopo essersi spostati su un altro record. A seconda del tipo di cursore, potrebbe essere necessario chiamare Requery per rendere accessibile il nuovo record.

Se viene chiamato AddNew durante la modifica del record corrente o durante l'aggiunta di un nuovo record, ADO chiamerà il metodo Update in modo che le modifiche vengano salvate, quindi creerà il nuovo record.

Il comportamento di AddNew dipende dalla modalità di aggiornamento del Recordset e dal fatto che vengano o meno passati gli argomenti fields e values.

Nella modalità di aggiornamento immediato, ovvero nella modalità in cui il provider apporta le modifiche nella fonte dati corrispondente dopo che è stato chiamato il Update, se si chiama il metodo AddNew senza argomenti EditMode verrà impostata su adEditAdd. Il provider memorizza nella cache qualsiasi modifica dei valori dei campi apportata localmente. Se si chiama il metodo Update, il nuovo record verrà inserito nel database ed EditMode verrà reimpostata su adEditNone. Se si passano gli argomenti fields e values, il nuovo record verrà inserito immediatamente nel database, senza che sia necessario chiamare Update. Il valore di EditMode non verrà tuttavia modificato.

Nella modalità di aggiornamento batch, ovvero nella modalità in cui il provider memorizza nella cache più modifiche e le apporta nella fonte dati corrispondente solo quando viene chiamato UpdateBatch, se si chiama AddNew senza argomenti, EditMode verrà impostata su adEditAdd. Il provider memorizza nella cache qualsiasi modifica dei valori dei campi apportata localmente. Se si chiama Update, il nuovo record verrà aggiunto al recordset corrente ed EditMode verrà reimpostata su adEditNone, ma il provider non inserirà le modifiche nel database corrispondente finchè non verrà chiamato UpdateBatch. Se si passano gli argomenti fields e values, ADO invierà il nuovo record al provider perchè lo memorizzi nella cache. Per inoltrare il nuovo record al database corrispondente, è necessario chiamare UpdateBatch.

Supports Consente di determinare se il Recordset supporta o mento una particolare funzione o caratteristica.

Sintassi


booleano = recordset.Supports( opz )
Ritorna True se le caratteristiche specificate da opz sono supportate dal Recordset, altrimenti ritorna False.

Parametri

opz è un valore che può essere composto da uno o più delle costanti seguenti:

  • adAddNew
    È possibile utilizzare AddNew per aggiungere nuovi record.
  • adApproxPosition
    È possibile leggere e impostare le proprietà AbsolutePosition e AbsolutePage.
  • adBookmark
    Il Recordset supporta i Bookmark.
  • adDelete
    È possibile utilizzare Delete per eliminare record.
  • adHoldRecords
    È possibile recuperare più record o modificare la successiva posizione di recupero senza confermare tutte le modifiche in sospeso.
  • adMovePrevious
    È possibile utilizzare MoveFirst, MovePrevious..., Move o GetRows per spostare all'indietro la posizione del record corrente senza utilizzare segnalibri.
  • adResync
    È possibile aggiornare il cursore con i dati visibili nel database corrispondente utilizzando Resync.
  • adUpdate
    È possibile utilizzare Update per modificare i dati esistenti.
  • adUpdateBatch
    È possibile utilizzare l'aggiornamento batch mediante UpdateBatch e CancelBatch per trasmettere al provider le modifiche in gruppi.

Osservazioni
Anche se Supports può restituire True per una determinata funzione, questo non garantisce che il provider possa sempre rendere disponibile tale funzione. Supports indica semplicemente se il provider supporta o meno quella specifica funzione, a condizione che alcuni criteri specificati siano soddisfatti. Supports consente ad esempio di indicare che un Recordset supporta gli aggiornamenti anche se il cursore è basato su un join a più tabelle di cui alcune colonne non sono aggiornabili.

Clone Crea un Recordset duplicato da un Recordset esistente. Se lo si desidera, è possibile specificare che il clone sia di sola lettura.

Sintassi


Set rstDuplicato = rstOriginale.Clone(lock)
Valori restituiti
Restituisce un riferimento ad un nuovo Recordset

Parametri

  • rstDuplicato
    Variabile che identifica il nuovo Recordset che si sta creando.
  • rstOriginale
    Recordset che si desidera duplicare.
  • lock
    specifica il tipo di lock del Recordset originale o un recordset di sola lettura (opzionale).
    • adLockUnspecified
      Clone creato con lo stesso tipo di blocco dell'originale (impostazione predefinita).
    • adLockReadOnly
      Clone di sola lettura.

Osservazioni
Utilizzare Clone per creare più Recordset duplicati, in particolare se si desidera mantenere più di un record corrente in un dato gruppo di record. L'utilizzo di Clone è più efficace rispetto alla creazione e all'apertura di un nuovo Recordset con la stessa definizione dell'originale.

Il record corrente di un clone appena creato viene impostato sul primo record.

Le modifiche apportate ad un Recordset sono visibili in tutti i relativi cloni, indipendentemente dal tipo di cursore. Dopo avere eseguito Requery sul recordset originale, i cloni non saranno tuttavia più sincronizzati con l'originale.

Chiudendo il recordset originale non si chiudono le relative copie e chiudendo una copia non si chiude l'originale o alcuna delle altre copie.

È possibile clonare solo Recordset che supportano i segnalibri. I valori dei segnalibri sono intercambiabili, vale a dire che un segnalibro di un Recordset fa riferimento allo stesso record di tutti i relativi cloni.

GetRows Recupera più righe da un Recordset.

Sintassi


Set varMatrice = recordset.GetRows(numrighe)
varMatrice Lista in cui vengono memorizzati i record restituiti
numrighe Numero di record da recuperare

Osservazioni

Utilizzare GetRows per copiare record da un Recordset. GetRows restituisce una matrice bidimensionale. Il primo indice identifica il campo, mentre il secondo identifica il numero di riga.

Nel seguente esempio, intCampo identifica il campo e intRecord identifica il numero di riga:


avarRecord(intCampo, intRecord)
Per ottenere il primo valore di campo nella seconda riga, utilizzare un codice simile a questo:

campo1 = avarRecord(0,1)
Per ottenere il secondo valore di campo nella prima riga, utilizzare un codice simile a questo:

campo2 = avarRecord(1,0)
Quando GetRows restituisce i dati, la variabile avarRecord diventa automaticamente una matrice bidimensionale.

Se si richiedono più righe di quante ne sono disponibili, GetRows restituisce solo il numero di righe disponibili. È possibile utilizzare la funzione UBound per determinare il numero di righe effettivamente recuperato da GetRows, in quanto la matrice viene dimensionata per contenere la quantità di righe restituite.

Il numero di righe che è possibile recuperare è vincolato dalla quantità di memoria disponibile. Non utilizzare GetRows per recuperare in una matrice un'intera tabella se quest'ultima è di grandi dimensioni.

Poichè GetRows restituisce nella matrice tutti i campi del Recordset, compresi i campi di tipo Memo e di tipo Long Binary, per limitare il numero di campi restituiti si potrebbe utilizzare una query.

Dopo una chiamata a GetRows, il record corrente viene posizionato sulla successiva riga non letta. Questo significa che GetRows ha sul record corrente lo stesso effetto di Move numrighe.

Se si sta tentando di recuperare tutte le righe utilizzando più chiamate a GetRows, utilizzare la proprietà EOF per essere sicuri di essere alla fine del Recordset. Se si trova alla fine del Recordset, o se non riesce a recuperare una riga inclusa nell'intervallo richiesto, GetRows restituisce un numero di righe minore rispetto a quello richiesto. Se, ad esempio, si sta tentando di recuperare 10 record, ma non si riesce a recuperare il quinto di essi, GetRows restituisce quattro record e rende corrente il quinto. Non verrà generato alcun errore di run-time. Questo errore può verificarsi se un record in un Recordset di tipo dynaset viene eliminato da un altro utente.


L'autore Davide Bianchi, pomposamente definito Software Engineer dal biglietto da visita, lavora per la Square bv, società olandese con sede a Roermond, che si occupa di sviluppo di software con orientamento grafico. Attualmente stà lavorando in Java (e si diverte un sacco).

Contribuire
Hai dei documenti interessanti o utili che trattano argomenti legati al mondo dell'informatica da pubblicare ? leggi come.
Come giudichi questo Documento ?
Hai trovato questo documento utile? inutile? interessante? noioso? fammelo sapere
Copyright Il presente sito è frutto del sudore della mia fronte (e delle mie dita), se siete interessati a ripubblicare uno degli articoli, documenti o qualunque altra cosa presente in questo sito per cortesia datemene comunicazione, così il giorno che faccio delle aggiunte potrò avvisarvi e magari mandarvi il testo aggiornato.

Questo sito è composto interamente con Ultraeditor.
Ultimo aggiornamento: 16 Luglio 2000