Operação de comandos parametrizados
Se você estiver trabalhando com um grande conjunto de registros filho , inclusive em comparação com o tamanho do conjunto de registros pai , mas precisar acessar apenas alguns capítulos filho, talvez você ache mais eficiente usar um comando parametrizado.
Um comando não parametrizado recupera todo o de conjuntos de registrospai e filho, acrescenta uma coluna de capítulo ao pai e atribui uma referência ao capítulo filho relacionado para cada linha pai.
Um comando parametrizado 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 gerar benefícios significativos de 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 pai e filho compartilham um nome de coluna em comum, cust_id. O comando filho possui um "?" como espaço reservado, ao qual a cláusula RELATE se refere (ou seja, "...PARÂMETRO 0").
Nota
A cláusula PARAMETER pertence exclusivamente à sintaxe do comando "shape". Ele não está associado ao objeto ADO Parameter ou à coleção parâmetros.
Quando o comando de forma parametrizada é executado, ocorre o seguinte:
O comando pai é executado e retorna um conjunto de registros pai da tabela Customer.
Uma coluna de capítulo é adicionada ao Conjunto de Dados do pai no.
Quando a coluna de capítulo de uma linha pai é acessada, o comando-filho é executado usando o valor de customer.cust_id como parâmetro.
Todas as linhas no conjunto de linhas do provedor de dados criadas na etapa 3 são usadas para preencher o Recordset filho . Neste exemplo, essas são todas as linhas na tabela Pedidos na qual o cust_id é igual ao valor de customer.cust_id. Por padrão, os Recordsets filhos serão armazenados em cache no cliente até que todas as referências ao Recordset pai sejam liberadas. Para alterar esse comportamento, defina o Recordset como propriedade dinâmicaLinhas de Cache Filho para Falso.
Uma referência às linhas recuperadas do conjunto de registros filho (ou seja, o capítulo do conjunto de registros filho) é colocada na coluna de capítulo da linha atual do conjunto de registros pai .
As etapas 3 a 5 são repetidas quando a coluna de capítulo de outra linha é acessada.
A propriedade dinâmica Linhas Filhas do Cache é definida como Verdadeiro por padrão. O comportamento de cache varia dependendo dos valores de parâmetro da consulta. Em uma consulta com um único parâmetro, o conjunto de registros filho para um determinado valor de parâmetro será armazenado em cache entre 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 somente se todos os valores de parâmetro corresponderem aos valores armazenados em cache.
Comandos parametrizados e relações filho pai complexas
Além de usar comandos parametrizados para melhorar o desempenho de uma hierarquia de tipo de equi-join, comandos parametrizados podem ser usados para dar suporte a relações pai-filho mais complexas. Por exemplo, considere um banco de dados da Little League com duas tabelas: uma composta por equipes (team_id, team_name) e outra de jogos (data, home_team, visiting_team).
Usando uma hierarquia não-parametrizada, não há como relacionar as tabelas de equipes e jogos de modo que o Recordset filho de cada equipe contenha sua agenda completa. Você pode criar capítulos que contêm a agenda de casa ou a agenda de viagens, mas não ambas. Isso ocorre porque a cláusula RELATE limita você a relações pai-filho da forma (pc1=cc1) E (pc2=pc2). Portanto, se seu comando incluísse "RELATE team_id TO home_team, team_id TO visiting_team", você só teria jogos em que um time estava jogando sozinho. O que você deseja é "(team_id=home_team) OR (team_id=visiting_team)", mas o provedor Shape não dá suporte à cláusula OR.
Para obter o resultado desejado, você pode usar um comando parametrizado. 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)
Este exemplo explora a maior flexibilidade da cláusula SQL WHERE para obter o resultado necessário.
Nota
Ao usar cláusulas WHERE, os parâmetros não podem usar os tipos de dados SQL para texto, ntext e imagem ou um erro resultará que contém a seguinte descrição: Invalid operator for data type
.
Consulte Também
Exemplo de modelagem de dados
Gramática Formal de Formas
Comandos de Forma em Geral