Condividi tramite


Utilizzo dei recordset

L'oggetto Recordset dispone di caratteristiche integrate che consentono di modificare l'ordine dei dati nel set di risultati, per cercare un record specifico in base ai criteri che si forniscono e anche per ottimizzare le operazioni di ricerca usando gli indici. La disponibilità di queste caratteristiche dipende dal provider e in alcuni casi, ad esempio quello della proprietà Index, dalla struttura dell'origine dati stessa.

Disposizione dei dati

Spesso, il modo più efficiente per ordinare i dati nell'oggetto Recordset consiste nello specificare una clausola ORDER BY nel comando SQL usato per restituire i risultati. Potrebbe talvolta essere necessario modificare l'ordine dei dati in un Recordset che è già stato creato. È possibile utilizzare la proprietà Sort per stabilire l'ordine in cui vengono incrociate le righe di un oggetto Recordset. La proprietà Filter determina invece le righe a cui è possibile accedere durante l'incrocio delle righe.

La proprietà Sort imposta o restituisce un valore String che indica i nomi dei campi nel Recordset in base ai quali eseguire l'ordinamento. Ogni nome è separato da una virgola ed è facoltativamente seguito da uno spazio e dalla parola chiave ASC, che ordina il campo in ordine crescente, o DESC, che ordina il campo in ordine decrescente. Per impostazione predefinita, se non viene specificata alcuna parola chiave, il campo viene ordinato in ordine crescente.

L'operazione di ordinamento è efficiente perché i dati non vengono riorganizzati fisicamente, ma sono accessibili nell'ordine specificato dall'indice.

La proprietà Sort richiede che la proprietà CursorLocation sia impostata su adUseClient. Se non esiste già, viene creato un indice temporaneo per ogni campo specificato nella proprietà Sort.

L'impostazione della proprietà Sort su una stringa vuota reimposta le righe nell'ordine originale ed elimina gli indici temporanei. Gli indici esistenti non verranno eliminati.

Si supponga che un Recordset contenga tre campi denominati firstName, middleInitial e lastName. Impostare la proprietà Sort sulla stringa "lastName DESC, firstName ASC", che ordinerà l'oggetto Recordset per cognome in ordine decrescente e quindi per nome in ordine crescente. L'iniziale centrale viene ignorata.

Nessun campo a cui viene fatto riferimento in una stringa di criteri di ordinamento può essere denominato "ASC" o "DESC" perché tali nomi sono in conflitto con le parole chiave ASC e DESC. È possibile assegnare un alias a un campo con nome in conflitto usando la parola chiave AS nella query che restituisce l'oggetto Recordset.

Per altre informazioni sull'applicazione di filtri all'oggetto Recordset, vedere "Filtro dei risultati" più avanti in questo argomento.

Ricerca di un record specifico

L'interfaccia ADO fornisce i metodi Find e Seek per individuare un record specifico in un oggetto Recordset. Il metodo Find è supportato da un'ampia gamma di provider, ma è limitato a un singolo criterio di ricerca. Il metodo Seek supporta la ricerca in base a più criteri, ma non è supportato da molti provider.

Gli indici nei campi possono migliorare enormemente le prestazioni del metodo Find e delle proprietà Sort e Filter dell'oggetto Recordset. È possibile creare un indice interno per un oggetto Field impostando la relativa proprietà dinamica Optimize. Questa proprietà dinamica viene aggiunta alla raccolta Properties dell'oggetto Field quando si imposta la proprietà CursorLocation su adUseClient. Tenere presente che questo indice è interno ad ADO. Non è possibile accedervi o usarlo per altri scopi. Inoltre, questo indice è distinto dalla proprietà Index dell'oggetto Recordset.

Il metodo Find individua rapidamente un valore all'interno di una colonna (campo) di un oggetto Recordset. È spesso possibile migliorare la velocità del metodo Find in una colonna usando la proprietà Optimize per applicare un indice al campo.

Il metodo Find limita la ricerca al contenuto di un singolo campo. Il metodo Seek richiede che sia presente un indice e presenta anche altre limitazioni. Se si devono eseguire ricerche in più campi che non sono la base di un indice o se il provider non supporta gli indici, è possibile limitare i risultati usando la proprietà Filter dell'oggetto Recordset.

Find

Il metodo Find cerca in un oggetto Recordset la riga che soddisfa un criterio specificato. Facoltativamente, è possibile specificare la direzione della ricerca, la riga iniziale e l'offset dalla riga iniziale. Se il criterio viene soddisfatto, la posizione della riga corrente viene impostata sul record trovato; in caso contrario, la posizione è impostata sulla fine (o sull'inizio) dell'oggetto Recordset, a seconda della direzione di ricerca.

Per il criterio è possibile specificare solo un nome di colonna singolo. In altre parole, questo metodo non supporta le ricerche in più colonne.

L'operatore di confronto per il criterio può essere ">" (maggiore di), "<" (minore di), "=" (uguale a), ">=" (maggiore di o uguale a), "<=" (minore di o uguale a), "<>" (diverso da) o "LIKE" (corrispondenza ai criteri).

