Compartilhar via


TN043: rotinas RFX

Dica

A nota técnica a seguir não foi atualizada desde que ela foi incluída pela primeira vez na documentação online.Como resultado, alguns procedimentos e tópicos podem estar incorretos ou expirados.Para obter as informações mais recentes, é recomendável que você procure o tópico de interesse no índice de documentação online.

Essa observação descreve a arquitetura de troca do campo de registro (RFX). Também descreve como você escrever um procedimento de RFX_ .

Visão geral do Exchange campo de registro

Todas as funções de campo do conjunto de registros são feitas com código C++. Não há nenhum recurso especial ou macro mágico. O centro do mecanismo é uma função virtual que deve ser substituída em cada classe derivada do conjunto de registros. Sempre é encontrado neste formato:

void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  <recordset exchange field type call>
  <recordset exchange function call>
  //}}AFX_FIELD_MAP
}

Os comentários especiais de AFX de formato permitem que ClassWizard localize e editar o código dentro dessa função. Código que não é compatível com ClassWizard deve ser colocado fora observações especiais de formato.

No exemplo anterior, <o recordset_exchange_field_type_call> está no formato:

pFX->SetFieldType(CFieldExchange::outputColumn);

e <o recordset_exchange_function_call> está no formato:

RFX_Custom(pFX, "Col2", m_Col2);

A maioria das funções de RFX_ têm três argumentos como mostrado acima, mas algumas (por exemplo. RFX_Text e RFX_Binary) têm argumentos opcionais adicionais.

Mais de um RFX_ pode ser incluído em cada função de DoDataExchange .

Consulte “afxdb.h” para uma lista de todas as rotinas de troca de campo do conjunto de registros MFC fornecidas com o.

As chamadas de campo do conjunto de registros são uma forma de registrar locais de memória (normalmente membros de dados) para armazenar dados do campo para uma classe de CMySet .

Notas

As funções de campo do conjunto de registros são criadas para trabalhar somente com as classes de CRecordset . Não são geralmente úteis por outras classes de MFC.

Os valores de dados iniciais são definidos no construtor padrão do C++, geralmente em um bloco com //{{AFX_FIELD_INIT(CMylSet) e comentários de //}}AFX_FIELD_INIT .

Cada função de RFX_ deve oferecer suporte às várias operações, variando de retornar o status de write-back de campo para arquivar o campo na preparação de edite o campo.

Cada função que chama DoFieldExchange (por exemplo SetFieldNull, IsFieldDirty), faz a sua própria inicialização ao redor da chamada para DoFieldExchange.

Como funciona?

Você não precisa entender o seguinte para usar a troca de campo do registro. No entanto, compreender como esta funciona nos bastidores o ajudará a gravar seu próprio procedimento de troca.

A função de membro de DoFieldExchange é bem como a função de membro de Serialize — é responsável para obter ou definir dados para um formulário/desde externa (nesse caso colunas de resultados de uma consulta de ODBC) desde/até dados de membros na classe. O parâmetro de pFX é o contexto para fazer troca de dados e é semelhante ao parâmetro de CArchive a CObject::Serialize. pFX (um objeto de CFieldExchange ) tem um indicador da operação, que é semelhante, mas uma generalização do sinalizador de direção de CArchive . Uma função de RFX pode precisar dar suporte às seguintes operações:

  • BindParam — indica onde ODBC deve recuperar dados do parâmetro

  • BindFieldToColumn — indica onde ODBC deve recuperar dados/outputColumn do warehouse

  • Fixup — comprimentos de conjunto de CString/CByteArray NULL, bits de status do conjunto

  • MarkForAddNew — marca suja se o valor foi alterado desde a chamada de AddNew

  • MarkForUpdate — marca suja se o valor alterado desde chamada de edição

  • Nome — Anexar nomes de campo para campos marcado como sujo

  • NameValue — anexar o “<name= coluna>?” para marcado como sujo campos

  • Valor — Acrescentar “?” seguido pelo divisor, como “,” ou ''

  • SetFieldDirty — o status de bit (isto é alterado o campo suja)

  • SetFieldNull — o status de bit da indicação do valor nulo para o campo

  • IsFieldDirty — valor de retorno de bit alteração de status

  • IsFieldNull — valor de retorno de bits de status nulo

  • IsFieldNullable de retorno RETIFIQUE se o campo pode manter valores NULOS

  • StoreField — valor do campo do arquivo morto

  • LoadField — valor do campo arquivado Reload

  • GetFieldInfoValue informações gerais de retorno em um campo

  • GetFieldInfoOrdinal informações gerais de retorno em um campo

