Operação de comandos parametrizados
Aplica-se ao: Access 2013, Office 2013
Se você estiver trabalhando com um Recordset filho grande, especialmente em comparação com o tamanho do Recordset pai, mas precisar acessar apenas alguns capítulos do filho, poderá achar mais eficiente usar um comando com parâmetros.
Um comando sem parâmetros recupera os Recordsets pai e filho completos, acrescenta uma coluna de capítulo ao pai e atribui uma referência ao capítulo filho relacionado para cada linha pai.
Um comando com parâmetros recupera todo o Recordset pai, mas recupera apenas o Recordset do capítulo quando a coluna do capítulo é acessada. Essa diferença na estratégia de recuperação pode produzir melhoras significativas no desempenho.
Por exemplo, você pode especificar o seguinte:
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
As tabelas principais e subordinadas têm um nome de coluna em comum, cust_id*.* O comando subordinado tem um marcador de posição "?" ao qual a cláusula RELATE se refere (ou seja, "... PARÂMETRO 0").
Observação
[!OBSERVAçãO] A cláusula PARAMETER refere-se apenas à sintaxe do comando shape. Ela não está associada ao objeto Parameter do ADO ou à coleção Parameters.
Quando o comando shape com parâmetros é executado, ocorre o seguinte:
O parent-command é executado e retorna um Recordset pai da tabela Clientes.
Uma coluna de capítulo é acrescentada ao Recordset pai.
Quando a coluna de capítulo de uma linha pai é acessada, o child-command é executado usando o valor do customer.cust_id como valor do parâmetro.
Todas as linhas do conjunto de linhas do provedor de dados criado na etapa 3 são usadas para preencher o Recordset filho. Nesse exemplo, são todas as linhas da tabela Pedidos, na qual cust_id equivale ao valor de customer.cust_id. Por padrão, o Recordset filho será armazenado em cache no cliente até que todas as referências ao Recordset pai sejam liberadas. Para alterar este comportamento, defina a propriedade dinâmicaConjunto de registosLinhas Subordinadas da Cache como Falso.
Uma referência às linhas filhas recuperadas (ou seja, o capítulo do Recordset filho) é colocada na coluna de capítulo da linha atual do Recordset pai.
As etapas 3 a 5 serão repetidas quando for acessada a coluna de capítulo de outra linha.
A propriedade dinâmica Cache Child Rows é definida como True por padrão. O comportamento de cache varia dependendo dos valores de parâmetros da consulta. Em uma consulta com um único parâmetro, o Recordset filho de um dado valor de parâmetro será armazenado em cache entre as solicitações de um filho com esse valor. O código a seguir demonstra isso:
...
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.
...
Em uma consulta com dois ou mais parâmetros, um filho armazenado em cache será usado apenas se todos os valores de parâmetros corresponderem aos valores armazenados em cache.
Comandos parametrizados e relações subordinadas principais complexas
Além de usar comandos com parâmetros para melhorar o desempenho de uma hierarquia do tipo junção de igualdade, os comandos com parâmetros podem ser usados para oferecer suporte a relações pai-filho mais complexas. Por exemplo, considere um banco de dados do Campeonato Brasileiro com duas tabelas: uma com os times (id_time, nome_time) e outra com os jogos (data, time_da_casa, time_visitante).
Usando uma hierarquia sem parâmetros, não há uma maneira de relacionar as tabelas de times e de jogos de maneira que o Recordset filho para cada time contenha sua agenda completa. Você pode criar capítulos que contenham a agenda local ou a agenda de viagem, mas não as duas. Isso porque a cláusula RELATE o limita à relação pai-filho do formulário (pc1=cc1) AND (pc2=pc2). Assim, se o comando incluía "RELATE id_time TO time_da_casa, id_time TO time_visitante", você obteria apenas os jogos em que um time estivesse jogando consigo mesmo. O que você deseja é "(id_time=time_da_casa) OR (id_time=time_visitante)", mas o provedor Shape não oferece suporte à cláusula OR.
Para obter o resultado desejado, você pode usar um comando com parâmetros. Por exemplo:
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)
Esse exemplo explora a maior flexibilidade da cláusula SQL WHERE para obter o resultado necessário.