Partager via


Fonctionnement des commandes paramétrées

Si vous travaillez avec un objet Recordset enfant volumineux, en particulier par rapport à la taille de l’objet Recordset parent, mais ne devez accéder qu’à quelques chapitres enfants, il peut être plus efficace d’utiliser une commande paramétrable.

Une commande non paramétrable récupère l’ensemble des objets Recordset parent et enfants, ajoute une colonne de chapitre au parent, puis affecte une référence au chapitre enfant associé pour chaque ligne parent.

Une commande paramétrable récupère l’objet Recordset parent entier, mais ne récupère que l’objet Recordset de chapitre lorsque la colonne de chapitre est accessible. Cette différence dans la stratégie de récupération peut produire des avantages significatifs en termes de performances.

Par exemple, vous pouvez spécifier ce qui suit :

SHAPE {SELECT * FROM customer}   
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}   
   RELATE cust_id TO PARAMETER 0)  

Les tables parent et enfants ont un nom de colonne en commun, cust_id. La commande enfant comprend un espace réservé « ? », auquel fait référence la clause RELATE (à savoir, « ... PARAMETER 0 »).

Remarque

La clause PARAMETER se rapporte uniquement à la syntaxe de la commande shape. Elle n’est associée ni à l’objet ADO Parameter, ni à la collection Parameters.

Lorsque la commande shape paramétrable est exécutée, les événements suivants se produisent :

  1. La commande parent est exécutée et retourne un objet Recordset parent à partir de la table Customers.

  2. Une colonne de chapitre est ajoutée à l’objet Recordset parent.

  3. Quand la colonne de chapitre d’une ligne parent est accessible, la commande enfant est exécutée en utilisant la valeur du customer.cust_id comme valeur du paramètre.

  4. Toutes les lignes de l’ensemble de lignes du fournisseur de données créé à l’étape 3 sont utilisées pour remplir l’objet Recordset enfant. Dans cet exemple, il s’agit de toutes les lignes de la table Orders dans laquelle le cust_id équivaut au customer.cust_id. Par défaut, les objets Recordset enfants sont mis en cache sur le client jusqu’à ce que toutes les références à l’objet Recordset parent soient publiées. Pour modifier ce comportement, définissez la propriété dynamique Recordset Cache Child Rows sur False.

  5. Une référence aux lignes enfants récupérées (autrement dit, le chapitre de l’objet Recordset enfant) est placée dans la colonne de chapitre de la ligne actuelle de l’objet Recordset parent.

  6. Les étapes 3 à 5 sont répétées lors de l’accès à la colonne de chapitre d’une autre ligne.

La propriété dynamique Cache Child Rows est définie sur True par défaut. Le comportement de mise en cache varie en fonction des valeurs de paramètre de la requête. Dans une requête avec un seul paramètre, l’objet Recordset enfant pour une valeur de paramètre donnée est mis en cache entre les requêtes d’un enfant avec cette valeur. Le code suivant illustre cela :

SCmd = "SHAPE {select * from customer} " & _  
         "APPEND({select * from orders where cust_id = ?} " & _  
         "RELATE cust_id TO PARAMETER 0) AS chpCustOrder"  
Rst1.Open sCmd, Cnn1  
Set RstChild = Rst1("chpCustOrder").Value  
Rst1.MoveNext      ' Next cust_id passed to Param 0, & new rs fetched   
                   ' into RstChild.  
Rst1.MovePrevious  ' RstChild now holds cached rs, saving round trip.  

Dans une requête avec deux paramètres ou plus, un enfant mis en cache est utilisé uniquement si toutes les valeurs de paramètre correspondent aux valeurs mises en cache.

Commandes paramétrables et relations parent-enfant complexes

En plus de l’utilisation de commandes paramétrables pour améliorer les performances d’une hiérarchie de type equi-join, des commandes paramétrables peuvent être utilisées pour prendre en charge des relations parent-enfant plus complexes. Par exemple, considérez une base de données Little League avec deux tables : l’une composée d’équipes (team_id, team_name) et l’autre de matchs (date, home_team, visiting_team).

Une hiérarchie non paramétrable n’offre aucun moyen de lier les tables d’équipes et de matchs de manière à ce que l’objet Recordset enfant de chaque équipe contienne son calendrier complet. Vous pouvez créer des chapitres contenant le calendrier à domicile ou le calendrier des déplacements, mais pas les deux. Cela est dû au fait que la clause RELATE vous limite aux relations parent-enfant de forme (pc1=cc1) AND (pc2=pc2). Ainsi, si votre commande incluait « RELATE team_id TO home_team, team_id TO visiting_team », vous obtiendriez uniquement les matchs où une équipe jouerait contre elle-même. Ce que vous souhaitez, c’est « (team_id=home_team) OR (team_id=visiting_team) », mais le fournisseur de commande Shape ne prend pas en charge la clause OR.

Pour obtenir le résultat souhaité, vous pouvez utiliser une commande paramétrable. Par exemple :

SHAPE {SELECT * FROM teams}   
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}   
        RELATE team_id TO PARAMETER 0,   
               team_id TO PARAMETER 1)   

Cet exemple exploite la plus grande flexibilité de la clause SQL WHERE pour obtenir le résultat dont vous avez besoin.

Remarque

Lorsque vous utilisez des clauses WHERE, les paramètres ne peuvent pas utiliser les types de données SQL pour les variables text, ntext et image, au risque de générer une erreur contenant la description suivante : Invalid operator for data type.

Voir aussi

Exemple de mise en forme des données
Grammaire formelle de la commande SHAPE
Généralités sur les commandes SHAPE