Partilhar via


Conjunto de registros: Parametrizando um conjunto de registros (ODBC)

Este tópico se aplica às classes ODBC do MFC.

Às vezes, você pode querer ser capaz de selecionar registros em tempo de execução, usando informações que você calculou ou obteve do seu usuário final. Os parâmetros do conjunto de registros permitem que você atinja essa meta.

Este tópico explica:

Conjuntos de registros parametrizados

Um conjunto de registros parametrizado permite passar informações de parâmetros em tempo de execução. Isto tem dois efeitos valiosos:

  • Isso pode resultar em melhor velocidade de execução.

  • Ele permite que você crie uma consulta em tempo de execução, com base em informações não disponíveis para você em tempo de design, como informações obtidas do usuário ou calculadas em tempo de execução.

Quando você chama Open para executar a consulta, o conjunto de registros usa as informações de parâmetro para concluir sua instrução SQL SELECT . Você pode parametrizar qualquer conjunto de registros.

Quando usar parâmetros

Os usos típicos para parâmetros incluem:

  • Passando argumentos em tempo de execução para uma consulta predefinida.

    Para passar parâmetros para um procedimento armazenado, você deve especificar uma instrução ODBC CALL personalizada completa — com espaços reservados para parâmetros — quando chamar Open, substituindo a instrução SQL padrão do conjunto de registros. Para obter mais informações, consulte CRecordset::Open na referência da biblioteca de classes e SQL: personalizando a instrução SQL do seu conjunto de registros (ODBC) e Recordset: declarando uma classe para uma consulta predefinida (ODBC).

  • Execução eficiente de inúmeras requisições com diferentes informações de parâmetros.

    Por exemplo, cada vez que o usuário final procura informações de um aluno específico no banco de dados de registro de alunos, você pode especificar o nome ou ID do aluno como um parâmetro obtido do usuário. Em seguida, quando você chama a função de membro do conjunto de registros Requery , a consulta seleciona apenas o registro do aluno.

    A cadeia de caracteres de filtro do conjunto de registros, armazenada no m_strFilter, pode ter esta aparência:

    "StudentID = ?"
    

    Suponha que você obtenha a ID do aluno na variável strInputID. Quando você define um parâmetro como strInputID (por exemplo, o ID do aluno 100), o valor da variável é vinculado ao espaço reservado do parâmetro representado pelo "?" na cadeia de caracteres do filtro.

    Atribua o valor do parâmetro da seguinte maneira:

    strInputID = "100";
    ...
    m_strParam = strInputID;
    

    Você não gostaria de configurar uma cadeia de caracteres de filtro desta maneira:

    m_strFilter = "StudentID = 100";   // 100 is incorrectly quoted
                                       // for some drivers
    

    Para obter uma discussão sobre como usar aspas corretamente para cadeias de caracteres de filtro, consulte Recordset: Filtering Records (ODBC).

    O valor do parâmetro é diferente cada vez que você consulta novamente o conjunto de registros para uma nova ID de estudante.

    Sugestão

    Usar um parâmetro é mais eficiente do que simplesmente um filtro. Para um conjunto de registros parametrizado, o banco de dados deve processar uma instrução SQL SELECT apenas uma vez. Para um conjunto de registros filtrado sem parâmetros, a instrução SELECT deve ser processada sempre que você Requery tiver um novo valor de filtro.

Para obter mais informações sobre filtros, consulte Recordset: Filtering Records (ODBC).

Parametrizando sua classe de conjunto de registros

Observação

Esta secção aplica-se a objetos derivados de CRecordset nos quais a extração em massa de linhas não foi implementada. Se você estiver usando a busca de linha em massa, a implementação de parâmetros é um processo semelhante. Para obter mais informações, consulte Recordset: Buscando registros em massa (ODBC).

Antes de criar sua classe de conjunto de registros, determine quais parâmetros você precisa, quais são seus tipos de dados e como o conjunto de registros os usa.

Para parametrizar uma classe de conjunto de registros

Observação