Extensões de usuário

Há várias maneiras de estender o mecanismo de RFX opção. Você pode

  • Adicionar novos tipos de dados. Por exemplo:

    CBookmark
    
  • Adicionar novos procedimentos de troca (RFX_???).

    void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
        BIGINT& value);
    
  • Faça com que a função de membro de DoFieldExchange condicional inclui chamadas adicionais de RFX ou todas as outras instruções válidas C++.

    while (posExtraFields != NULL)
    {
        RFX_Text(pFX, m_listName.GetNext(posExtraFields), 
            m_listValue.GetNext(posExtraValues));
    }
    

Dica

Esse código não pode ser editado por ClassWizard e só deve ser usado fora dos comentários especiais de formato.

Escrevendo um conjunto personalizado RFX

Para escrever sua própria função personalizadas RFX, sugere-se que você copie uma função existente de RFX e a modificar a suas próprias finalidades. Selecione o RFX direito para copiar pode fazer seus trabalhos muito. As funções de qualquer RFX têm algumas propriedades exclusivas que você deve levar em conta ao decidir qual copiar.

  • RFX_Long and RFX_Int:
    Essas são as funções mais simples de RFX. O valor de dados não precisa nenhuma interpretação especial, e o tamanho dos dados é fixo.

  • RFX_Single and RFX_Double:
    Como RFX_Long e RFX_Int acima, essas funções são simples e podem utilizar a implementação padrão extensivamente. São armazenados em dbflt.cpp em vez de dbrfx.cpp, porém, para habilitar carregar a biblioteca de ponto flutuante de tempo de execução somente quando eles forem explicitamente referência.

  • RFX_Text and RFX_Binary:
    Essas duas funções pré-aloca um buffer estático para manter a cadeia de caracteres/informações binárias, e devem registrar esses buffers com ODBC SQLBindCol em vez de &registrar o valor. Devido a isso, essas duas funções têm lotes de código maiúsculas de minúsculas.

  • RFX_Date:
    Retorna a data de ODBC e informações de tempo em sua própria estrutura de dados de TIMESTAMP_STRUCT. Esta função atribui dinamicamente um TIMESTAMP_STRUCT como um “proxy” para enviar e receber dados de data e hora. As várias operações devem transferir informações de data e hora entre o objeto de CTime C++ e o proxy de TIMESTAMP_STRUCT. Isso complica essa função consideravelmente, mas é um exemplo de como usar um proxy para a transferência de dados.

  • RFX_LongBinary:
    Essa é a única função de biblioteca RFX da classe que não usa a associação de coluna para enviar e receber dados. Esta função ignora a operação de BindFieldToColumn e por outro lado, durante a operação de Fixup, aloca armazenamento para manter os dados de entrada de SQL_LONGVARCHAR ou de SQL_LONGVARBINARY, então executa uma chamada de SQLGetData para recuperar o valor no armazenamento alocado. Ao preparar para enviar valores de dados de volta para a fonte de dados (como NameValue e avaliar operações), essa função usa a funcionalidade de DATA_AT_EXEC ODBC. Consulte Observação 45 técnica para obter mais informações sobre como trabalhar com SQL_LONGVARBINARY e SQL_LONGVARCHARs.

Ao escrever sua própria função de RFX_ , você poderá usar CFieldExchange::Default frequentemente para implementar uma determinada operação. Examine a implementação da opção da operação em questão. Se estiver executando a operação seria gravar na função de RFX_ você pode delegar a CFieldExchange::Default. Você pode consultar exemplos de chamar CFieldExchange::Default em dbrfx.cpp

É importante chamar IsFieldType no início da função de RFX, e retorna imediatamente se retornará FALSE. Esse mecanismo mantém operações de parâmetro de ser executado em outputColumns, e vice-versa (como chamar BindParam em outputColumn). Além disso, IsFieldType mantém acompanha automaticamente de contagem de outputColumns (m_nFields) e param dem_nParams().

Consulte também

Outros recursos

Observações técnicas por número

Observações técnicas por categoria