Il valore del criterio può essere una stringa, un numero a virgola mobile o una data. I valori stringa sono delimitati da virgolette singole o "#" (segno di cancelletto), ad esempio "state = 'WA'" o "state = #WA#"). I valori di data sono delimitati da segni di cancelletto "#", ad esempio "start_date > #7/22/97#".

Se l'operatore di confronto è "like", il valore stringa può contenere un asterisco (*) per trovare una o più occorrenze di un qualsiasi carattere o una qualsiasi sottostringa. La stringa "state like 'M*'" trova ad esempio Maine e Massachusetts. È anche possibile usare asterischi iniziali e finali per trovare una sottostringa contenuta all'interno dei valori. Ad esempio, "state like '*as*'" corrisponde ad Alaska, Arkansas e Massachusetts.

Gli asterischi possono essere usati solo alla fine di una stringa di criteri o insieme sia all'inizio sia alla fine di una stringa di criteri, come illustrato in precedenza. Non è possibile usare l'asterisco come carattere jolly iniziale ('*str') o come carattere jolly incorporato ('s*r'). Questo tipo di utilizzo genererà un errore.

Seek e Index

Usare il metodo Seek insieme alla proprietà Index se il provider sottostante supporta gli indici nell'oggetto Recordset. Usare il metodo Supports(adSeek) per determinare se il provider sottostante supporta il metodo Seek e il metodo Support(adIndex) per determinare se il provider supporta gli indici. Ad esempio, il provider OLE DB per Microsoft Jet supporta Seek e Index.

Se il metodo Seek non trova la riga desiderata, non si verifica alcun errore e la riga viene posizionata alla fine del Recordset. Impostare la proprietà Index sull'indice desiderato prima di eseguire questo metodo.

Questo metodo è supportato solo con cursori lato server. Il metodo Seek non è supportato quando il valore della proprietà CursorLocation dell'oggetto Recordset è adUseClient.

Questo metodo può essere usato solo quando l'oggetto Recordset è stato aperto con il valore di CommandTypeEnum impostato su adCmdTableDirect.

Filtro dei risultati

Il metodo Find limita la ricerca al contenuto di un singolo campo. Il metodo Seek richiede che sia presente un indice e presenta anche altre limitazioni. Se si devono eseguire ricerche in più campi che non sono la base di un indice o se il provider non supporta gli indici, è possibile limitare i risultati usando la proprietà Filter dell'oggetto Recordset.

Usare la proprietà Filter per visualizzare in modo selettivo i record in un oggetto Recordset. L'oggetto Recordset filtrato diventa il cursore corrente. Questo significa che i record che non soddisfano i criteri di Filter non sono disponibili nell'oggetto Recordset fino a quando non viene rimosso Filter. Altre proprietà che restituiscono valori basati sul cursore corrente sono interessate, ad esempio AbsolutePosition, AbsolutePage, RecordCount e PageCount. Ciò è dovuto al fatto che l'impostazione della proprietà Filter su un valore specifico sposta il record corrente al primo record che soddisfa il nuovo valore.

La proprietà Filter accetta un argomento variant. Questo valore rappresenta uno dei tre modi di usare la proprietà Filter: con una stringa di criteri, una costante FilterGroupEnum o una matrice di segnalibri. Per altre informazioni, vedere le sezioni Filtro con una stringa di criteri, Filtro con una costante e Filtro con segnalibri più avanti in questo argomento.

Nota

Quando si conoscono i dati da selezionare, in genere è più efficiente aprire un oggetto Recordset con un'istruzione SQL che filtra efficacemente il set di risultati, anziché basarsi sulla proprietà Filter .

Per rimuovere un filtro da un oggetto Recordset, usare la costante adFilterNone. L'impostazione della proprietà Filter su una stringa di lunghezza zero ("") produce lo stesso effetto che ha l'uso della costante adFilterNone.

Filtro con una stringa di criteri

