Partilhar via


Recordset: Declarando uma classe para uma consulta predefinida (ODBC)

Este tópico se aplica a classes MFC ODBC.

Este tópico explica como criar uma classe de conjunto de registros para uma consulta predefinida (às vezes chamada de um procedimento armazenado, como em Microsoft SQL Server).

ObservaçãoObservação

Este tópico se aplica aos objetos derivados de CRecordset em qual linha em massa buscando não foi implementada.Se em massa linha buscando for implementado, o processo é muito semelhante.Para entender as diferenças entre conjuntos de registros que implementam em massa linha buscando e aqueles que não, consulte Recordset: buscar registros em massa (ODBC).

Alguns sistemas de gerenciamento de banco de dados (DBMSs) permitem que você crie uma consulta predefinida e chamá-lo de seus programas como uma função.A consulta tem um nome, pode levar parâmetros e pode retornar registros.O procedimento neste tópico descreve como chamar uma consulta predefinida que retorna registros (e talvez usa parâmetros).

As classes de banco de dados não oferecem suporte Atualizando consultas predefinidas.A diferença entre uma consulta predefinida instantâneo e uma consulta predefinida dynaset não é atualizabilidade mas se as alterações feitas por outros usuários (ou outros conjuntos de registros em seu programa) estão visíveis no seu conjunto de registros.

DicaDica

Não é necessário um conjunto de registros para chamar uma consulta predefinida que não retorna registros.Preparar a declaração de SQL, conforme descrito abaixo, mas executá-lo chamando o CDatabase função de membro ExecuteSQL.

Você pode criar uma classe de conjunto de registros simples gerenciar chamar uma consulta predefinida, mas você deve fazer parte do trabalho.Os assistentes não oferecem suporte a criação de uma classe especificamente para essa finalidade.

Para criar uma classe para chamar uma consulta predefinida (procedimento armazenado)

  1. Use o Assistente de consumidor ODBC MFC de Add Class para criar uma classe de conjunto de registros para a tabela que contribui com mais colunas retornadas pela consulta.Isso lhe dá um início de cabeça.

  2. Adicione manualmente os membros de dados de campo para as colunas das tabelas que a consulta retorna, mas que o assistente não criou para você.

    Por exemplo, se a consulta retorna três colunas de duas tabelas adicionais, adicione membros de dados campo seis (dos tipos de dados apropriado) para a classe.

  3. Adicionar manualmente RFX função chama o DoFieldExchange adicionado de função de membro de classe, uma correspondente ao tipo de dados de cada membro de dados de campo.

    Immediately before these RFX calls, call <MSHelp:link keywords="_mfc_CFieldExchange.3a3a.SetFieldType" TABINDEX="0">SetFieldType</MSHelp:link>, as shown here: 
    pFX->SetFieldType( CFieldExchange::outputColumn );
    
    ObservaçãoObservação

    Você deve conhecer os tipos de dados e a ordem das colunas retornada no resultado definido.A ordem da função RFX chama em DoFieldExchange deve corresponder a ordem das colunas do conjunto de resultados.

  4. Manualmente adicione inicializações para novos membros de dados de campo no construtor da classe de conjunto de registros.

    Você também deve incrementar o valor de inicialização para o m_nFields membro de dados.O assistente grava a inicialização, mas abrange somente os membros de dados de campo adiciona para você.Por exemplo:

    m_nFields += 6;
    

    Alguns tipos de dados não devem ser inicializados aqui, por exemplo, CLongBinary ou matrizes de bytes.

  5. Se a consulta usa parâmetros, adicione um membro de dados para cada parâmetro, uma chamada de função RFX para cada e uma inicialização para cada parâmetro.

  6. Você deve incrementar m_nParams para cada adicionado parâmetro, como fez m_nFields para adicionar campos na etapa 4 deste procedimento.Para obter mais informações, consulte Recordset: parametrização um conjunto de registros (ODBC).

  7. Grave manualmente uma seqüência de caracteres de declaração de SQL da seguinte forma:

    {CALL proc-name [(? [, ?]...)]}
    

    onde chamada é uma palavra-chave do ODBC, nome de proc é o nome da consulta como é conhecido na fonte de dados e o "?" itens são espaços reservados para os valores de parâmetro que você fornecer para o conjunto de registros em tempo de execução (se houver).O exemplo a seguir prepara um espaço reservado para um parâmetro:

    CString mySQL = "{CALL Delinquent_Accts (?)}";
    
  8. O código que abre o conjunto de registros, defina os valores de parâmetro do conjunto de registros membros de dados e chamar o Abrir função de membro, passando a seqüência de caracteres SQL o lpszSQL parâmetro.Ou em vez disso, substituir a seqüência retornada pela GetDefaultSQL função de membro em sua classe.

