O conjunto de registros: Declarar uma classe para uma consulta predefinida (ODBC)
Este tópico se aplica às 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 no de Microsoft SQL Server).
Observação |
---|
Este tópico se aplica aos objetos derivados de CRecordset no qual linha em massa buscando não foi implementada. Se a busca de linha em massa é implementada, o processo é muito semelhante. Para entender as diferenças entre os conjuntos de registros que implementam a busca de linha em massa e aqueles que não, consulte Recordset: Buscar registros em massa (ODBC). |
Alguns sistemas de gerenciamento de banco de dados (DBMSs) permitem que você criar uma consulta predefinida e chamá-lo a partir de seus programas, como uma função. A consulta tem um nome, pode levar os 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 à atualização de consultas predefinidas. A diferença entre uma consulta predefinida do instantâneo e uma consulta predefinida de 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.
Dica
Você não precisa chamar uma consulta predefinida que não retorna registros em um conjunto de registros. Preparar a declaração de SQL, conforme descrito abaixo, mas executá-lo chamando o CDatabase a função de membro ExecuteSQL.
Você pode criar uma classe de conjunto de registros único para gerenciar a chamar uma consulta predefinida, mas você 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)
Use o Assistente de consumidor ODBC MFC de Add Class para criar uma classe de conjunto de registros da tabela que contribui com o máximo de colunas retornadas pela consulta. Isso lhe dá um início de cabeça.
Adicione manualmente os membros de dados de campo para todas as colunas das tabelas que a consulta retorna, mas que não criaram o Assistente para você.
Por exemplo, se a consulta retorna três colunas de duas tabelas adicionais, adicione seis membros de dados de campo (de tipos de dados apropriados) para a classe.
Adicionar manualmente RFX função chama o DoFieldExchange adicionado de função de membro da classe, um correspondente ao tipo de dados de cada membro de dados do 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ção Você deve conhecer os tipos de dados e a ordem de colunas retornada no resultado definido. A ordem da função RFX de chamadas em DoFieldExchange deve corresponder a ordem das colunas do conjunto de resultados.
Adicione manualmente inicializações para novos membros de dados de campo no construtor da classe do conjunto de registros.
Você também deve incrementar o valor de inicialização para o m_nFields o membro de dados. O assistente grava a inicialização, mas abrange somente os membros de dados de campo para que você adiciona. For example:
m_nFields += 6;
Alguns tipos de dados não devem ser inicializados aqui, por exemplo, CLongBinary ou matrizes de byte.
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.
Você deve incrementar m_nParams para cada parâmetro adicional, como você fez m_nFields para os campos adicionados na etapa 4 deste procedimento. Para obter mais informações, consulte Recordset: Parametrização de um conjunto de registros (ODBC).
Escreva 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 "?" os 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 (?)}";
No código que abre o conjunto de registros, defina os valores de parâmetro do recordset membros de dados e chame o Abrir função de membro, passando a seqüência de caracteres de SQL para o lpszSQL parâmetro. Ou em vez disso, substitua a seqüência de caracteres retornada pela GetDefaultSQL a função de membro em sua turma.
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. Todas as colunas são da tabela Customers.
O conjunto de registros a seguir especifica os membros de dados de campo para as colunas de parâmetros para as vendas e os retornos de query 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;
// ...
};
A declaração de classe é como o assistente grava, exceto o m_lDistParam membro adicionado manualmente. Outros membros não são mostrados aqui.
O próximo exemplo mostra as inicializações de membros de dados na 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 de m_nFields e m_nParams. O assistente inicializa m_nFields; Você pode 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 a vinculação do parâmetro que você passar o tempo de execução. O parâmetro é codificado para o Dist_No (número do Distrito) de coluna.
O próximo exemplo mostra como configurar 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, o sobrenome do cliente e o número de telefone do cliente.
Dica
Talvez você queira tratar de 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
O conjunto de registros (ODBC)
O conjunto de registros: Repetindo a consulta de um conjunto de registros (ODBC)
O conjunto de registros: Declarar uma classe para uma tabela (ODBC)