COMO: Copiar uma imagem a partir de uma base de dados directamente para um controlo PictureBox com o Visual Basic .NET

Traduções de Artigos Traduções de Artigos
Artigo: 317670 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo descreve como copiar uma imagem armazenada numa base de dados directamente num controlo PictureBox num formulário Windows sem ter de guardar a imagem para um ficheiro.

No Microsoft Visual Basic 6.0, a única forma de apresentar uma imagem a partir de uma base de dados num controlo PictureBox , sem o ponto intermédio de guardar os objectos grandes binários {BLOB) dados num ficheiro, deve ligar PictureBox a uma origem de dados como um controlo ActiveX Data Objects (ADO) dados ou objecto Recordset . Não é possível (sem ligação de dados) para carregar programaticamente um BLOB para um controlo sem guardar a imagem para um ficheiro para utilização pela instrução LoadPicture .

Este artigo utiliza o objecto MemoryStream da classe base System.IO para copiar os dados de imagem da base de dados directamente para o controlo PictureBox .

Requisitos

A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs, terá de:
  • Microsoft Visual Studio .NET instalado num sistema operativo Microsoft Windows compatível
  • Uma instância do Microsoft SQL Server ou uma base de dados disponível do Microsoft Access para efeitos de teste disponível
Este artigo pressupõe que está familiarizado com os seguintes tópicos:
  • Aplicações do Visual Basic .NET Windows Forms
  • Armazenamento de objectos grandes binários (BLOB) nas bases de dados
  • Acesso a dados ADO.NET

Exemplo

  1. Criar uma tabela SQL Server ou do Access com a seguinte estrutura:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Inicie o Visual Studio .NET e, em seguida, criar uma nova aplicação Windows Forms Visual Basic.
  3. Arraste um controlo PictureBox e dois controlos do botão da caixa de ferramentas para a predefinição Form1. Definir a propriedade texto de Button1 ao ficheiro de base de dados e, em seguida, defina a propriedade texto do Button2 a base de dados para PictureBox .
  4. Adicionar as seguintes declarações de importação na parte superior do módulo de código do formulário:
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.IO
    Imports System.Drawing.Imaging
    					
  5. Adicionar a declaração seguinte para a cadeia de ligação da base de dados abaixo Pública classe Form1 e, em seguida, modificar a cadeia de ligação conforme necessário para o seu ambiente:
        Dim strCn As String = "Data Source=<server>;" & _
                "Initial Catalog=<database>;Integrated Security=SSPI"
    					
  6. Adicione o seguinte código no procedimento do evento Click de Button1 ( ficheiro de base de dados ). Modifique o caminho de ficheiro para um ficheiro de imagem de exemplo disponível conforme necessário. Este código de ler o ficheiro de imagem a partir do disco (utilizando um objecto de FileStream ) para uma matriz de bytes e, em seguida, insere os dados da base de dados utilizando um objecto de comando com parâmetros.
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("INSERT INTO BLOBTest (BLOBData) " & _
                "VALUES (@BLOBData)", cn)
            Dim strBLOBFilePath As String = _
                "C:\Documents and Settings\All Users\Documents" & _
                "\My Pictures\Sample Pictures\winter.jpg"
            Dim fsBLOBFile As New FileStream(strBLOBFilePath, _
                FileMode.Open, FileAccess.Read)
            Dim bytBLOBData(fsBLOBFile.Length() - 1) As Byte
            fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length)
            fsBLOBFile.Close()
            Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, _
                bytBLOBData.Length, ParameterDirection.Input, False, _
                0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
            cmd.Parameters.Add(prm)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
    					
  7. Adicione o seguinte código no procedimento do evento Click de Button2 ( base de dados para PictureBox ). Este código copia as linhas da tabela BLOBTest na base de dados para um DataSet , cópias mais recentemente adicionadas imagem para uma matriz de bytes e, em seguida, para um objecto MemoryStream e, em seguida, carrega MemoryStream para a propriedade de imagem do controlo PictureBox .
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("SELECT BLOBID, " & _
                "BLOBData FROM BLOBTest ORDER BY BLOBID", cn)
            Dim da As New SqlDataAdapter(cmd)
            Dim ds As New DataSet()
            da.Fill(ds, "BLOBTest")
            Dim c As Integer = ds.Tables("BLOBTest").Rows.Count
            If c > 0 Then
                Dim bytBLOBData() As Byte = _
                    ds.Tables("BLOBTest").Rows(c - 1)("BLOBData")
                Dim stmBLOBData As New MemoryStream(bytBLOBData)
                picBLOB.Image = Image.FromStream(stmBLOBData)
            End If
    					
  8. Execute o projecto.
  9. Clique em ficheiro de base de dados para carregar, pelo menos, uma imagem de exemplo para a base de dados.
  10. Clique em base de dados para PictureBox para apresentar a imagem guardada no controlo PictureBox .
  11. Se pretender inserir a imagem do controlo PictureBox directamente na base de dados, adicionar um terceiro botão de controlo e, em seguida, adicione o código seguinte o procedimento de evento clicar . Este código obtém os dados imagem do controlo PictureBox num objecto MemoryStream copia MemoryStream para uma matriz de bytes e, em seguida, guarda a matriz de bytes para a base de dados utilizando um objecto de comando com parâmetros.
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("INSERT INTO BLOBTest (BLOBData) " & _
                "VALUES (@BLOBData)", cn)
            Dim ms As MemoryStream = New MemoryStream()
            picBLOB.Image.Save(ms, ImageFormat.Jpeg)
            Dim bytBLOBData(ms.Length - 1) As Byte
            ms.Position = 0
            ms.Read(bytBLOBData, 0, ms.Length)
            Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, _
                bytBLOBData.Length, ParameterDirection.Input, False, _
                0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
            cmd.Parameters.Add(prm)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
    					
  12. Execute o projecto. Clique em base de dados para PictureBox para apresentar uma imagem guardada anteriormente no controlo PictureBox . Clique no botão recentemente para guardar a imagem de PictureBox na base de dados e, em seguida, clique em base de dados para PictureBox novamente para confirmar que a imagem foi guardada correctamente.

Resolução de problemas

  • Este teste não funcionará com a coluna fotografias na tabela empregados dos dados de exemplo Adamastor distribuídos com o Access e SQL Server. As imagens de mapa de bits armazenadas na coluna fotografias são moldadas com as informações de cabeçalho criada pelo controlo do Visual Basic 6.0 OLE contentor.
  • Se necessitar de utilizar uma base de dados do Access para testar este código, tem de criar a coluna na tabela do Access como tipo de Objecto OLE e utilizar o espaço de nomes System.data.OLEDB com o fornecedor Microsoft Jet 4.0 em vez do espaço de nomes System.data.SqlClient .

Referências

Para obter informações adicionais sobre como utilizar dados do BLOB com Visual Basic. NET, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
308042COMO: Ler e escrever dados BLOB utilizando ADO.NET com o Visual Basic .NET
316887COMO: Ler e escrever um ficheiro de e para uma coluna BLOB utilizando o ADO.NET e Visual Basic .NET

Propriedades

Artigo: 317670 - Última revisão: 5 de setembro de 2003 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbdraw kbgdi kbhowtomaster kbio kbsqlclient kbsystemdata KB317670 KbMtpt
Traduçã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: 317670

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com