TN043: Rotinas de RFX
Observação: |
---|
A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online. |
Esta nota descreve a arquitetura de troca (RFX) de campo de registro.Ela também descreve como escrever um RFX_ procedimento.
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 existem recursos especiais ou macros mágica.O coração do mecanismo é uma função virtual deve ser substituída em todas as classes derivadas de conjunto de registros.Sempre se encontra neste formulário:
void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CMySet)
<recordset exchange field type call>
<recordset exchange function call>
//}}AFX_FIELD_MAP
}
Os comentários AFX formato especial que ClassWizard localizar e edição o código nessa função.Código que não é compatível com ClassWizard deve ser colocado fora dos comentários formato especial.
No exemplo acima, <recordset_exchange_field_type_call> está no formato:
pFX->SetFieldType(CFieldExchange::outputColumn);
e <recordset_exchange_function_call> no formulário:
RFX_Custom(pFX, "Col2", m_Col2);
A maioria dos RFX_ funções têm três argumentos sistema autônomo mostrado acima, mas alguns (ex.:RFX_Text e RFX_Binary) possuem argumentos opcionais adicionais.
Mais de um RFX_ podem ser incluídos em cada DoDataExchange função.
Consulte afxdb.h para obter uma lista de todos os as conjunto de registros campo troca rotinas fornecido com o MFC.
conjunto de registros campo chamadas são uma maneira de registrar locais da memória (normalmente membros de dados) para armazenar dados de campo para um CMySet classe.
Anotações
Funções de campo de conjunto de registros são projetadas para trabalhar apenas com o CRecordset classes. Eles não são geralmente utilizáveis por quaisquer classes MFC Outros.
Os valores iniciais de dados são conjunto no construtor padrão do C++, geralmente em um bloco com //{{AFX_FIELD_INIT(CMylSet) e //}}AFX_FIELD_INIT comentários.
Cada RFX_ função deve oferecer suporte a várias operações, que variam de retornar o status sujo de 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), oferece sua própria inicialização em torno da telefonar para DoFieldExchange.
Como ele funciona?
Você não precisa compreender o seguinte para usar a troca de campo de registro.No entanto, compreender como isso funciona nos bastidores ajudará você gravar seu próprio procedimento de troca.
The DoFieldExchange função de membro é muito parecido com o Serialize função de membro — ele é responsável por obter ou definir dados para/de/para dados do membro na classe de um formulário externo (nesse caso colunas do resultado de uma consulta ODBC). The pFX parâmetro é o contexto para fazer o intercâmbio de dados e é semelhante a CArchive parâmetro para CObject::Serialize. The pFX (um CFieldExchange objeto) possui uma operação de indicador, que é semelhante ao, mas uma generalização da CArchive sinalizar de direção. Uma função RFX pode ter que oferecer suporte a operações a seguintes:
BindParam — Indicar onde ODBC deve recuperar dados de parâmetro
BindFieldToColumn — Indicar onde ODBC deve recuperar/depósito outputColumn dados
Correção — conjunto CString/CByteArray comprimentos, conjunto status nulo bit
MarkForAddNew — Mark dirty se valor tiver sido alterada desde AddNew telefonar
MarkForUpdate — Mark dirty se valor tiver sido alterada desde o chamar edição
Nome — Acrescentar os nomes dos campos para os campos marcados com problemas
NomeValor — Acrescentar "< nome da coluna > =?" para os campos marcados com problemas
Valor — Acrescentar "?" seguida pelo separador, como ', 'ou' '
SetFieldDirty — conjunto status bit com problemas (ou seja campo alterado)
SetFieldNull — Defina o bit de status indicando o valor nulo para o campo
IsFieldDirty — valor retornado de bit sujo de status
IsFieldNull — Retornar o valor de bit nulo status
IsFieldNullable — Retornar verdadeiro se o campo pode valores nulo Isenção
StoreField — Arquive o valor do campo
LoadField — Recarga arquivados valor do campo
GetFieldInfoValue — Retornam informações Geral em um campo
GetFieldInfoOrdinal — Retornam informações Geral em um campo
Extensões de usuário
Há várias maneiras de estender o mecanismo RFX padrão.Você pode
Adicione novos tipos de dados.Por exemplo:
CBookmark
Adicione novos procedimentos de troca (RFX_???).
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName, BIGINT& value);
Ter o DoFieldExchange função de membro condicionalmente incluem chamadas RFX adicionais ou quaisquer outras declarações C++ válidas.
while (posExtraFields != NULL) { RFX_Text(pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues)); }
Observação: |
---|
Esse código não pode ser editado pelo ClassWizard e deve ser usado somente fora dos comentários formato especial. |
Escrever um personalizado RFX
Para escrever sua própria função RFX personalizado, é recomendável que você copie uma função RFX existente e modificá-lo para seus próprios fins.O direito RFX para copiar a seleção pode tornar seu trabalho muito mais fácil.Algumas funções RFX têm algumas propriedades exclusivas que você deve levar em conta ao decidir qual copiar.
RFX_Long e RFX_Int:
Essas são as funções RFX mais simples.O valor de dados não é necessário qualquer interpretação especial e o dimensionar dos dados é fixo.RFX_Single e RFX_Double:
Como RFX_Long e RFX_Int acima, essas funções são simples e pode fazer com que usam amplamente da implementação do padrão.Eles são armazenados em dbflt.cpp em vez de dbrfx.cpp, no entanto, para permitir que o tempo de execução flutuante ponto biblioteca somente quando elas estiverem explicitamente referência carregando.RFX_Text e RFX_Binary:
Essas duas funções preallocate um buffer para armazenar informações de seqüência de caracteres/binário estático e devem registrar esses buffers ODBC SQLBindCol em vez de registrar & valor.Por isso, essas duas funções necessário grande quantidade de código caso especial.RFX_Date:
ODBC retorna informações de data e time em sua própria estrutura de dados TIMESTAMP_STRUCT.Esta função aloca dinamicamente um TIMESTAMP_STRUCT sistema autônomo "proxy" para enviar e receber dados de time de data.Várias operações devem transferência as informações de data e time entre o C++ CTime objeto e o proxy TIMESTAMP_STRUCT. Isso complica a essa função consideravelmente, mas é um mercadoria exemplo de como usar um proxy para transferência de dados.RFX_LongBinary:
Essa é a biblioteca de classes única função RFX que não usa a ligação de coluna para receber e enviar dados.Esta função ignora a operação BindFieldToColumn e em vez disso, durante a operação de correção, aloca armazenamento para manter dados de entrada SQL_LONGVARCHAR ou SQL_LONGVARBINARY e, em seguida, realiza uma telefonar de SQLGetData recupere o valor para o armazenamento alocado.Ao se preparar para enviar valores de dados de volta para a fonte de dados (sistema autônomo operações NomeValor e valor), essa função usa DATA_AT_EXEC funcionalidade do ODBC.See Observação técnica 45 para obter mais informações sobre como trabalhar com SQL_LONGVARBINARY e SQL_LONGVARCHARs.
Ao escrever seu próprio RFX_ função, normalmente será possível usar CFieldExchange::padrão para implementar uma determinada operação.Examine a implementação do padrão para a operação em questão.Se realiza a operação você poderia ser escrita em seu RFX_ função que você pode delegado ao CFieldExchange::padrão. Você pode ver exemplos de chamada CFieldExchange::padrão na dbrfx.cpp
É importante telefonar IsFieldType no início de sua função RFX e retornar imediatamente se retornará falso. Esse mecanismo mantém o parâmetro de operações que está sendo executada em outputColumnse vice-versa (como chamar BindParam on an outputColumn).Além disso, IsFieldType automaticamente mantém controle da contagem de outputColumns (m_nFields) e (paramsm_nParams).