O assistente MFC ODBC Consumer não está disponível no Visual Studio 2019 e em versões posteriores. Você ainda pode criar essa funcionalidade manualmente.

  1. Execute o MFC ODBC Consumer Wizard de Add Class para criar a classe.

  2. Especifique membros de dados de campo para as colunas do conjunto de registros.

  3. Depois de o assistente gravar a classe em um ficheiro no seu projeto, vá para o arquivo .h e adicione manualmente um ou mais membros de dados de parâmetros à declaração de classe. A adição pode se parecer com o exemplo a seguir, parte de uma classe de instantâneo projetada para responder à consulta "Quais alunos estão na classe sênior?"

    class CStudentSet : public CRecordset
    {
    // Field/Param Data
        CString m_strFirstName;
        CString m_strLastName;
        CString m_strStudentID;
        CString m_strGradYear;
    
        CString m_strGradYrParam;
    };
    

    Adicione os seus parâmetros de dados após os campos de dados gerados pelo assistente. A convenção é acrescentar a palavra "Param" a cada nome de parâmetro definido pelo usuário.

  4. Modifique a definição de função de membro DoFieldExchange no arquivo .cpp. Adicione uma chamada de função RFX para cada membro de dados de parâmetro que você adicionou à classe. Para obter informações sobre como escrever suas funções RFX, consulte Record Field Exchange: How RFX Works. Preceda as chamadas RFX para os parâmetros com uma única chamada para:

    pFX->SetFieldType( CFieldExchange::param );
    // RFX calls for parameter data members
    
  5. No construtor da sua classe de conjunto de registos, incremente a contagem de parâmetros m_nParams.

    Para obter informações, consulte Record Field Exchange: Trabalhando com o código do assistente.

  6. Quando você escrever o código que cria um objeto de conjunto de registros dessa classe, coloque um "?" (ponto de interrogação) em cada lugar em suas cadeias de caracteres de instrução SQL onde um parâmetro deve ser substituído.

    Em tempo de execução, os espaços reservados "?" são preenchidos, em ordem, pelos valores de parâmetro que você passa. O primeiro membro de dados de parâmetro definido após a chamada SetFieldType substitui o primeiro "?" na cadeia de caracteres SQL, o segundo membro de dados de parâmetro substitui o segundo "?", e assim por diante.

Observação

A ordem dos parâmetros é importante: a ordem das chamadas RFX para parâmetros em sua DoFieldExchange função deve corresponder à ordem dos espaços reservados para parâmetros em sua cadeia de caracteres SQL.

Sugestão

A string mais adequada para uso é a que você especifica (se houver) para o membro de dados m_strFilter da classe, mas alguns drivers ODBC podem permitir parâmetros noutras cláusulas SQL.

Passando valores de parâmetro em tempo de execução

Você deve especificar valores de parâmetro antes de chamar Open (para um novo objeto de conjunto de registros) ou Requery (para um existente).

Para passar valores de parâmetro para um objeto de conjunto de registros em tempo de execução

  1. Construa o objeto do conjunto de registros.

  2. Prepare uma cadeia de caracteres ou cadeias, como a m_strFilter, contendo a instrução SQL ou partes dela. Coloque "?" como espaços reservados onde a informação do parâmetro deve ir.

  3. Atribua um valor de parâmetro de tempo de execução a cada elemento de dados de parâmetro do objeto.

  4. Chame a Open função de membro (ou Requery, para um conjunto de registros existente).

Por exemplo, suponha que você queira especificar uma cadeia de caracteres de filtro para seu conjunto de registros usando informações obtidas em tempo de execução. Suponha que você tenha construído um conjunto de registros de classe CStudentSet anteriormente — chamado rsStudents — e agora queira consultá-lo novamente para obter um tipo específico de informação do aluno.

// Set up a filter string with
// parameter placeholders
rsStudents.m_strFilter = "GradYear <= ?";

// Obtain or calculate parameter values
// to pass--simply assigned here
CString strGradYear = GetCurrentAcademicYear( );

// Assign the values to parameter data members
rsStudents.m_strGradYrParam = strGradYear;

// Run the query
if( !rsStudents.Requery( ) )
    return FALSE;

O conjunto de registros contém registros para os alunos cujos registros atendem às condições especificadas pelo filtro, que foi construído a partir de parâmetros de tempo de execução. Neste caso, o conjunto de registos contém registos para todos os alunos seniores.

Observação

Se necessário, você pode definir o valor de um membro de dados de parâmetro como Null, usando SetParamNull. Você também pode verificar se um membro de dados de parâmetro é Null, usando IsFieldNull.

Ver também

Conjunto de registros (ODBC)
Conjunto de registros: Adicionando, atualizando e excluindo registros (ODBC)
Conjunto de registros: Como os conjuntos de registros selecionam registros (ODBC)