Como mostrar uma imagem a partir de uma base de dados de uma PictureBox de formulários do Windows utilizando o Visual Basic .NET

Traduções de Artigos Traduções de Artigos
Artigo: 321900 - 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 apresentar uma imagem é armazenada numa base de dados num controlo num formulário Windows PictureBox .

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 dados de objectos grandes binários (BLOB) para um ficheiro, é associar PictureBox a uma origem de dados como, por exemplo, um controlo de ActiveX Data Objects (ADO) de dados ou objecto Recordset . Sem ligação de dados, não pode carregar programaticamente um BLOB de um controlo sem guardar a imagem para um ficheiro para a instrução LoadPicture a utilizar.

O exemplo neste artigo utiliza uma matriz de bytes e o objecto MemoryStream da classe base System.IO para copiar os dados de imagem da base de dados directamente de um objecto ADO.NET DataSet ou DataReader ao controlo PictureBox .

Requisitos

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

Criar o exemplo de .NET do Visual Basic

  1. Criar uma tabela do SQL Server ou uma tabela do Access com a seguinte estrutura:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Siga estes passos para criar um novo Visual Basic Windows Forms aplicação:
    1. Inicie o Visual Studio NET..
    2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
    3. Na caixa de diálogo Novo projecto , clique em Projectos do Visual Basic em Project Types e, em seguida, clique em Aplicação do Windows em modelos .
  3. Arraste um controlo PictureBox e dois controlos do botão da caixa de ferramentas para o formulário predefinido, Form1. Altere a propriedade Name do PictureBox para picBlob . 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 instruções importações na parte superior do módulo de código de Form1:
    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 e modifique o caminho de ficheiro para um ficheiro de imagem de exemplo disponível conforme necessário:
            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()
    						
    este código utiliza um objecto de FileStream para ler o ficheiro de imagem do disco para uma matriz de bytes e, em seguida, utiliza um objecto de comando com parâmetros para inserir os dados na base de dados.
  7. Adicione o seguinte código no procedimento do evento Click de Button2 :
            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
    						
    este código copia as linhas da tabela BLOBTest na base de dados num objecto DataSet , copia a imagem que é adicionada recentemente uma matriz de bytes e, em seguida, num objecto MemoryStream e, em seguida, carrega MemoryStream para a propriedade de imagem do controlo PictureBox .
  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 que guardou no controlo PictureBox .
  11. Para obter a imagem num objecto DataReader em vez de um objecto de DataSet , modifique o código no procedimento do evento Click de Button2 da seguinte forma:
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("SELECT BLOBID, " & _
                "BLOBData FROM BLOBTest ORDER BY BLOBID", cn)
            Dim dr As SqlDataReader
            cn.Open()
            dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            If dr.Read Then
                Dim bytBLOBData(dr.GetBytes(1, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte
                dr.GetBytes(1, 0, bytBLOBData, 0, bytBLOBData.Length)
                Dim stmBLOBData As New MemoryStream(bytBLOBData)
                picBLOB.Image = Image.FromStream(stmBLOBData)
            End If
            dr.Close()
    					
  12. Para inserir a imagem do controlo PictureBox directamente numa base de dados, adicione um terceiro botão de controlo ( Button3 ) ao formulário. Definir a propriedade texto de Button3 para PictureBox à base de dados e, em seguida, adicione o seguinte código no procedimento do evento Click de Button3 :
            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()
    						
    este código obtém os dados imagem do controlo PictureBox num objecto MemoryStream , copia MemoryStream para uma matriz de bytes e, em seguida, utiliza um objecto de comando com parâmetros para guardar a matriz de bytes para a base de dados.
  13. Execute o projecto. Clique em base de dados para PictureBox para apresentar uma imagem que guardou anteriormente no controlo PictureBox .
  14. Clique em PictureBox à base de dados para guardar a imagem de PictureBox à base de dados e clique em base de dados para PictureBox novamente para confirmar que a imagem é guardada correctamente.

Resolução de problemas

  • Este teste não funciona com a coluna fotografias na tabela empregados da base de exemplo Adamastor dados incluída no Access e SQL Server. As imagens de mapa de bits que são armazenadas na coluna fotografias são moldadas com as informações de cabeçalho que cria o controlo do Visual Basic 6.0 OLE contentor .
  • Para 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, em seguida, 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 .
  • Consumir uma grande quantidade de sobrecarga de memória se obter todas as imagens de uma tabela para o DataSet . Para consumir menos custos geral, deixe as imagens na base de dados e obter os um de cada vez que mova através do DataSet . Para o fazer, executar uma consulta parametrizada para obter a imagem que pretende para um DataReader e, em seguida, carregar a imagem do DataReader em PictureBox .

Referências

Para obter informações adicionais sobre como utilizar dados do BLOB com o Visual Basic. NET, clique os números de artigo existente abaixo para visualizar os artigos 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: 321900 - Última revisão: 15 de julho de 2004 - Revisão: 2.2
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 kbhowtomaster kbsqlclient kbsystemdata KB321900 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: 321900

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