Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 explica o código que o MFC Application Wizard e Add Class (conforme descrito em Adicionando um consumidor ODBC MFC) gravam para oferecer suporte a RFX e como você pode querer alterar esse código.
Observação
Este tópico aplica-se a classes derivadas de CRecordset nas quais a busca em massa de linhas não foi implementada. Se estiver a usar a obtenção de linhas em massa, a troca de campos de registo em massa (Bulk RFX) será implementada. O "Bulk RFX" é semelhante ao "RFX". Para entender as diferenças, consulte Recordset: Obtenção de Registos em Lote (ODBC).
Quando você cria uma classe de conjunto de registros com o MFC Application Wizard ou Add Class, o assistente grava os seguintes elementos relacionados à RFX para você, com base nas opções de fonte de dados, tabela e coluna feitas no assistente:
Declarações dos membros de dados do campo do conjunto de registros na classe do conjunto de registros
Uma substituição de
CRecordset::DoFieldExchangeInicialização de membros de dados de campo de conjunto de registros no construtor de classe de conjunto de registros
Declarações de Membros de Dados de Campo
Os assistentes de configuração gravam a declaração da classe recordset num ficheiro .h similar à seguinte 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 adicionar membros de dados de parâmetro ou novos membros de dados de campo que você vincula, adicione-os após os membros gerados pelo assistente.
Além disso, observe que o assistente substitui a DoFieldExchange função de membro da classe CRecordset.
Substituição do DoFieldExchange
DoFieldExchange é o coração da RFX. A estrutura chama DoFieldExchange sempre que precisa mover dados da fonte de dados para o conjunto de registros ou do conjunto de registros para a fonte de dados.
DoFieldExchange também suporta a obtenção de informações sobre campos de dados através das funções de membro IsFieldDirty e IsFieldNull.
A seguinte substituição DoFieldExchange é para a classe CSections. O assistente grava 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 as seguintes características principais da função:
Esta seção da função é chamada de mapa de campo.
Uma chamada para
CFieldExchange::SetFieldType, através do ponteiropFX. Esta chamada especifica que todas as chamadas de função RFX, até ao final deDoFieldExchangeou à próxima chamada deSetFieldType, são colunas de saída. Para obter mais informações, consulte CFieldExchange::SetFieldType.Várias chamadas para a função global
RFX_Text— uma para cada membro de dados do campo (todas as quais são variáveisCStringno 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 transferência de dados real. A biblioteca de classes fornece funções RFX para todos os tipos de dados comuns. Para obter mais informações sobre funções RFX, consulte Record Field Exchange: Using the RFX Functions.Observação
A ordem das colunas no conjunto de resultados deve corresponder à ordem das chamadas de função RFX no
DoFieldExchange.O
pFXponteiro para um objeto CFieldExchange que o framework passa quando chamaDoFieldExchange. OCFieldExchangeobjeto especifica a operação aDoFieldExchangeser executada, a direção da transferência e outras informações de contexto.
Recordset Construtor
O construtor do conjunto de registros que os assistentes gravam contém duas coisas relacionadas à 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 campos de dados.
O construtor para o CSections exemplo de conjunto de registros tem esta aparência:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Observação
Se adicionar qualquer membro de dados de campo manualmente, tal como faria se vincular novas colunas dinamicamente, deverá incrementar m_nFields. Faça isso anexando outra linha de código, como:
m_nFields += 3;
Este é o código para adicionar três novos campos. Se adicionar quaisquer 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.