La stringa di criteri è costituita da clausole nel formato NomeCampo Operatore Valore (ad esempio "LastName = 'Smith'"). È possibile creare clausole composte concatenando singole clausole con gli operatori AND (ad esempio "LastName = 'Smith' AND FirstName = 'John'") e OR (ad esempio "LastName = 'Smith' OR LastName = 'Jones'"). Usare le linee guida seguenti per le stringhe di criteri:

  • NomeCampo deve essere un nome di campo valido dell'oggetto Recordset. Se il nome campo include spazi, è necessario racchiuderlo tra parentesi quadre.

  • Operatore deve essere uno dei seguenti: <, >, <=, >=, <>, = o LIKE.

  • Valore è il valore con cui si confronteranno i valori del campo (ad esempio 'Smith', #8/24/95#, 12.345 o $50.00). Usare le virgolette singole (') con le stringhe e i segni di cancelletto (#) con le date. Per i numeri, è possibile usare le virgole decimali, i segni di dollaro e la notazione scientifica. Se l'operatore è LIKE, il valore può usare caratteri jolly. L'asterisco (*) e la percentuale (%) sono gli unici caratteri jolly consentiti e devono essere l'ultimo carattere nella stringa. Valore non può essere null.

    Nota

    Per includere le virgolette singole (') nel valore del filtro, usare due virgolette singole per rappresentarne una. Ad esempio, per filtrare in base a O'Malley, la stringa di criteri deve essere "col1 = 'O''Malley'". Per includere le virgolette singole sia all'inizio sia alla fine del valore del filtro, racchiudere la stringa tra segni di cancelletto (#). Per filtrare ad esempio in base a '1', la stringa di criteri deve essere "col1 = #'1'#".

Non esiste alcuna precedenza tra gli operatori AND e OR. Le clausole possono essere raggruppate tra parentesi. Non è tuttavia possibile raggruppare clausole unite da un operatore OR e unire il gruppo a un'altra clausola con l'operatore AND, come indicato di seguito.

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'  

È invece possibile costruire questo filtro come indicato di seguito.

(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')  

In una clausola LIKE è possibile usare un carattere jolly all'inizio e alla fine del modello (ad esempio LastName Like '*mit*') o solo alla fine del modello, ad esempio LastName Like 'Smit*'.

Filtro con una costante

Le costanti disponibili per filtrare gli oggetti Recordset sono indicate di seguito.

Costante Descrizione
adFilterAffectedRecords Filtra per visualizzare solo i record interessati dall'ultima chiamata Delete, Resync, UpdateBatch o CancelBatch.
adFilterConflictingRecords Filtra per visualizzare i record che hanno avuto esito negativo nell'ultimo aggiornamento batch.
adFilterFetchedRecords Filtra per visualizzare i record nella cache corrente, ovvero i risultati dell'ultima chiamata per recuperare i record dal database.
adFilterNone Rimuove il filtro corrente e ripristina tutti i record per la visualizzazione.
adFilterPendingRecords Filtri per la visualizzazione solo dei record modificati, ma non ancora inviati al server. Applicabile solo per la modalità di aggiornamento batch.

Le costanti di filtro semplificano la risoluzione dei conflitti di record singoli nella modalità di aggiornamento batch consentendo di visualizzare, ad esempio, solo i record interessati durante l'ultima chiamata al metodo UpdateBatch, come illustrato nell'esempio seguente.

Attribute VB_Name = "modExaminingData"

Filtro con segnalibri

È infine possibile passare una matrice variante di segnalibri alla proprietà Filter. Il cursore risultante conterrà solo i record i cui segnalibri sono stati passati alla proprietà. L'esempio di codice seguente crea una matrice di segnalibri dai record in un oggetto Recordset che contengono una "B" nel campo ProductName. Passa quindi la matrice alla proprietà Filter e visualizza le informazioni sull'oggetto Recordset filtrato risultante.

'BeginFilterBkmk  
Dim vBkmkArray() As Variant  
Dim i As Integer  
  
'Recordset created using "SELECT * FROM Products" as command.  
'So, we will check to see if ProductName has a capital B, and  
'if so, add to the array.  
i = 0  
Do While Not objRs.EOF  
    If InStr(1, objRs("ProductName"), "B") Then  
        ReDim Preserve vBkmkArray(i)  
        vBkmkArray(i) = objRs.Bookmark  
        i = i + 1  
        Debug.Print objRs("ProductName")  
    End If  
    objRs.MoveNext  
Loop  
  
'Filter using the array of bookmarks.  
objRs.Filter = vBkmkArray  
  
objRs.MoveFirst  
Do While Not objRs.EOF  
    Debug.Print objRs("ProductName")  
    objRs.MoveNext  
Loop  
'EndFilterBkmk  

Creazione di un clone di un oggetto Recordset

Usare il metodo Clone per creare più oggetti Recordset duplicati, soprattutto se si desidera mantenere più record correnti in un determinato set di record. L'utilizzo del metodo Clone è più efficiente rispetto alla creazione e all'apertura di un nuovo oggetto Recordset con la stessa definizione dell'originale.

Il record corrente di un clone appena creato viene inizialmente impostato sul primo record. Il puntatore del record corrente in un oggetto Recordset clonato non viene sincronizzato con l'originale o viceversa. È possibile spostarsi in modo indipendente in ciascun oggetto Recordset.

Le modifiche apportate a un oggetto Recordset sono visibili in tutti i cloni indipendentemente dal tipo di cursore. Tuttavia, dopo che si esegue Requery sull'oggetto Recordset originale, i cloni non verranno più sincronizzati con l'originale.

La chiusura del Recordset originale non chiude le copie e neanche chiudendo una copia viene chiuso l'originale o una qualsiasi delle altre copie.

È possibile clonare un oggetto Recordset solo se supporta i segnalibri. I valori dei segnalibri sono intercambiabili; ovvero, un riferimento di segnalibro da un oggetto Recordset fa riferimento allo stesso record in tutti i suoi cloni.