Artigo: 190958 - Última revisão: quarta-feira, 2 de Março de 2005 - Revisão: 2.4

EXEMPLO: AOTBLOB ler/escritas BLOB utilizando o modelo OLE DB Consumer

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 | Reduzir tudo

Sumário

O exemplo AOTBLOB demonstra leitura e escrita campos de dados binários longos (BLOB) utilizando as classes ATL OLE DB consumidor modelo. O exemplo contém código para carregar e guardar um ficheiro de mapa de bits para carregar e guardar a imagem de mapa de bits numa tabela da base de dados.

O exemplo também demonstra como solicita ao utilizador para seleccionar uma origem de dados utilizando a caixa de diálogo Microsoft Data Link, da mesma forma como uma procura estabelecer ligação de ODBC.

NOTA: O exemplo cria automaticamente uma tabela chamada BLOB1234 na origem de dados de destino para inserção e a extracção do campo BLOB.

O código de exemplo foi testado com os seguintes fornecedores de OLE DB:
Microsoft Jet 3.51 OLE DB Provider (Msjtor35.dll 3.52.1527.4)
Fornecedor Microsoft OLE DB para Oracle (msdaora.dll 02.00.3002.15)
Fornecedor Microsoft OLE DB para SQL Server (SQLOLEDB.dll 07.00.0502)
Fornecedor Microsoft OLE DB para controladores ODBC (Msdasql.dll 02.00.3002.11)
O exemplo também foi testado com os seguintes controladores ODBC acedidos através de Microsoft OLE DB Provider para controladores ODBC:
Microsoft controlador de ODBC para SQL Server (Sqlsrv32.dll 3.60.0319).
Controlador Microsoft ODBC para Oracle (Msora32.dll 2.573.292700).
Controlador do Microsoft Access (Odbcjt32.dll 3.51.1713)

Mais Informação

Os ficheiros seguintes estão disponíveis para transferência a partir do Centro de transferências da Microsoft:


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

Para obter informações adicionais sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591  (http://support.microsoft.com/kb/119591/EN-US/ ) Como obter ficheiros de suporte da Microsoft a partir de serviços on-line
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada que o ajudam a impedir alterações não autorizadas ao ficheiro.

A ler dados BLOB utilizando os modelos do ATL OLE DB Consumer

O ATL OLE DB consumidor modelo assistente cria uma leitura totalmente funcional-apenas classe indicando um campo de base de dados binário longos (BLOB). Se pretender escrever para o campo binário longo, tem de efectuar modificações a classe assistente-gerado.

Classe um consumidor de OLE DB gerado pelo assistente, o fornecedor preenche automaticamente quaisquer variáveis de membros do campo BLOB com um ponteiro ISequentialStream para a linha actual. Para ler dados do campo BLOB, chamar o método leitura da interface ISequentialStream num ciclo até não mais dados são enviados pelo fornecedor de OLE DB. Tenha em atenção que a maior parte dos fornecedores não fornecerem o comprimento total de dados antes de ler os dados, pelo que terá de criar uma memória intermédia dinamicamente para conter os dados à medida que lê.

Escrever dados BLOB utilizando os modelos do ATL OLE DB Consumer

Para escrever a um campo BLOB, tem de libertar o ponteiro ISequentialStream fornecido pelo fornecedor de OLE DB e substituí-lo por um apontador de ISequentialStream implementar. O fornecedor, em seguida, chama ISequentialStream::Read no apontador de interface até não mais bytes são devolvidos. Esta forma Inverte a função do consumidor e fornecedor. O consumidor fornece ponteiro ISequentialStream, e o fornecedor chama ISequentialStream::Read. Note que alguns fornecedores de OLE DB requerem que indicar mais à frente quantos bytes no campo BLOB quando escreve os dados BLOB. Para trabalhar com fornecedores tantos quanto possível, o exemplo fornece as informações de comprimento para o fornecedor em todos os casos.

Para simplificar a leitura e escrita de dados BLOB com o OLE DB, exemplo AOTBLOB tem uma classe de programa auxiliar denominada CISSHelper. A classe CISSHelper implementa a interface ISequentialStream toda. A classe também tem uma memória intermédia incorporada, o que é utilizada para armazenar e extrair os dados BLOB. Tenha em atenção que o CISSHelper não destruir próprio quando o contagem de versão desce para zero, semelhante a uma interface COM normal. AddRef os Release são deixados na forma a que o fornecedor pode chamá-los, mas este exemplo utiliza uma pilha atribuída objecto e depende do processo de destruição C++ para limpar o objecto.

Para permitir a escrita de um campo BLOB, tem de modificar a macro ATL OLE DB Consumer gerado pelo Assistente de ligação e adicionar suporte para um indicador de comprimento e o estado 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()
				
é necessário o indicador de comprimento para fornecer o comprimento dos dados BLOB ao fornecedor de OLE DB quando escreve o BLOB. Tenha em atenção que a definição da macro BLOB_ENTRY_LENGTH_STATUS incluída no projecto de exemplo AOTBLOB--não está incluído nos ficheiros de cabeçalho ATL para as classes de consumidor ATL OLE DB.

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

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

  1. Abra a classe de consumidor ATL OLE DB modificada.
  2. Mover para o registo pretendido.
  3. Verificar o estado do campo BLOB. Se o indicador de estado do campo BLOB não estiver definido para DBSTATUS_S_OK, poderá ter um campo BLOB nulo. Não utilize o ponteiro de ISequentialStream fornecedor criado se o campo ' estado ' não está definido para DBSTATUS_S_OK; poderá não ser um apontador válido.
  4. Repetir e chamada ISequentialStream::Read em blocos até que os bytes devolvidos ler parâmetro indica todos os dados é lido. Pode processar dados recebidos em blocos dentro do ciclo ou combinar os blocos numa memória intermédia grande para utilização posterior.
  5. Chamar FreeRecordMemory() na classe de modelo para libertar todas as memórias intermédias de campo.
  6. Mover para o registo seguinte, fechar o conjunto de registos e assim sucessivamente.
Para escrever para o campo BLOB, siga estes passos gerais:

  1. Abra a classe de consumidor ATL OLE DB modificada.
  2. Mover para o registo pretendido.
  3. Verificar o estado do campo BLOB. Se o indicador de estado do campo BLOB não estiver definido para DBSTATUS_S_OK, poderá ter um campo BLOB nulo. Se o estado for DBSTATUS_S_OK, tem de chamar versão no IsequentialStream ponteiro dadas pelo fornecedor.
  4. Copiar os dados que pretende inserir no campo BLOB para um CISSHelper objecto de classe. O objecto implementa o método ISequentialStream::Write ajudá-lo aqui.
  5. Definir o indicador de comprimento para o comprimento de dados da CISSHelper objecto de classe.
  6. Defina o indicador de estado para DBSTATUS_S_OK.
  7. Defina o campo de membro BLOB (o ponteiro ISequentialStream) para apontar para o objecto CISSHelper.
  8. Chame o método SetData na classe consumidor para accionar a actualização. Neste momento as chamadas de fornecedor ISequentialStream::Read no CISSHelper classe carregar em todos os dados.
  9. Chamar FreeRecordMemory() na classe consumidor para libertar todas as memórias intermédias de campo.
  10. Mova para o próximo registo, fechar o conjunto de registos e assim sucessivamente.
Note que, se pretender adicionar um novo registo em vez de modificar um registo existente, basta alterar o passo 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )