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

Este tópico se aplica a classes MFC ODBC.

Às vezes convém poder selecionar registros em tempo de execução usando informações 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 conjunto de registros com parâmetros.

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

  • Como declarar o parâmetro membros de dados em sua classe de conjunto de registros.

  • 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 com parâmetros 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 em informações não disponíveis em tempo de design, como as informações obtidas do usuário ou calculado em tempo de execução.

Quando você chamar Abrir para executar a consulta, o conjunto de registros usa as informações de parâmetro para concluir seu 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 do conjunto de registros padrão.Para obter mais informações, consulte CRecordset::Open na Referência de biblioteca de classe e SQL: declaração de SQL Personalizando seu do Recordset (ODBC) e Recordset: declarando uma classe para um predefinidos consulta ODBC ().

  • Executando com eficiência vários requeries com informações de parâmetro diferente.

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

    Seqüência de filtro do recordset, armazenada em m_strFilter, teria esta aparência:

    "StudentID = ?"
    

    Suponha que você obter o ID do aluno na variável strInputID.Quando você definir um parâmetro strInputID (por exemplo, o aluno ID 100) o valor da variável é vinculado ao espaço reservado de parâmetro representado pelo "?" na 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 configurar 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 seqüências de caracteres de filtro, consulte Recordset: filtragem de registros (ODBC).

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

    DicaDica

    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 declaração de uma só vez.Para um conjunto de registros filtrado sem parâmetros, o Selecionar instrução deve ser processada sempre que 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 conjunto de registros

ObservaçãoObservação

Esta seção se aplica aos objetos derivados de CRecordset em qual linha em massa buscando não foi implementada.Se você estiver usando a 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 conjunto de registros

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

  2. Especifica os membros de dados de campo para as 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 pode parecer algo como o exemplo a seguir, parte de uma classe instantâneo 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 de parâmetro após os membros de dados do campo gerado pelo assistente.A convenção é acrescentar a palavra "Param" para cada nome de 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 adicionado à classe.Para obter informações sobre como escrever suas funções RFX, consulte registro de campo Exchange: como funciona 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 sua classe de conjunto de registros, incrementar a contagem de parâmetros, m_nParams.

    Para obter informações, consulte registro de campo Exchange: 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 seqüências de caracteres de declaração de SQL onde um parâmetro é a ser substituído.

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

ObservaçãoObservação

Ordem do 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.

DicaDica

A seqüência mais provável para trabalhar com é a seqüência de caracteres que você especificar (se houver) para a classe m_strFilter 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 instruçã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 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 de 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 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.Nesse caso, o conjunto de registros 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.Da mesma forma você pode verificar se um membro de dados do parâmetro é Null, usando IsFieldNull.

Consulte também

Conceitos

Conjunto de registros (ODBC)

Recordset: Adicionando, atualizando e excluindo registros (ODBC)

Recordset: Como conjuntos de registros selecionar registros (ODBC)