Opération de commandes paramétrables
Si vous utilisez un grand jeu d'enregistrements enfant , en particulier par rapport à la taille du jeu d'enregistrements parent , mais que vous n'ayez besoin d'accéder qu'à quelques chapitres enfants, vous pourriez trouver plus efficace d’utiliser une commande paramétrée.
Une commande non paramétrable récupère l’ensemble des jeux d’enregistrements parents et enfants , ajoute une colonne de chapitre au parent, puis affecte une référence au chapitre enfant associé pour chaque ligne parente.
Une commande paramétrable récupère l’ensemble du jeu d’enregistrements parent , mais récupère uniquement le chapitre Recordset lorsque la colonne de chapitre est accessible. Cette différence dans la stratégie de récupération peut générer des avantages significatifs en matière de performances.
Par exemple, vous pouvez spécifier les éléments suivants :
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
Les tables parent et enfant ont un nom de colonne en commun, cust_id. La commande enfant a un espace réservé « ? », auquel fait référence la clause RELATE (autrement dit, « ... PARAMÈTRE 0").
Note
La clause PARAMETER se rapporte uniquement à la syntaxe de la commande shape. Il n’est pas associé à l’objet ado Parameter ou à la collection Parameters.
Lorsque la commande de forme paramétrée est exécutée, les éléments suivants se produisent :
L'instruction parente est exécutée et retourne un ensemble d'enregistrements parent à partir de la table des Clients.
Une colonne de chapitre est ajoutée au jeu d’enregistrements parent .
Lorsque la colonne de chapitre d'une ligne parente est accédée, la commande enfant , qui est identifiée par, est exécutée en utilisant la valeur de customer.cust_id comme valeur du paramètre.
Toutes les lignes de l’ensemble de lignes du fournisseur de données créées à l’étape 3 sont utilisées pour remplir le jeu d’enregistrements enfant . Dans cet exemple, il s’agit de toutes les lignes de la table Orders dans laquelle la cust_id est égale à la valeur de customer.cust_id. Par défaut, le jeu d’enregistrements enfant s est mis en cache sur le client jusqu’à ce que toutes les références au jeu d’enregistrements parent soient publiées. Pour modifier ce comportement, définissez le jeu d’enregistrements propriété dynamiqueCache Child Rows sur False.
Une référence aux lignes enfants récupérées (autrement dit, le chapitre du jeu d’enregistrements enfant ) est placée dans la colonne du chapitre de la ligne actuelle du jeu d’enregistrements parent .
Les étapes 3 à 5 sont répétées lorsque la colonne de chapitre d’une autre ligne est accessible.
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 paramètre unique, le jeu d’enregistrements enfant pour une valeur de paramètre donnée sera mis en cache entre les requêtes d’un enfant avec cette valeur. Le code suivant illustre ceci :
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 enfants parent complexes
Outre l’utilisation de commandes paramétrables pour améliorer les performances d’une hiérarchie de type equi-join, les 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 : une composée des équipes (team_id, team_name) et l’autre des jeux (date, home_team, visiting_team).
À l’aide d’une hiérarchie non paramétrable, il n’existe aucun moyen de lier les équipes et les tables de jeux de telle sorte que l’enfant Recordset pour chaque équipe contient sa planification complète. Vous pouvez créer des chapitres qui contiennent le calendrier des matchs à domicile ou le calendrier des matchs à l'extérieur, mais pas les deux. Cela est dû au fait que la clause RELATE vous limite aux relations parent-enfant du formulaire (pc1=cc1) AND (pc2=pc2). Par conséquent, si votre commande incluait « RELATE team_id TO home_team, team_id TO visiting_team », vous obtiendriez uniquement des jeux où une équipe jouait elle-même. Ce que vous souhaitez est « (team_id=home_team) OU (team_id=visiting_team) », mais le fournisseur Shape ne prend pas en charge la clause OU.
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.
Note
Lorsque vous utilisez des clauses WHERE, les paramètres ne peuvent pas utiliser les types de données SQL pour le texte, ntext et image ou il en résultera une erreur contenant la description suivante : Invalid operator for data type
.
Voir aussi
exemple de mise en forme des données
Grammaire formelle de formes
Commandes générales de forme