O conjunto de registros: Parametrização de um conjunto de registros (ODBC)

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

Às vezes, convém poder selecionar registros em tempo de execução, usando as informações que você tenha calculado ou obtido de seu usuário final. Parâmetros de conjunto de registros permitem atingir essa meta.

Este tópico explica:

  • A finalidade de um recordset parametrizada.

  • Quando e por que talvez você queira parametrizar um conjunto de registros.

  • Como declarar membros de dados na sua classe de recordset do parâmetro.

  • Como passar informações de parâmetro para um objeto recordset em tempo de execução.

Conjuntos de registros com parâmetros

Um conjunto de registros parametrizado permite passar informações de parâmetro em tempo de execução. Isso tem dois efeitos importante:

  • Ele pode resultar em maior velocidade de execução.

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

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

Quando usar parâmetros

Usos típicos para parâmetros incluem:

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

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

  • Com eficiência, executando várias requeries com informações de parâmetros diferentes.

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

    Seqüência de filtro do recordset, armazenada em m_strFilter, pode parecer com isso:

    "StudentID = ?"
    

    Suponha que você obtenha a identificação do aluno na variável strInputID. Quando você definir um parâmetro strInputID (por exemplo, o aluno ID 100), o valor da variável está vinculado ao espaço reservado de parâmetro, representado pelo "?" a seqüência de caracteres de filtro.

    Atribua o valor do parâmetro da seguinte maneira:

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

    Você não gostaria de definir uma seqüência de caracteres de filtro desta maneira:

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

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

    O valor do parâmetro é diferente a cada vez que repetir a consulta o conjunto de registros para uma nova identificação de aluno.

    Dica

    Usando um parâmetro é mais eficiente do que simplesmente um filtro. Para um conjunto de registros com parâmetros, o banco de dados deve processar um SQL Selecionar instrução apenas uma vez. Para um conjunto de registros filtrado sem parâmetros, o Selecionar declaração deve ser processada cada vez que você Requery com um novo valor de filtro.

Para obter mais informações sobre filtros, consulte Recordset: Filtragem de registros (ODBC).

Parametrização de sua classe de Recordset

ObservaçãoObservação

Esta seção se aplica aos objetos derivados de CRecordset no qual linha em massa buscando não foi implementada. Se você estiver usando uma linha em massa, buscando, implementação de parâmetros é um processo semelhante. Para obter mais informações, consulte Recordset: Buscar registros em massa (ODBC).

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

Para parametrizar uma classe de recordset

  1. Execute o Assistente de consumidor ODBC MFC de Add Class para criar a classe.

  2. Especifica os membros de dados de campo para colunas do conjunto de registros.

  3. Após o assistente grava a classe em um arquivo em seu projeto, vá para o arquivo. h e adicionar manualmente um ou mais membros de dados de parâmetro para a declaração de classe. A adição poderá parecer com o exemplo a seguir, a parte de uma classe de snapshot é projetado para responder à consulta "que os 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 membros de dados do parâmetro após os membros de dados do campo gerado pelo assistente. A convenção é acrescentar a palavra "param" o nome de cada parâmetro definido pelo usuário.

  4. Modificar o DoFieldExchange definição de função de membro no arquivo. cpp. Adicione uma chamada de função RFX para cada membro de dados de parâmetro que é adicionado à classe. Para obter informações sobre como escrever suas funções RFX, consulte troca de campo do registro: Como funciona o RFX. 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 classe recordset, incrementar a contagem de parâmetros, m_nParams.

    Para obter informações, consulte troca de campo do registro: Trabalhando com o código do assistente.

  6. Quando você escreve o código que cria um objeto recordset dessa classe, coloque um "?" símbolo (ponto de interrogação) em cada local em suas cadeias de caracteres de declaração de SQL, onde o parâmetro deve ser substituído.

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

ObservaçãoObservação

Ordem de parâmetro é importante: a ordem dos RFX chama para parâmetros no seu DoFieldExchange função deve corresponder a ordem dos espaços reservados de parâmetro na seqüência de SQL.

Dica

A seqüência de caracteres mais provável para trabalhar com é a seqüência de caracteres que você especificar (se houver) para a classe m_strFilter o membro de dados, mas alguns drivers ODBC podem permitir parâmetros em outras cláusulas SQL.

Valores de passagem de parâmetro em tempo de execução

Você deve especificar valores de parâmetro, antes de chamar Abrir (para um novo objeto recordset) ou Requery (para um já existente).

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

  1. Construa o objeto recordset.

  2. Preparar uma seqüência de caracteres ou seqüências de caracteres, como o m_strFilter seqüência de caracteres, que contém a declaração de SQL, ou partes dele. Colocar "?" espaços reservados onde as informações de parâmetro são ir.

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

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

Por exemplo, suponha que você deseja especificar uma seqüência de caracteres de filtro para o conjunto de registros usando informações obtidas em tempo de execução. Suponha ter criado um conjunto de registros da classe CStudentSet anteriormente — chamado rsStudents — e agora deseja repetir a consulta para um determinado tipo de informações 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 recordset contém registros para os alunos cujos registros atender às condições especificadas pelo filtro, foi construído a partir de parâmetros de tempo de execução. Nesse caso, o recordset contém registros para todos os alunos sênior.

ObservaçãoObservação

Se necessário, você pode definir o valor de um membro de dados do parâmetro como Null, usando SetParamNull. Você pode verificar, da mesma forma, se um membro de dados do parâmetro for Null, usando IsFieldNull.

Consulte também

Conceitos

O conjunto de registros (ODBC)

O conjunto de registros: Adicionar, atualizar e excluir registros (ODBC)

O conjunto de registros: Como os conjuntos de registros selecionar registros (ODBC)