Compartilhar via


TN045: Suporte a MFC/banco de dados para varchar/varbinary Long

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 como recuperar e enviar o ODBC SQL_LONGVARCHAR and SQL_LONGVARBINARY os tipos de dados usando o MFC classes de banco de dados.

Visão geral de longo varchar/varbinary suporte

O ODBC SQL_LONG_VARCHAR and SQL_LONGBINARY dados tipos (chamados aqui sistema autônomo colunas de dados long) pode Isenção enormes quantidades de dados.Há maneiras de 3, você pode manipular esses dados:

  • BIND it to a CString/CByteArray.

  • BIND it to a CLongBinary.

  • Não vinculá-lo em todos os e recuperar e enviar o valor de dados longo manualmente, independente de classes de banco de dados.

Cada um dos três métodos tem vantagens e desvantagens.

Não há suporte para colunas de dados longo para os parâmetros a uma consulta.Eles só tem suporte para outputColumns.

Vinculando a dados coluna longo a um CString/CByteArray

Vantagens:

Essa abordagem é simples de entender e trabalhar com classes familiares.A estrutura oferece CFormView suporte para CString com DDX_Text. Você tiver uma grande quantidade de funcionalidade geral de seqüência de caracteres ou a coleção com o CString e CByteArray classes e você pode controlar a quantidade de memória alocada localmente para Isenção o valor de dados. A estrutura mantém uma cópia antiga dos dados do campo durante edição or AddNew chamadas de função e estrutura podem detectar automaticamente as alterações feitas nos dados para você.

Observação:

Desde CString desenvolvidas para trabalhar nos dados de caractere, e CByteArray para trabalhar em dados binário, é recomendável que você coloque o caractere () dadosSQL_LONGVARCHAR) em CStringe (dados binárioSQL_LONGVARBINARY) em CByteArray.

As funções RFX para CString e CByteArray tem um argumento adicional que permite ignorar o dimensionar padrão de memória alocada para conter o valor da coluna de dados recuperado. Observe o argumento nMaxLength as seguintes declarações de função:

void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
    CString& value, int nMaxLength = 255, int nColumnType =
    SQL_VARCHAR);

void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, 
    CByteArray& value,int nMaxLength = 255);

Se você recuperar uma coluna de dados longo em um CString ou CByteArray, retornado a máxima quantidade de dados é, por padrão, 255 bytes. Qualquer coisa além desse será ignorada.Nesse caso, a estrutura lança a exceção AFX_SQL_ERROR_DATA_TRUNCATED.Felizmente, você pode aumentar explicitamente nMaxLength valores maior, até MAXINT.

Observação:

O valor de nMaxLength é usado pelo MFC para conjunto o buffer do local a SQLBindColumn função.Este é o buffer local para o armazenamento de dados e, na verdade, não afeta a quantidade de dados retornados pelo driver ODBC.RFX_Text e RFX_Binary apenas fazer uma telefonar usando SQLFetch para recuperar os dados do banco de dados back-participante.Cada driver ODBC tem uma limitação diferente da quantidade de dados, que eles podem retornar em uma única busca.Esse limite pode ser muito menor do que o valor conjunto em nMaxLength, caso em que a exceção AFX_SQL_ERROR_DATA_TRUNCATED será lançada.Sob essas circunstâncias, comutador para o uso de RFX_LongBinary em vez de RFX_Text ou RFX_Binary para que todos os dados podem ser recuperados.

Será ClassWizard BIND um SQL_LONGVARCHAR to a CString, ou um SQL_LONGVARBINARY to a CByteArray para você. Se você deseja alocar mais de 255 bytes, no qual você recupera sua coluna de dados longos, em seguida, você pode fornecer um valor explícito para nMaxLength.

Quando uma coluna de dados long é limite para um CString ou CByteArray, atualizar o campo funciona da mesma sistema autônomo quando está limite para um SQL_VARCHAR or SQL_VARBINARY.Durante edição, o valor de dados é armazenada em cache imediatamente e posteriormente quando comparados Atualização é chamado para detectar alterações para o valor de dados e conjunto o Dirty e nulo valores para a coluna apropriadamente.

Vinculando a dados coluna longo a um CLongBinary

Se a coluna de dados longo pode conter mais de MAXINT bytes de dados, provavelmente considere recuperá-lo em um CLongBinary.

Vantagens:

Recupera uma coluna de dados inteiro longo, com a memória disponível.

Desvantagens:

Os dados são mantidos na memória.Essa abordagem também é muito cara para grandes quantidades de dados.Você deve telefonar SetFieldDirty para os dados acoplados membro para garantir que o campo está incluído em um Atualização operação.

Se você recuperar colunas de dados longo em um CLongBinary, as classes de banco de dados Verifique o dimensionar total da coluna de dados longo e alocar uma HGLOBAL segmento de memória grande o suficiente para Isenção ela o valor de dados inteiro. As classes de banco de dados, em seguida, recupere o valor de dados inteiro para o alocado HGLOBAL.

