Registrar troca de campos: trabalhando com o código do assistente
Observação
O Assistente de consumidor ODBC do MFC não está disponível no Visual Studio 2019 e posterior. É possível criar um consumidor manualmente.
Este tópico explica o código que o Assistente de aplicativo MFC e Adicionar Classe (conforme descrito em Como adicionar um consumidor ODBC do MFC) escrevem para dar suporte à RFX e como você pode alterar esse código.
Observação
Este tópico aplica-se a classes derivadas de CRecordset
nas quais o fetch de linha em massa não foi implementado. Se você estiver usando o fetch de linha em massa, a RFX (troca de campos de registro) em massa será implementada. A RFX em massa é semelhante à RFX. Para entender as diferenças, confira Conjunto de registros: efetuar fetch de registros em massa (ODBC).
Quando você cria uma classe de conjunto de registros com o Assistente de Aplicativo MFC ou Adicionar Classe, o assistente escreve os seguintes elementos relacionados a RFX para você, com base nas opções de fonte de dados, de tabela e de coluna que você faz no assistente:
Declarações dos membros de dados do campo do conjunto de registros na classe de conjunto de registros
Uma substituição de
CRecordset::DoFieldExchange
Inicialização de membros de dados do conjunto de registros no construtor de classe do conjunto de registros
Declarações de membro de dados de campo
Os assistentes escrevem uma declaração de classe do conjunto de registros em um arquivo .h com a seguinte aparência para a classe CSections
:
class CSections : public CRecordset
{
public:
CSections(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CSections)
// Field/Param Data
CString m_strCourseID;
CString m_strInstructorID;
CString m_strRoomNo;
CString m_strSchedule;
CString m_strSectionNo;
// Overrides
// Wizard generated virtual function overrides
protected:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
Se você adicionar membros de dados de parâmetro ou novos membros de dados de campo que você mesmo associou, adicione-os após aqueles gerados pelo assistente.
Além disso, observe que o assistente substitui a função de membro DoFieldExchange
da classe CRecordset
.
Substituição DoFieldExchange
DoFieldExchange é o coração da RFX. A estrutura chamará DoFieldExchange
sempre que ele precisar mover dados da fonte de dados para o conjunto de registros ou do conjunto de registros para a fonte de dados. DoFieldExchange
também é compatível com a obtenção de informações sobre membros de dados de campo por meio das funções de membro IsFieldDirty e IsFieldNull.
A seguinte substituição DoFieldExchange
é para a classe CSections
. O assistente escreve a função no arquivo .cpp para sua classe de conjunto de registros.
void CSections::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "CourseID", m_strCourseID);
RFX_Text(pFX, "InstructorID", m_strInstructorID);
RFX_Text(pFX, "RoomNo", m_strRoomNo);
RFX_Text(pFX, "Schedule", m_strSchedule);
RFX_Text(pFX, "SectionNo", m_strSectionNo);
}
Observe os seguintes recursos principais da função:
Esta seção da função é chamada de mapa de campos.
Uma chamada a
CFieldExchange::SetFieldType
, por meio do ponteiropFX
. Essa chamada especifica que todas as chamadas de função RFX até o final deDoFieldExchange
ou da próxima chamada aSetFieldType
são colunas de saída. Para saber mais, confira CFieldExchange::SetFieldType.Várias chamadas de função global
RFX_Text
— uma por membro de dados de campo (das quais, todas são variáveisCString
no exemplo). Essas chamadas especificam a relação entre um nome de coluna na fonte de dados e um membro de dados de campo. As funções RFX fazem a verdadeira transferência de dados. A biblioteca de classes fornece funções RFX para todos os tipos de dados comuns. Para saber mais sobre as funções RFX, confira Funções de troca de campo de registro: Usando as funções RFX.Observação
A ordem das colunas em seu conjunto de resultados deve corresponder à ordem das chamadas de função RFX em
DoFieldExchange
.O ponteiro
pFX
para um objeto CFieldExchange que a estrutura passa quando ela chamaDoFieldExchange
. O objetoCFieldExchange
especifica a operação queDoFieldExchange
deve executar, a direção da transferência e outras informações de contexto.
Construtor de conjunto de registros
O construtor do conjunto de registros que o assistente escreve contém duas coisas relacionadas a RFX:
uma inicialização para cada membro de dados de campo
uma inicialização para o membro de dados m_nFields, que contém o número de membros de dados de campo
O construtor do exemplo do conjunto de registros CSections
tem a seguinte aparência:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Observação
Se você adicionar membros de dados de campo manualmente, como você poderá fazer se associar novas colunas dinamicamente, será necessário incrementar m_nFields
. Faça isso acrescentando outra linha de código, como:
m_nFields += 3;
Este é o código para adicionar três novos campos. Se você adicionar membros de dados de parâmetro, deverá inicializar o membro de dados m_nParams, que contém o número de membros de dados de parâmetro. Coloque a inicialização m_nParams
fora dos colchetes.