Partager via


Utilisation des recordsets

L’objet Recordset dispose de fonctionnalités intégrées qui vous permettent de réorganiser l’ordre des données dans le jeu de résultats, de rechercher un enregistrement spécifique en fonction des critères que vous fournissez, et même d’optimiser ces opérations de recherche à l’aide d’index. Si ces fonctionnalités sont disponibles pour une utilisation dépend du fournisseur et, dans certains cas, comme celle de la propriété Index, la structure de la source de données elle-même.

Réorganisation des données

Fréquemment, le moyen le plus efficace de commander les données dans votre Recordset consiste à spécifier une clause ORDER BY dans la commande SQL utilisée pour renvoyer les résultats à celui-ci. Toutefois, vous devrez peut-être modifier l’ordre des données dans un Recordset qui a déjà été créé. Vous pouvez utiliser la propriété Sort pour établir l’ordre dans lequel les lignes d’un Recordset sont parcourues. En outre, la propriété Filter détermine les lignes accessibles lors de la traversée des lignes.

La propriété Sort définit ou retourne une valeur String qui indique les noms de champs dans le Recordset sur lequel trier. Chaque nom est séparé par une virgule et est éventuellement suivi d’un espace et du mot clé ASC (qui trie le champ dans l’ordre croissant) ou DESC (qui trie le champ dans l’ordre décroissant). Par défaut, si aucun mot clé n’est spécifié, le champ est trié dans l’ordre croissant.

L’opération de tri est efficace, car les données ne sont pas réorganisés physiquement, mais sont accessibles dans l’ordre spécifié par un index.

La propriété Sort nécessite que la propriété CursorLocation soit définie sur adUseClient. Un index temporaire est créé pour chaque champ spécifié dans la propriété Sort si un index n’existe pas déjà.

La définition de la propriété Sort sur une chaîne vide réinitialise les lignes à leur ordre d’origine et supprime les index temporaires. Les index existants ne seront pas supprimés.

Supposons qu’un Recordset contient trois champs nommés firstName, middleInitial et lastName. Définissez la propriété Sort sur la chaîne « lastName DESC, firstName ASC », qui commande le Recordset par nom dans l’ordre décroissant, puis par prénom dans l’ordre croissant. L’initial intermédiaire est ignoré.

Aucun champ référencé dans une chaîne de critères de tri ne peut être nommé « ASC » ou « DESC », car ces noms sont en conflit avec les mots clés ASC et DESC. Donnez un champ qui a un nom en conflit un alias à l’aide du mot clé AS dans la requête qui retourne le Recordset.

Pour plus d’informations sur le filtrage des Recordset, consultez « Filtrage des résultats » plus loin dans cette rubrique.

Rechercher un enregistrement spécifique

ADO fournit les méthodes Find et Seek pour localiser un enregistrement particulier dans un Recordset. La méthode Find est prise en charge par divers fournisseurs, mais elle est limitée à un critère de recherche unique. La méthode Seek prend en charge la recherche sur plusieurs critères, mais n’est pas prise en charge par de nombreux fournisseurs.

Les index sur les champs peuvent considérablement améliorer les performances de la méthode Find, Sort et Filter les propriétés de l’objet Recordset. Vous pouvez créer un index interne pour un objet Field en définissant sa propriété Optimize dynamique. Cette propriété dynamique est ajoutée à la collection Properties de l’objet Field lorsque vous définissez la propriété CursorLocation sur adUseClient. N’oubliez pas que cet index est interne à ADO : vous ne pouvez pas y accéder ou l’utiliser à tout autre usage. De plus, cet index est distinct de la propriété Index de l’objet Recordset.

La méthode Find recherche rapidement une valeur dans une colonne (champ) d’un Recordset. Vous pouvez fréquemment améliorer la vitesse de la méthode Find sur une colonne à l’aide de la propriété Optimize pour créer un index.

La méthode Find limite votre recherche au contenu d’un champ. La méthode Seek nécessite également que vous ayez un index et qu’elle présente d’autres limitations. Si vous devez effectuer une recherche sur plusieurs champs qui ne sont pas la base d’un index ou si votre fournisseur ne prend pas en charge les index, vous pouvez limiter vos résultats à l’aide de la propriété Filter de l’objet Recordset.

Rechercher

La méthode Find recherche un Recordset pour la ligne qui satisfait à un critère spécifié. Si vous le souhaitez, la direction de la recherche, la ligne de départ et le décalage de la ligne de départ peuvent être spécifiées. Si le critère est rempli, la position de ligne actuelle est définie sur l’enregistrement trouvé ; sinon, la position est définie sur la fin (ou le début) du Recordset, selon la direction de la recherche.

Seul un nom à colonne unique peut être spécifié pour le critère. En d’autres termes, cette méthode ne prend pas en charge les recherches sur plusieurs colonnes.

