Partilhar via


Troca de campo de registro: Trabalhando com o código do assistente

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::DoFieldExchange

  • Inicializaçã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 ponteiro pFX. Esta chamada especifica que todas as chamadas de função RFX, até ao final de DoFieldExchange ou à próxima chamada de SetFieldType, 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áveis CString 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 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 pFX ponteiro para um objeto CFieldExchange que o framework passa quando chama DoFieldExchange. O CFieldExchange objeto especifica a operação a DoFieldExchange ser 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.

Ver também

Troca de campos de registro (RFX)