Esta anotação descreve a arquitetura de troca (RFX) de campo de registro. Ele também descreve como escrever um procedimento de RFX _.
Visão geral do Exchange de campo do registro
Todas as funções de campo de conjunto de registros são feitas com código C++. Não há recursos especiais ou macros mágicas. O coração do mecanismo é uma função virtual que deve ser substituída em cada classe derivada de conjunto de registros. É sempre encontrado neste formulário:
privatevoid CMySet::DoFieldExchange (CFieldExchange pFX)
{
//{{AFX_FIELD_MAP(CMySet)
lt; chamada de tipo de campo do conjunto de registros troca >
< chamada de função de troca de conjunto de registros >
//}}AFX_FIELD_MAP
}
Comentários AFX Formatarar especial permitem ClassWizard localizar e editar o código dentro desta função. Código que não é compatível com ClassWizard deve ser colocado fora dos comentários Formatarar especial.
No exemplo acima, lt; recordset_exchange_field_type_call > é sob a forma:
pFX->SetFieldType(CFieldExchange::outputColumn)
e o lt; recordset_exchange_function_call > é sob a forma:
RFX_Custom (pFX, "Col2", m_Col2)
A maioria das funções RFX _ tem três argumentos como mostrado acima, mas alguns (por exemplo, RFX_Text e RFX_Binary) têm argumentos opcionais adicionais.
Mais do que um RFX _ podem ser incluídos em cada função DoDataExchange.
Consulte 'afxdb. h' para obter uma lista de Tudo as conjunto de registros campo troca rotinas fornecidas com MFC.
Recordset campo chamadas são uma maneira de registrar locais da memória (geralmente Membros de dados) para armazenar dados de campo para um CMySet classe.
Notas
Funções de campo de conjunto de registros foram projetadas para funcionar somente com as classes de CRecordset . Eles não são geralmente usados por outras classes do MFC.
Valores iniciais de dados são definidos no Construtor de C++ padrão, normalmente em um Bloquear com //{{AFX_FIELD_INIT(CMylSet) e //}}AFX_FIELD_INIT comentários.
Cada função RFX _ deve oferecer suporte a várias operações, variando de retornar o status incorreto do campo para o campo na preparação para o campo de edição de arquivamento.
Cada função que chama DoFieldExchange (por exemplo SetFieldNull, IsFieldDirty), faz seu próprio inicialização ao redor a chamada DoFieldExchange.
Como funciona?
Você não precisa entender o seguinte para usar a troca de campo de registro. No entanto, compreender como isso funciona nos bastidores ajudará você a escrever seu próprio procedimento de intercâmbio de.
A função de membro DoFieldExchange é muito parecido com a função de membro Serialize - é responsável para obter ou configuração dados para/de/para dados de membro na classe de um formulário externo (no presente caso colunas no resultado de uma consulta ODBC). O parâmetro pFX é o contexto para fazer a troca de dados e é semelhante ao parâmetro CArchive a CObject:: Serialize. PFX (um objeto CFieldExchange ) tem um indicador de operação, que é semelhante, mas uma generalização da direção do CArchive sinaliza. Uma função RFX pode ter que suportam as seguintes operações
Extensões de usuário
Existem várias maneiras de estender o mecanismo RFX padrão. É possível
CBookmark
privatevoid AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *sz&Name,
nbsp; BIGINT e valor)
enquanto (posExtraFields! = &NULL)
{
nbsp; RFX_Text (pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues));
}
&Notanbsp; Esse código não pode ser editado por ClassWizard e deve ser usado somente fora dos comentários Formatarar especial.
Escrever um Personalizar RFX
Para escrever sua própria função RFX Personalizar, recomenda-se que você copiar uma função RFX existente e modificá-lo para suas próprias finalidades. Selecionar o RFX direito para copiar pode tornar seu trabalho mais fácil. Algumas funções RFX têm algumas propriedades únicas que você deve levar em conta ao decidir qual copiar.
RFX_Long e RFX_Int:
Estas são as funções RFX mais simples. O valor de dados não precisa qualquer interpretação especial, e o tamanho dos dados é fixo.
RFX_Single e RFX_Double:
Como RFX_Long e RFX_Int acima, essas funções são simples e podem fazer uso da implementação padrão amplamente. Eles são armazenados em dbflt.cpp em vez de dbrfx.cpp, no entanto, para habilitar Carregando the runtime flutuante ponto biblioteca somente quando eles são explicitamente referência.
RFX_Text e RFX_Binary:
Est&as duas funções pré-alocar um buffer estático para armazenar informações de seqüência de caracteres/binário e deve registrar esses buffers com ODBC SQLBindCol em vez de registrar amp; valor. Por isso, estas duas funções necessário muita código maiúscminúsc especial.
RFX_Date:
ODBC retorna informações de data e hora na sua própria estrutura de dados TIMESTAMP_STRUCT. Essa função aloca dinamicamente um TIMESTAMP_STRUCT como um "proxy" para enviar e receber dados de hora de data. Várias operações devem transferir as informações de data e hora entre o objeto C++ CTime e o proxy TIMESTAMP_STRUCT. Obviamente, isso complica esta função consideravelmente, mas é um bom exemplo de como usar um proxy para transferência de dados.
RFX_LongBinary:
Esta é a biblioteca de classe única função RFX que não usa ligação de coluna para receber e enviar dados. Essa função ignora a operação de BindFieldToColumn em vez disso, durante a operação de Fixup, aloca armazenamento para armazenar os dados SQL_LONGVARCHAR ou SQL_LONGVARBINARY entrados e realiza uma chamada SQLGetData para recuperar o valor para o armazenamento alocado. Ao preparar-se para enviar valores de dados para o Origem de dados (ou seja, operações NameValue e valor), esta função usa DATA_AT_EXEC funcionalidade do ODBC. Consulte técnico Anotação 45 para obter mais informações sobre como trabalhar com SQL_LONGVARBINARY e SQL_LONGVARCHARs.
Ao escrever sua própria função RFX _ , muitas vezes será capaz de usar CFieldExchange:: padrão para implementar uma determinada operação. Olhe para a implementação do padrão para a operação em questão. Se ele executa a operação que você iria escrever em sua função de RFX _ você pode delegar para o CFieldExchange:: padrão. Você pode ver exemplos de chamar CFieldExchange:: padrão em dbrfx.cpp
É importante chamar IsFieldType no início da sua função RFX e retornar imediatamente se retornará falso. Este mecanismo mantém operações de parâmetro de sendo executada em outputColumnse vice-versa (como chamar BindParam em um outputColumn). Além disso, IsFieldType automaticamente mantém controle sobre a contar de outputColumns (m_nFields) e params (m_nParams).
Técnico anotações por número |nbsp; &Notas técnicas por categoria