L’opérateur de comparaison pour le critère peut être « > » (supérieur à), « < » (inférieur à), « = » (égal), « >= » (supérieur ou égal), « <= » (inférieur ou égal), « <> » (non égal) ou « LIKE » (critères spéciaux).

La valeur de critère peut être une chaîne, un nombre à virgule flottante ou une date. Les valeurs de chaîne sont délimitées par des guillemets simples ou « # » (signe numérique) (par exemple, « state = 'WA' » ou « state = #WA# »). Les valeurs de date sont délimitées par des marques « # » (signe numérique) (par exemple, « start_date > #7/22/97# »).

Si l’opérateur de comparaison est « like », la valeur de chaîne peut contenir un astérisque (*) pour rechercher une ou plusieurs occurrences de n’importe quel caractère ou sous-chaîne. Par exemple, « state like 'M*' » correspond à Maine et Massachusetts. Vous pouvez également utiliser des astérisque de début et de fin pour rechercher une sous-chaîne contenue dans les valeurs. Par exemple, « state like '*as*' » correspond à Alaska, Arkansas et Massachusetts.

Les astérisque peuvent être utilisés uniquement à la fin d’une chaîne de critères, ou à la fois au début et à la fin d’une chaîne de critères, comme indiqué plus tôt. Vous ne pouvez pas utiliser l’astérisque comme caractère générique de début ('*str') ou caractère générique incorporé ('s*r'). Cela entraîne une erreur.

Seek et Index

Utilisez la méthode Seek avec la propriété Index si le fournisseur sous-jacent prend en charge les index sur l’objet Recordset. Utilisez la méthode Supports(adSeek) pour déterminer si le fournisseur sous-jacent prend en charge Seek et la méthode Supports(adIndex) pour déterminer si le fournisseur prend en charge les index. (Par exemple, le fournisseur OLE DB pour Microsoft Jet prend en charge Seek et Index.)

Si la méthode Seek ne trouve pas la ligne souhaitée, aucune erreur ne se produit et la ligne est positionnée à la fin du Recordset. Définissez la propriété Index sur l’index souhaité avant d’exécuter cette méthode.

Cette méthode est prise en charge uniquement avec les curseurs côté serveur. Seek n’est pas pris en charge lorsque la valeur de propriété CursorLocation de l’objet Recordset est adUseClient.

Cette méthode peut être utilisée uniquement lorsque l’objet Recordset a été ouvert avec une valeur CommandTypeEnum d’adCmdTableDirect.

Filtrer les résultats

La méthode Find limite votre recherche au contenu d’un champ. La méthode Seek nécessite également que vous ayez un index et qu’elle présente d’autres limitations. Si vous devez effectuer une recherche sur plusieurs champs qui ne sont pas la base d’un index ou si votre fournisseur ne prend pas en charge les index, vous pouvez limiter vos résultats à l’aide de la propriété Filter de l’objet Recordset.

Utilisez la propriété Filter pour filtrer sélectivement les enregistrements dans un objet Recordset . Le Recordset filtré devient le curseur actuel, ce qui signifie que les enregistrements qui ne répondent pas aux critères Filter ne sont pas disponibles dans le Recordset tant que Filter n’est pas supprimé. Les autres propriétés qui retournent des valeurs basées sur le curseur actuel sont affectées, telles que AbsolutePosition, AbsolutePage, RecordCount et PageCount. Cela est dû au fait que la définition de la propriété Filter sur une valeur spécifique déplace l’enregistrement actif vers le premier enregistrement qui satisfait à la nouvelle valeur.

La propriété Filter accepte un argument variant. Cette valeur représente l’une des trois méthodes d’utilisation de la propriété Filter : une chaîne de critères, une constante FilterGroupEnum ou un tableau de signets. Pour plus d’informations, consultez Filtrer avec une chaîne de critères, Filtrer avec une constante et Filtrer avec signets plus loin dans cette rubrique.

Remarque

Lorsque vous connaissez les données que vous souhaitez sélectionner, il est généralement plus efficace d’ouvrir un recordset avec une instruction SQL qui filtre efficacement le jeu de résultats, au lieu de s’appuyer sur la propriété Filter .

Pour supprimer un filtre d’un Recordset, utilisez la constante adFilterNone. La définition de la propriété Filter sur une chaîne de longueur nulle (« ») a le même effet que l’utilisation de la constante adFilterNone.

Filtrer avec une chaîne de critères

