Partilhar via


Conjunto de registros: Declarando uma classe para uma consulta predefinida (ODBC)

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 um consumidor manualmente.

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

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

Observação

Este tópico aplica-se a objetos derivados de CRecordset nos quais a busca de linhas em massa não foi implementada. Se a busca de linha em massa for implementada, o processo será muito semelhante. Para entender as diferenças entre os conjuntos de registos que implementam a obtenção de linhas em massa e aqueles que não, consulte Recordset: Fetching Records in Bulk (ODBC).

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

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

Sugestão

Você não precisa de um conjunto de registros para chamar uma consulta predefinida que não retorna registros. Prepare a instrução SQL conforme descrito abaixo, mas execute-a chamando a CDatabase função de membro ExecuteSQL.

Você pode criar uma única classe de conjunto de registros para gerenciar a chamada de uma consulta predefinida, mas você mesmo deve fazer parte do trabalho. Os assistentes não suportam a criação de uma classe especificamente para essa finalidade.

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

  1. Use o MFC ODBC Consumer Wizard de Add Class para criar uma classe de conjunto de registros para a tabela que contribui com a maioria das colunas retornadas pela consulta. Isto dá-lhe uma vantagem inicial.

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

    Por exemplo, se a consulta retornar três colunas cada de duas tabelas adicionais, adicione seis membros de dados de campo (dos tipos de dados apropriados) à classe.

  3. Adicione manualmente chamadas de função RFX na função membro DoFieldExchange da classe, uma para cada membro de dados de campo adicionado, correspondente ao tipo de dados.

    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ção

    Você deve saber os tipos de dados e a ordem das colunas retornadas no conjunto de resultados. A ordem das chamadas de função RFX em DoFieldExchange deve corresponder à ordem das colunas do conjunto de resultados.

  4. Adicione manualmente inicializações para os novos membros de dados de campo no construtor da classe recordset.

    Você também deve incrementar o valor de inicialização do membro de dados m_nFields. O assistente grava a inicialização, mas cobre apenas os membros de dados de campo que 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 aceitar parâmetros, adicione um membro de dados de parâmetro para cada parâmetro, crie uma chamada de função RFX para cada um e faça uma inicialização para cada um.

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

  7. Escreva manualmente uma cadeia de caracteres de instrução SQL com o seguinte formulário:

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

    onde CALL é uma palavra-chave ODBC, proc-name é o nome da consulta como ela é conhecida na fonte de dados e os itens "?" são espaços reservados para os valores de parâmetro fornecidos ao 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. No código que abre o conjunto de registros, defina os valores dos membros de dados de parâmetro do conjunto de registros e, em seguida, chame a Open função membro, passando sua cadeia de caracteres SQL para o parâmetro lpszSQL . Ou, em vez disso, substitua a cadeia de caracteres retornada pela função de membro GetDefaultSQL na sua classe.

Os exemplos a seguir mostram o procedimento para chamar uma consulta predefinida, chamada Delinquent_Accts, que usa um parâmetro para um número de distrito de vendas. Esta consulta retorna três colunas: Acct_No, L_Name, Phone. Todas as colunas são da tabela Clientes.

O conjunto de registo seguinte especifica os campos de dados para as colunas que a consulta retorna e um parâmetro para o número do distrito de vendas solicitado durante a 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 a escreve, exceto para o m_lDistParam membro adicionado manualmente. Outros membros não são mostrados aqui.

O próximo exemplo apresenta as inicializações dos membros de dados no construtor CDelinquents.

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; você inicializa 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 a vinculação do parâmetro que você passa em tempo de execução. O parâmetro é inserido na coluna (número do Dist_No distrito).

O próximo exemplo mostra como configurar a cadeia de caracteres SQL e como usá-la 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 ...

Este código constrói um instantâneo, transmite-lhe um parâmetro obtido anteriormente pelo utilizador 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, o sobrenome do cliente e o número de telefone do cliente.

Sugestão

Talvez você 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.

Ver também

Conjunto de registros (ODBC)
Conjunto de registros: Consultando novamente um conjunto de registros (ODBC)
Conjunto de registros: Declarando uma classe para uma tabela (ODBC)
Conjunto de registros: Executando uma junção (ODBC)