Os exemplos a seguir mostram o procedimento para chamar uma consulta predefinida, denominada Delinquent_Accts, que leva um parâmetro para um número do Distrito de vendas.Esta consulta retorna três colunas: Acct_No, L_Name, Phone.São todas as colunas da tabela clientes.

O conjunto de registros seguintes Especifica membros de dados de campo para as colunas que a consulta retorna e um parâmetro para as vendas district número solicitado em tempo de execução.

class CDelinquents : public CRecordset
{
// Field/Param Data
    LONG m_lAcct_No;
    CString m_strL_Name;
    CString m_strPhone;
    LONG m_lDistParam;
    // ...
};

Esta declaração de classe é como o assistente escreve, exceto para o m_lDistParam membro adicionado manualmente.Outros membros não são mostrados aqui.

O próximo exemplo mostra inicializações para membros de dados de CDelinquents construtor.

CDelinquents::CDelinquents(CDatabase* pdb)
   : CRecordset(pdb)
{
    // Wizard-generated params:
    m_lAcct_No = 0;
    m_strL_Name = "";
    m_strPhone = "";
    m_nFields = 3;
    // User-defined params:
    m_nParams = 1;
    m_lDistParam = 0;
}

Observe as inicializações para m_nFields e m_nParams.O assistente inicializa m_nFields; inicializar m_nParams.

O próximo exemplo mostra as funções RFX em CDelinquents::DoFieldExchange:

void CDelinquents::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Long(pFX, "Acct_No", m_lAcct_No);
    RFX_Text(pFX, "L_Name", m_strL_Name);
    RFX_Text(pFX, "Phone", m_strPhone);
    pFX->SetFieldType(CFieldExchange::param);
    RFX_Long(pFX, "Dist_No", m_lDistParam);
}

Além de fazer as chamadas RFX para as três colunas retornadas, esse código gerencia ligação o parâmetro que passar em tempo de execução.O parâmetro é codificado para o Dist_No coluna (número do Distrito).

O próximo exemplo mostra como definir a seqüência de caracteres SQL e como usá-lo para abrir o conjunto de registros.

// Construct a CDelinquents recordset object
CDelinquents rsDel( NULL );
CString strSQL = "{CALL Delinquent_Accts (?)}"
// Specify a parameter value (obtained earlier from the user)
rsDel.m_lDistParam = lDistrict;
// Open the recordset and run the query
if( rsDel.Open( CRecordset::snapshot, strSQL ) )
    // Use the recordset ...

Esse código constrói um instantâneo, passa um parâmetro obtido anteriormente do usuário e chama a consulta predefinida.Quando a consulta é executada, ela retorna registros para o Distrito de vendas especificado.Cada registro contém colunas para o número da conta, sobrenome do cliente e número de telefone do cliente.

DicaDica

Você talvez queira manipular um valor de retorno (parâmetro de saída) de um procedimento armazenado.Para obter mais informações e um exemplo, consulte CFieldExchange::SetFieldType.

Consulte também

Conceitos

Conjunto de registros (ODBC)

Recordset: Repetir consulta um conjunto de registros (ODBC)

Recordset: Declarando uma classe para uma tabela (ODBC)

Recordset: Executar uma junção (ODBC)