Se a fonte de dados não pode retornar o dimensionar esperado da coluna de dados longos, a estrutura lança a exceção AFX_SQL_ERROR_SQL_NO_TOTAL.Se a tentativa de alocar o HGLOBAL falhar, uma exceção de memória padrão é lançada.

ClassWizard vinculará um SQL_LONGVARCHAR or SQL_LONGVARBINARY to a CLongBinary para você. selecionar CLongBinary sistema autônomo o tipo de variável na caixa de diálogo Adicionar variável de membro. ClassWizard adicionará um RFX_LongBinary telefonar para o DoFieldExchange Ligue e incrementar o número total de campos acoplados.

Para atualizar valores de coluna de dados longos, certifique-se primeiro o alocado HGLOBAL é grande o suficiente para manter seus dados novos, chamando :: GlobalSize on the m_hData membro de CLongBinary. Se for muito pequena, liberar o HGLOBAL e aloque um dimensionar apropriado. Em seguida, conjunto m_dwDataLength para refletir o novo dimensionar.

Caso contrário, se m_dwDataLength é maior do que o dimensionar dos dados que você está substituindo, você pode liberar e realocar o HGLOBAL, ou deixe-alocada. Certifique-se de indicar o número de bytes realmente usados em m_dwDataLength.

Atualizando como um CLongBinary funciona

Não é necessário compreender sistema autônomo atualizar um CLongBinary funciona, mas pode ser útil sistema autônomo um exemplo sobre sistema autônomo enviar valores de dados longo com uma fonte de dados, se você escolher esse método de terceiro, descrito abaixo.

Observação:

Para que um CLongBinary campo a ser incluído em uma atualização, você deve explicitamente telefonar SetFieldDirty para o campo. Se você fizer qualquer alterar em um campo, incluindo a definição de nulo, você deverá telefonar SetFieldDirty. Você também deve chamar SetFieldNull, sendo o segundo parâmetro FALSE, para marcar o campo sistema autônomo tendo um valor.

Ao atualizar um CLongBinary campo, as classes de banco de dados usam do ODBC DATA_AT_EXEC mecanismo (consulte a documentação do ODBC no SQLSetPos do rgbValue argumento).Quando a estrutura prepara a demonstrativo de inserção ou atualização, em vez de apontar para o HGLOBAL que contém sistema autônomo dados a endereço of the CLongBinary é definido sistema autônomo o valor da coluna em vez disso, e o indicador de tamanho definido sistema autônomo SQL_DATA_AT_EXEC.Mais tarde, quando a demonstrativo de atualização é enviada para a fonte de dados, SQLExecDirect retornará SQL_NEED_DATA.Isso avisa que a estrutura que o valor de parâmetro para esta coluna é na verdade, o endereço de um CLongBinary. A estrutura chama SQLGetData uma vez com um buffer pequeno, esperando o driver para retornar o tamanho real dos dados.Se o driver retorna o comprimento real do objeto grande binário (BLOB), o MFC Realoca sistema autônomo espaço sistema autônomo necessário buscar BLOB.Se a fonte de dados retorna SQL_NO_TOTAL, indicando que ele não é possível determinar o dimensionar do BLOB, MFC criará blocos menores.O dimensionar inicial do padrão é 64 K e blocos subseqüentes será duas vezes o dimensionar; por exemplo, a segunda será 128 K, o terceiro é 256 K e assim por diante.O dimensionar inicial é configurável.

Vinculação não: Recuperando/enviando dados diretamente do ODBC com SQLGetData

Com esse método você completamente ignora as classes de banco de dados e lida com a coluna de dados longos.

Vantagens:

Você pode armazenar em cache os dados se for necessário em disco ou decidir dinamicamente a quantidade de dados para recuperar.

Desvantagens:

Você não obtiver edição or AddNew suporte e você deve escrever código para executar a funcionalidade básica (Excluir funciona, pois não é uma operação de nível de coluna).

Nesse caso, a coluna de dados longo deve ser na selecionar lista do conjunto de registros, mas não deve estar acoplado a pela estrutura.Uma maneira de fazer isso é fornecer sua própria demonstrativo SQL por meio de GetDefaultSQL ou, sistema autônomo o argumento lpszSQL CRecordset'sistema autônomo em aberto função e não BIND a coluna com uma telefonar de função RFX_ extra.ODBC requer que un limite campos aparecem à direita do limite campos, portanto, adicione seu un limite ou mais colunas para o participante da lista de seleção.

Observação:

Porque a coluna de dados longo não está ligada pela estrutura, as alterações não serão tratadas com CRecordset::Update chamadas. Você deve criar e enviar o SQL necessário INSERIR and ATUALIZAÇÃO instruções por conta própria.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria