ID do artigo: 190958 - Última revisão: quarta-feira, 2 de março de 2005 - Revisão: 2.4

EXEMPLO: Leitura/gravações AOTBLOB BLOB usando OLE DB consumidor modelo

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

O exemplo AOTBLOB demonstra leitura e gravação de campos de dados binário longo (BLOB) usando as classes ATL OLE DB consumidor Template. O exemplo contém código para carregar e salvar um arquivo de bitmap e para carregar e salvar a imagem de bitmap em uma tabela de banco de dados.

O exemplo também demonstra como solicitar que o usuário selecione uma fonte de dados usando a caixa de diálogo Microsoft Data Link, da mesma maneira como uma procura conectar-se em ODBC.

Observação: O exemplo cria automaticamente uma tabela denominada BLOB1234 na fonte de dados destino para extração do campo BLOB e inserção.

O código de exemplo foi testado com os seguintes provedores OLE DB:
Provedor do Microsoft Jet 3.51 OLE DB (Msjtor35.dll 3.52.1527.4)
Microsoft OLE DB Provider para Oracle (msdaora.dll 02.00.3002.15)
Microsoft OLE DB Provider para SQL Server (SQLOLEDB.dll 07.00.0502)
Microsoft OLE DB Provider para ODBC drivers (MSDASQL.dll 02.00.3002.11)
O exemplo também foi testado com os seguintes drivers ODBC acessados através do provedor Microsoft OLE DB para drivers ODBC:
Driver ODBC Microsoft SQL Server (Sqlsrv32.dll 3.60.0319).
Driver Microsoft ODBC para Oracle (Msora32.dll 2.573.292700).
Driver do Microsoft Access (Odbcjt32.dll 3.51.1713)

Mais Informações

Os seguintes arquivos estão disponíveis para download no Centro de download da Microsoft:


Aotblob.exe (http://download.microsoft.com/download/vc60ent/sample3/1/win98/en-us/aotblob.exe)

Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Lendo dados BLOB usando os modelos de consumidor de banco de dados de OLE do ATL

O ATL OLE DB consumidor Assistente de modelo cria uma leitura totalmente funcional-somente classe que lê um campo de banco de dados (BLOB) binário longo. Se você quiser gravar para o campo binário longo, você deve fazer modificações à classe Assistente-gerado.

Uma classe de consumidor do gerado pelo Assistente OLE DB, o provedor preenche automaticamente quaisquer variáveis de membro de campo BLOB com um ponteiro ISequentialStream para a linha atual. Para ler dados do campo BLOB, você chama o método de leitura da interface ISequentialStream em um loop até que não há mais dados são enviados pelo provedor OLE DB. Observe que a maioria dos provedores não fornecer você com o comprimento total de dados antes de ler os dados, para que você deve criar um buffer dinamicamente para armazenar os dados como você lê-lo.

Gravar dados BLOB usando os modelos de consumidor de banco de dados de OLE do ATL

Para escrever a um campo BLOB, você deve liberar o ponteiro ISequentialStream fornecido a você pelo provedor OLE DB e substituí-lo por um ponteiro ISequentialStream que você implementar. O provedor chama ISequentialStream::Read, em seguida, o ponteiro de interface até que não mais bytes são retornados. Isso de maneira inverte a função do consumidor e provedor. O consumidor fornece ponteiro ISequentialStream, e o provedor chama ISequentialStream::Read. Observe que certos provedores OLE DB exigem que você indica com antecedência como muitos bytes são no campo BLOB quando você escreve os dados BLOB. Para trabalhar com provedores tantas quanto possível, o exemplo fornece as informações comprimento para o provedor em todos os casos.

Para simplificar a leitura e gravação de dados BLOB com OLE, o exemplo de AOTBLOB tem uma classe auxiliar chamada CISSHelper. A classe CISSHelper implementa toda a interface ISequentialStream. A classe também tem um buffer interno, que é usado para armazenar e extrair os dados BLOB. Observe que o CISSHelper não destrói próprio quando sua contagem de versão cai para zero, semelhante a uma interface COM típica. O AddRef e Release são deixados para que o provedor pode chamá-los, mas este exemplo usa uma pilha alocada objeto e depende do destruidor C++ para limpar o objeto.

Para permitir gravação em um campo BLOB, você deve modificar a macro ATL OLE DB consumidor gerado pelo Assistente para vinculação e adicionar suporte para um indicador de comprimento e o status do campo como abaixo:
   // Before:

   BEGIN_COLUMN_MAP(...)
   // Various fields..
      BLOB_ENTRY(2, IID_ISequentialStream,STGM_READ, m_BLOBDATA)
   // Various fields...
   END_COLUMN_MAP()

   // After:
   ULONG m_BLOBDATA_LENGTH;
   ULONG m_BLOBDATA_STATUS;

   BEGIN_COLUMN_MAP(...)
   // Various fields...
      BLOB_ENTRY_LENGTH_STATUS(2, IID_ISequentialStream, \ 
                               STGM_READ, m_BLOBDATA, \ 
                m_BLOBDATA_LENGTH, m_BLOBDATA_STATUS)
   // Various fields...
   END_COLUMN_MAP()
				
o indicador de comprimento é necessário para fornecer o comprimento dos dados BLOB para o provedor OLE DB quando você grava o BLOB. Observe que a definição da macro BLOB_ENTRY_LENGTH_STATUS está incluída no projeto de exemplo AOTBLOB--não está incluído nos arquivos de cabeçalho ATL para as classes de consumidor ATL OLE DB.

Sem modificações adicionais para os modelos gerado pelo assistente são necessários.

Ler a partir do campo BLOB usando um modificado (comprimento e status adicionado) consumidor modelo de classe, siga esta fórmula básica:

  1. Abra sua classe de consumidor ATL OLE modificado.
  2. Mova para o registro desejado.
  3. Verificar o status do campo BLOB. Se o indicador de status do campo BLOB não estiver definido como DBSTATUS_S_OK, talvez seja necessário um campo nulo BLOB. Não use o ponteiro de ISequentialStream provedor criado se o campo status não for definido como DBSTATUS_S_OK; talvez não seja um ponteiro válido.
  4. Loop e chamada ISequentialStream::Read em blocos até os bytes retornados ler parâmetro indica todos os dados é lido. Você pode processar os dados de entrada em blocos de dentro do loop ou combinar os blocos em um buffer grande para uso posterior.
  5. Chame FreeRecordMemory() na classe de modelo para liberar todos os buffers de campo.
  6. Mover para o próximo registro, feche o conjunto de registros e assim por diante.
Para gravar o campo BLOB, execute estas etapas gerais:

  1. Abra sua classe de consumidor ATL OLE modificado.
  2. Mova para o registro desejado.
  3. Verificar o status do campo BLOB. Se o indicador de status do campo BLOB não estiver definido como DBSTATUS_S_OK, talvez seja necessário um campo nulo BLOB. Se o status for DBSTATUS_S_OK, você deve chamar versão no IsequentialStream ponteiro fornecido pelo provedor.
  4. Copiar os dados que deseja inserir no campo BLOB em um CISSHelper objeto de classe. O objeto implementa o método ISequentialStream::Write para ajudá-lo aqui.
  5. Defina o indicador de comprimento no comprimento dos dados o CISSHelper objeto de classe.
  6. Defina o indicador de status como DBSTATUS_S_OK.
  7. Defina o campo de membro BLOB (o ponteiro ISequentialStream) para apontar para o objeto CISSHelper.
  8. Chame o método SetData na classe de consumidor para acionar a atualização. Neste momento as chamadas de provedor ISequentialStream::Read no CISSHelper classe para carregar em todos os dados.
  9. Chame FreeRecordMemory() na classe consumidor para liberar todos os buffers de campo.
  10. Mova para gravar em seguida, feche o conjunto de registros e assim por diante.
Observe que se você quiser adicionar um novo registro em vez de modificar um registro existente, basta alterar a etapa 7 acima para chamar Insert() em vez de SetData().

A informação contida neste artigo aplica-se a:
  • Microsoft OLE DB 2.7 nas seguintes plataformas
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbdownload kbconsumer kbdatabase kbdtl kbfile kbhowto KB190958 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 190958  (http://support.microsoft.com/kb/190958/en-us/ )