La chaîne de critères se compose de clauses dans la valeur de l’opérateur FieldName (par exemple, "LastName = 'Smith'"). Vous pouvez créer des clauses composées en concaténant des clauses individuelles avec AND (par exemple, "LastName = 'Smith' AND FirstName = 'John'") et OR (par exemple). "LastName = 'Smith' OR LastName = 'Jones'" Pour les chaînes de critères, utilisez les instructions suivantes :

  • FieldName doit être un nom de champ valide à partir de l’objet Recordset. Si le nom de champ contient des espaces, vous devez le mettre entre crochets.

  • L’opérateur doit être l’un des éléments suivants : <, >, <=, >=, <>, =, ou LIKE.

  • La valeur est la valeur avec laquelle vous allez comparer les valeurs de champ (par exemple, 'Smith', #8/24/95#, 12.345 ou $50.00). Utilisez des guillemets simples (') avec des chaînes et des signes de livre (#) avec des dates. Pour les nombres, vous pouvez utiliser des points décimaux, des signes dollar et une notation scientifique. Si l’opérateur est LIKE, la valeur peut utiliser des caractères génériques. Seul le signe astérisque (*) et le signe de pourcentage (%) sont autorisés, et ils doivent être le dernier caractère de la chaîne. La valeur ne peut pas être nulle.

    Remarque

    Pour inclure des guillemets uniques (') dans la valeur de filtre, utilisez deux guillemets simples pour en représenter un. Par exemple, pour filtrer sur O’Malley, la chaîne de critères doit être "col1 = 'O''Malley'". Pour inclure des guillemets simples au début et à la fin de la valeur de filtre, placez la chaîne avec des signes de livre (#). Par exemple, pour filtrer sur « 1 », la chaîne de critères doit être "col1 = #'1'#".

Il n’existe aucune priorité entre AND et OR. Les clauses peuvent être regroupées entre parenthèses. Toutefois, vous ne pouvez pas regrouper les clauses jointes par une OR, puis joindre le groupe à une autre clause avec un AND, comme suit.

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

Au lieu de cela, vous allez construire ce filtre comme suit.

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

Dans une clause LIKE, vous pouvez utiliser un caractère générique au début et à la fin du modèle (par exemple, LastName Like '*mit*') ou uniquement à la fin du modèle (par exemple, LastName Like 'Smit*').

Filtrer avec une constante

Les constantes suivantes sont disponibles pour le filtrage des Recordsets.

Constant Description
adFilterAffectedRecords Filtres pour afficher uniquement les enregistrements affectés par le dernier appel Delete, Resync, UpdateBatch ou CancelBatch.
adFilterConflictingRecords Filtre l’affichage des enregistrements ayant échoué à la dernière mise à jour par lot.
adFilterFetchedRecords Filtre l’affichage des enregistrements dans le cache actuel, c’est-à-dire les résultats du dernier appel pour récupérer des enregistrements à partir de la base de données.
adFilterNone Supprime le filtre actuel et restaure tous les enregistrements à afficher.
adFilterPendingRecords Filtre pour afficher uniquement les enregistrements qui ont été modifiés mais qui n’ont pas encore été envoyés au serveur. Applicable uniquement pour le mode de mise à jour par lots.

Les constantes de filtre facilitent la résolution des conflits d’enregistrements individuels lors du mode de mise à jour par lot en vous permettant d’afficher, par exemple, uniquement ces enregistrements affectés lors de l’appel de la méthode UpdateBatch comme dans l’exemple.

Attribute VB_Name = "modExaminingData"

Filtrer avec signets

Enfin, vous pouvez passer un tableau de signets variant à la propriété Filter. Le curseur résultant contient uniquement les enregistrements dont le signet a été transmis à la propriété. L’exemple de code suivant crée un tableau de signets à partir des enregistrements d’un recordset qui ont un « B » dans le champ ProductName. Il transmet ensuite le tableau à la propriété Filter et affiche des informations sur le Recordset filtrées résultant.

'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  

Créer le clone d’un recordset

Utilisez la méthode Clone pour créer plusieurs objets Recordset en double, en particulier si vous souhaitez conserver plusieurs enregistrements actifs dans un jeu d’enregistrements donné. L’utilisation de la méthode Clone est plus efficace que la création et l’ouverture d’un objet Recordset qui utilise la même définition que l’original.

L’enregistrement actuel d’un clone nouvellement créé est défini à l’origine sur le premier enregistrement. Le pointeur d’enregistrement actif dans un recordset cloné n’est pas synchronisé avec l’original ou inversement. Vous pouvez naviguer indépendamment dans chaque Recordset.

Les modifications apportées à un objet Recordset sont visibles dans tous ses clones, quel que soit le type de curseur. Cependant, après avoir exécuté Requery sur le Recordset original, les clones ne seront plus synchronisés avec l’original.

La fermeture du Recordset original ne ferme pas ses copies, et la fermeture d’une copie ne ferme pas l’original ni aucune des autres copies.

Vous ne pouvez cloner qu’un objet Recordset qui prend en charge les signets. Les valeurs de signet sont interchangeables ; autrement dit, une référence de signet d’un objet Recordset fait référence au même enregistrement dans l’un de ses clones.