Compartilhar via


Operação de comandos parametrizados

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 filho, poderá achar mais eficiente usar um comando parametrizado.

Um comando não parametrizado recupera todos os Recordsets pai 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 de capítulo é acessada. Essa diferença na estratégia de recuperação pode gerar benefícios significativos de desempenho.

Por exemplo, você pode especificar as seguintes opções:

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

As tabelas pai e filho têm um nome de coluna em comum, cust_id. O child-command tem um espaço reservado "?", ao qual a cláusula RELATE se refere (ou seja, "... PARAMETER 0").

Observação

A cláusula PARAMETER pertence exclusivamente à sintaxe do comando shape. Ela não está associada ao objeto Parameter do ADO ou à coleção Parameters.

Quando o comando shape parametrizado é executado, ocorre o seguinte:

  1. O parent-command é executado e retorna um Recordset pai da tabela Clientes.

  2. Uma coluna de capítulo é acrescentada ao Recordset pai.

  3. Quando a coluna de capítulo de uma linha pai é acessada, o child-command é executado usando o valor de customer.cust_id como o valor do parâmetro.

  4. Todas as linhas no conjunto de linhas do provedor de dados criado na etapa 3 são usadas para preencher o Recordsetfilho. Neste exemplo, são todas as linhas na tabela Pedidos na qual o cust_id é igual 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 esse comportamento, defina a propriedade dinâmica Recordset Cache Child Rows como False.

  5. Uma referência às linhas filho recuperadas (ou seja, o capítulo do Recordset filho) é colocada na coluna de capítulo da linha atual do Recordsetpai.

  6. As etapas 3 a 5 são repetidas quando a coluna de capítulo de outra linha é acessada.

A propriedade dinâmica Cache Child Rows é definida como True 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 Recordset filho para 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 pai-filho complexas

Além do uso de comandos parametrizados para melhorar o desempenho de uma hierarquia de tipo de junção por igualdade, os comandos parametrizados podem ser usados para dar suporte a relações pai-filho mais complexas. Por exemplo, considere um banco de dados do Campeonato Brasileiro com duas tabelas: uma que consiste nas equipes (team_id, team_name) e outra dos jogos (data, home_team, visiting_team).

Usando uma hierarquia não parametrizada, não há como relacionar as equipes e tabelas de jogos de forma que o Recordset de cada equipe contenha sua agenda completa. Você pode criar capítulos que contenham a agenda inicial ou o agendamento do roteiro, mas não ambos. Isso ocorre porque a cláusula RELATE limita você a relações pai-filho do formulário (pc1=cc1) AND (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 estivesse 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 desejado.

Observação

No uso de cláusulas WHERE, se os parâmetros usarem os tipos de dados SQL para texto, ntext e imagem, um erro resultará na seguinte descrição: Invalid operator for data type.

Confira também

Exemplo de data shaping
Gramática de forma formal
Modelar comandos em geral